Особенности использования пакета в 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(), внутри которой глобально разрешаются прерывания. Пример переопределения представлен ниже.

Предупреждения об ошибках
Если в скетче используется интерфейс 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 не запустится.
Запуск отладки
Последовательность действий для запуска режима отладки:
- В ArduinoIDE открыть скетч, который необходимо запустить в режиме отладки.
- Выбрать нужную плату -
Инструменты -> Плата. - Подключить плату к ПК через программатор. Для плат ELBEAR ACE-UNO, ELBEAR ACE-NANO, ELSOMIK использовать ELJTAG. На плате START-MIK32 передвинуть переключатель режима программатора в положение
JTAG. - В ArduinoIDE выбрать используемый программатор -
Инструменты -> Программатор -> mik32 uploader. - Активировать оптимизацию для отладки при сборке скетча -
Скетч -> Оптимизировать для отладки. Если отладку запустить без указанной оптимизации, при пошаговом прохождении скетча могут возникнуть проблемы, например, с "перепрыгиванием" лишних строк кода, также значения некоторых переменных могут отображаться некорректно. - Скомпилировать скетч -
Скетч -> Проверить/Скомпилировать. - Загрузить скетч на плату. Загружать скетч можно как по USB (
Скетч -> Загрузить на плату), так и через программатор (Скетч -> Загрузить на плату при помощи программатора).вниманиеПри запуске отладки скетч не компилируется и не загружается на плату автоматически. Поэтому при внесении изменений в код необходимо вручную повторять пункты 6,7 перед запуском отладки.
- Открыть панель отладочника в меню слева:
После запуска отладки здесь будут доступны к просмотру стек вызовов функций, значения переменных, установленные точки останова, а также состояние периферийных регистров микроконтроллера.
9. Для запуска отладки необходимо нажать кнопку Начать отладку в верхней части экрана:
При этом:
- Откроется новый терминал
gdb-server, в котором запустится программа openocd. Терминал отображает статус соединения с микроконтроллером. - Запустится режим отладки, а курсор выполнения программы остановится в начале функции
setup(). - Станут активными кнопки пошагового перемещения по программе.
- Во всех разделах на панели отладки обновится информация.
- Для просмотра отладочной информации можно запустить консоль отладки. Для этого на панели отладки нужно нажать соответствующую кнопку:
В официальной статье подробно описано, как работать с точками останова и пошаговой отладкой кода. Помимо этого, режим отладки позволяет получить доступ к системным регистрам и регистрам периферии микроконтроллера.

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