Перейти к основному содержимому

Особенности использования пакета в ArduinoIDE

Цифровые выводы

В отличие от стандартного функционала Arduino на платах, входящих в состав пакета, невозможно управлять притяжками цифрового вывода, настроенного на вход, с помощью функции void digitalWrite(uint32_t PinNumber, uint32_t Val). Для включения притяжки к питанию необходимо воспользоваться функцией pinMode(PinNumber, INPUT_PULLUP).
Доступна возможность конфигурирования цифрового вывода на вход с притяжкой к земле, для этого необходимо использовать макрос INPUT_PULLDOWN - pinMode(PinNumber, INPUT_PULLDOWN).
Для инвертирования состояния цифровых выводов доступна функция void digitalToggle(uint32_t PinNumber).

Аналоговые выводы

АЦП

Встроенный в MIK32 АЦП обладает разрешением 12 бит, однако по умолчанию в Arduino IDE применяется разрешение 10 бит. С помощью функции void analogReadResolution(uint8_t resolution) можно изменять разрешение в диапазоне от 1 до 32 бит.
Функция uint32_t analogRead(uint32_t PinNumber) возвращает результаты измерения после усреднения по 10 значениям.
Номера выводов, поддерживающих АЦП, отличаются для каждой платы и перечислены в их описаниях.

ШИМ

По умолчанию частота сформированного ШИМ-сигнала составляет 1 кГц. Функция void analogWriteFrequency(uint32_t freq) позволяет изменить частоту сигнала в диапазоне от 1 Гц до 1 МГц.
По умолчанию разрешение, используемое в функции void analogWrite(uint32_t PinNumber, uint32_t writeVal), составляет 8 бит. Функция void analogWriteResolution(uint8_t resolution) позволяет изменить разрешение в диапазоне от 1 до 32 бит.
Остановить генерацию ШИМ-сигнала можно, вызвав функцию void analogWriteStop(uint32_t PinNumber) или функции void digitalWrite(uint32_t PinNumber, uint32_t Val)/int digitalRead(uint32_t PinNumber).
Номера выводов, поддерживающих ШИМ, отличаются для каждой платы и перечислены в их описаниях.

Прерывания

Платы, входящих в состав пакета, позволяют использовать прерывания, настраиваемые функцией void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode). Номера выводов, поддерживающих прерывания, отличаются для каждой платы и перечислены в их описаниях.
Для получения номера прерывания по номеру вывода существует функция int8_t digitalPinToInterrupt(uint32_t digPinNumber).

В микроконтроллере MIK32 предусмотрен всего один вектор прерывания. Когда срабатывает прерывание от любого источника, общая функция-обработчик последовательно проверяет все возможные источники и, при необходимости, вызывает соответствующие обработчики конкретных модулей. Поэтому важно, чтобы функции, вызываемые при прерываниях, были небольшими и обеспечивали максимально быстрое завершение обработки. Это позволит избежать задержек и снизит риск пропуска последующих прерываний.
Общая функция-обработчик прерываний располагается в RAM памяти. Это позволяет устранить задержки, связанные с кэшированием при работе из FLASH памяти. Обработчики прерываний, назначаемые на цифровые выводы с помощью функции void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode), и обработчик прерывания для функции tone() так же располагаются в памяти RAM.

Глобальное разрешение прерываний активируется после завершения функции setup(). Если необходимо использовать прерывания внутри самой функции setup(), их можно включить вручную, вызвав функцию interrupts() перед вызовом функций, работающих с прерываниями. Прерывания используются для приема данных модулями Serial, Wire, для работы библиотеки Servo, функцией tone().

В пакете поддержки доступна возможность дополнения или замены стандартного обработчика прерываний пользовательской функцией-обработчиком. Для этого в своем скетче необходимо определить функцию extern "C" bool ISR(), она вызывается первой в стандартном обработчике. Внутри функции можно проверять флаги прерываний и реагировать на нужные. Важно очищать флаги обрабатываемых прерываний, чтобы обработчик работал корректно.
Если функция возвращает false, после ее выполнения так же будет выполнен код стандартного обработчика прерываний. Если функция возвращает true, выполнение кода стандартного обработчика будет пропущено.
Пользовательскую функцию необходимо располагать в RAM памяти, так как стандартный обработчик прерываний расположен именно там.
Ниже приведен пример пользовательского обработчика прерывания по переполнению от 16-битного таймера 1:

extern "C" __attribute__((section(".ram_text"))) bool ISR(void)
{
// обработка прерывания от 16-битного таймера
if (EPIC_CHECK_TIMER16_1())
{
if (TIM16_GET_ARRM_INT_STATUS(htimer16_1_))
{
// необходимые действия при переполнении таймера
}
// очистить флаги прерывания от таймера 1
TIM16_CLEAR_INT_MASK(htimer16_1_, 0xFFFFFFFF);
}
return false;
}

Для корректной работы функции из примера необходимо подключить в скетче следующие файлы:

#include "mik32_hal_timer16.h"
#include "wiring_LL.h"

Serial

Для работы доступно два последовательных интерфейса. Нулевой интерфейс используется экземпляром класса Serial. Информации в Монитор порта в Arduino IDE поступает через него. Первый интерфейс используется экземпляром класса Serial1. Выводы, на которых доступны указанные интерфейсы, перечислены в описании отдельных плат.
Доступны следующие макросы для настройки режима работы каждого интерфейса в функции Serial.begin():

  • SERIAL_7N1,
  • SERIAL_8N1,
  • SERIAL_7N2,
  • SERIAL_8N2,
  • SERIAL_7E1,
  • SERIAL_8E1,
  • SERIAL_7E2,
  • SERIAL_8E2,
  • SERIAL_7O1,
  • SERIAL_8O1,
  • SERIAL_7O2,
  • SERIAL_8O2.

Здесь длина данных - 7 или 8 бит; бит четности - нет(N), четный(E), нечетный(O); стоп бит - 1 или 2 бита.

Переопределение функции main

В ArduinoIDE доступна возможность определить пользовательскую функцию main() в скетче. Для этого необходимо удалить из скетча функции setup() и loop() и определить свою функцию int main(void){}. Чтобы весь функционал пакета поддержки работал корректно, перед заходом в бесконечный цикл необходимо вызвать функцию post_init(), внутри которой глобально разрешаются прерывания. Пример переопределения представлен ниже.

main_redefine_example

Предупреждения об ошибках

Если в скетче используется интерфейс Serial, при возникновении ошибок при использовании какой-либо функции из пакета в порт может передаваться сообщение об этой ошибке с пояснением. Например, если в функцию будет передан некорректный номер цифрового вывода, предупреждение об этом появится в подключенном com порту.
По умолчанию вывод предупреждений включен. Если интерфейс Serial используется для коммуникации с другим устройством, вывод предупреждений можно отключить. Для этого в самом начале функции void setup() необходимо вызвать макрос DISABLE_ERROR_MESSAGES();. Вывод предупреждений можно включить обратно, вызвав макрос ENABLE_ERROR_MESSAGES(); в любом месте программы.

Библиотеки, входящие в состав пакета

Входящие в состав пакета библиотеки используют периферию микроконтроллера MIK32 Амур и/или адаптированы для работы с ним.

БиблиотекаОписаниеЗаметки
SPIБиблиотека для работы с интерфейсом SPIДля работы доступно два экземпляра класса - SPI (используется аппаратный SPI1) и SPI1 (используется аппаратный SPI0). Выводы, на которых доступны интерфейсы, перечислены в описании каждой платы. Доступные делители частоты - SPI_CLOCK_DIV2, SPI_CLOCK_DIV4, SPI_CLOCK_DIV8, SPI_CLOCK_DIV16, SPI_CLOCK_DIV32, SPI_CLOCK_DIV64, SPI_CLOCK_DIV128, SPI_CLOCK_DIV256, обеспечивают частоту работы от 125 кГц до 16 МГц. Скорость работы по умолчанию - 4 МГц. Для задания режима и скорости работы рекомендуется использовать SPISettings(uint32_t speedMaximum, uint8_t dataOrder, uint8_t dataMode), а не соответствующие отдельные функции
WireБиблиотека для работы с интерфейсом I2CДля работы используется встроенный I2C1. Доступные частоты работы интерфейса: 100 кГц (WIRE_FREQ_100K), 400 кГц (WIRE_FREQ_400K), 1000 кГц (WIRE_FREQ_1000K). Скорость работы по умолчанию - 100 кГц. В режиме работы в качестве ведомого устройства функции, заданные через void onReceive( void (*)(int) и void onRequest( void (*)(void) ), выполняются в прерывании
SoftwareSerialБиблиотека, реализующая программный последовательный интерфейс.Доступные скорости работы - от 300 до 57600 бод. Для отправки данных (TX) можно использовать любой цифровой вывод. Для приема данных (RX) можно использовать только выводы, поддерживающие прерывания. Обработчик прерывания и связанные с ним функции располагаются в памяти RAM
EEPROMБиблиотека для работы с памятью EEPROMДля использования доступно 1024 байта встроенной EEPROM памяти. Для корректной работы библиотеки обязательно вызывать функцию void EEPROM.begin() перед началом работы с памятью
ServoБиблиотека для работы с сервоприводомБиблиотека использует 16-битный таймер 2 и прерывания от него. Любой цифровой вывод подходит для управления сервоприводом. Одновременно можно использовать до 12 сервоприводов. Для работы библиотеки используется таймер timer16_2
NeoPixelБиблиотека для работы с адресными светодиодамиФункция, выводящая состояние пикселей на цифровой вывод платы, перенесена в память RAM для корректной работы на MIK32 Амур
MFRC522Библиотека для работы с RFID картамиИсправлен баг, вызывающий ошибку компиляции в новых компиляторах gcc
OneWireБиблиотека для работы с интерфейсом 1-WireВ стандартную библиотеку добавлена поддержка микроконтроллера MIK32 Amur
IRremoteБиблиотека позволяет отправлять и принимать инфракрасные сигналы, используя определенный набор протоколовВ стандартную библиотеку добавлена поддержка микроконтроллера MIK32 Amur. При приеме данных используется прерывание таймера timer16_0, работает с любым цифровым выводом. Для отправки данных с помощью встроенного ШИМ для плат Elbear Ace-Uno используется вывод D3, для платы START-MIK32 - вывод P0_0
FreeRTOSБиблиотека для работы с операционной системой реального времени FreeRTOSВ стандартную библиотеку добавлена поддержка микроконтроллера MIK32 Amur. Период системного тика составляет 10 мс и формируется с помощью машинного таймера SysTick

Режим отладки в ArduinoIDE 2

внимание

Данная инструкция проверена и работает с версией Arduino IDE версии 2.3.4 на Windows 10 x64. На других версиях Arduino IDE работоспособность неизвестна. Функция отладки является экспериментальной.

Начиная с версии пакета 0.5.0 для всех плат, входящих в состав пакета, доступен режим отладки скетчей. Для отладки плат ELBEAR ACE-UNO, ELBEAR ACE-NANO, ELSOMIK понадобится программатор ELJTAG. Плата START-MIK32 содержит встроенный программатор, для использования которого необходимо передвинуть переключатель режима программатора на плате в положение JTAG.
Режим отладки доступен в ArduinoIDE версии 2 и выше.

Предварительная подготовка

Для отладки в Arduino IDE используется плагин Cortex-Debug. По умолчанию в IDE установлена версия 1.5.1, но с указанной версией режим отладки для плат из состава пакета работает некорректно. Для корректной работы необходимо использовать более новую версию плагина.
Для подготовки к работе в режиме отладки необходимо сделать следующее:

  • Установить драйвера для работы с программатором, если ранее они не были установлены. Подробности можно найти в разделе Запуск ELBEAR с программатором ELJTAG или в документации по плате START-MIK32.
  • Скачать архив, содержащий необходимую версию Cortex-Debug и все его зависимости.
  • Содержимое архива переместить в папку plugins из папки с установленной ArduinoIDE. Примерный путь - C:\Program Files\Arduino IDE\resources\app\plugins. Содержимое архива (несколько файлов с расширением .vsix) разместить в указанной папке, не создавая промежуточных папок.
  • Запустить ArduinoIDE и по инструкции, описанной ниже, запустить режим отладки.
  • Удостовериться, что при запуске отладки в первой строке консоли отладки отображается нужная версия плагина - 1.12.1: Cortex-Debug: VSCode debugger extension version 1.12.1 git(652d042). Usage info: https://github.com/Marus/cortex-debug#usage

После установки новой версии плагина в строке меню и в области вывода информации появятся две новые вкладки - MEMORY и xRTOS. Это плагины, которые необходимы для работы Cortex-Debug. Они не используются непосредственно пользователем при работе, но удалять их нельзя, иначе режим отладки с установленной версией Cortex-Debug не запустится.

Запуск отладки

Последовательность действий для запуска режима отладки:

  1. В ArduinoIDE открыть скетч, который необходимо запустить в режиме отладки.
  2. Выбрать нужную плату - Инструменты -> Плата.
  3. Подключить плату к ПК через программатор. Для плат ELBEAR ACE-UNO, ELBEAR ACE-NANO, ELSOMIK использовать ELJTAG. На плате START-MIK32 передвинуть переключатель режима программатора в положение JTAG.
  4. В ArduinoIDE выбрать используемый программатор - Инструменты -> Программатор -> mik32 uploader.
  5. Активировать оптимизацию для отладки при сборке скетча - Скетч -> Оптимизировать для отладки. Если отладку запустить без указанной оптимизации, при пошаговом прохождении скетча могут возникнуть проблемы, например, с "перепрыгиванием" лишних строк кода, также значения некоторых переменных могут отображаться некорректно.
  6. Скомпилировать скетч - Скетч -> Проверить/Скомпилировать.
  7. Загрузить скетч на плату. Загружать скетч можно как по USB (Скетч -> Загрузить на плату), так и через программатор (Скетч -> Загрузить на плату при помощи программатора).
    внимание

    При запуске отладки скетч не компилируется и не загружается на плату автоматически. Поэтому при внесении изменений в код необходимо вручную повторять пункты 6,7 перед запуском отладки.

  8. Открыть панель отладочника в меню слева:

Debug_panel

После запуска отладки здесь будут доступны к просмотру стек вызовов функций, значения переменных, установленные точки останова, а также состояние периферийных регистров микроконтроллера.
9. Для запуска отладки необходимо нажать кнопку Начать отладку в верхней части экрана:

Debug_start

При этом:

  • Откроется новый терминал gdb-server, в котором запустится программа openocd. Терминал отображает статус соединения с микроконтроллером.
  • Запустится режим отладки, а курсор выполнения программы остановится в начале функции setup().
  • Станут активными кнопки пошагового перемещения по программе.
  • Во всех разделах на панели отладки обновится информация.
  1. Для просмотра отладочной информации можно запустить консоль отладки. Для этого на панели отладки нужно нажать соответствующую кнопку:

Debug_console

В официальной статье подробно описано, как работать с точками останова и пошаговой отладкой кода. Помимо этого, режим отладки позволяет получить доступ к системным регистрам и регистрам периферии микроконтроллера.

Registers

При работе с платами, входящими в состав пакета, накладывается ограничение на доступное количество точек останова - одновременно можно использовать не более 2-х точек. При этом вторая точка останова становится доступной после запуска отладки, когда курсор выполнения программы остановится на функции setup(). Режим отладки не запустится, если в скетче уже установлены обе точки останова.