README.md

MIK32 Примеры


Репозиторий относится к микроконтроллеру MIK32.

Здесь содержится примеры программ в виде проектов PlatformIO.

По вопросам, связанным с работой микроконтроллера и ПО, обращайтесь в чат техподдержки в Telegram и форму, которые можно найти на сайте компании Микрон.

Больше информации можно получить на сайте docs.mikron.ru/wiki.

Список примеров


GPIO


Blink — Демонстрирует работу с GPIO и PAD_CONFIG через прямую настройку регистров.

Настраивается вывод, подключенный к светодиоду, в режим GPIO. Если выбрана плата с пользовательской кнопкой (BOARD_LITE), то становится доступна функция ledButton, которая считывает состояние кнопки и зажигает светодиод. В зависимости от версии контроллера MIK32V0 или MIK32V2 выводы настраиваются в режим GPIO по-разному.

HAL_Blink — Демонстрирует работу с GPIO и PAD_CONFIG через HAL.

В примере настраиваются выводы PORT0_3 и PORT1_3, подключенные к светодиодам, в режим GPIO. Светодиоды попеременно мигают с заданной задержкой с помощью функций HAL_GPIO_TogglePin и HAL_DelayMs.

HAL_Blink_IRQ — Демонстрирует работу с прерываниями GPIO.

Вывод PORT2_5 должен быть соединен с PORT2_6. В примере PORT_2_6 настроен на прерывание по восходящему фронту. Этот фронт создается выводом PORT2_5, который меняет свое состояние в цикле. Прерывание меняет значение переменной flag, в соответствии с которой зажигаются или гаснут светодиоды.

HAL_Blink_SPIFI — Демонстрирует мигание светодиодом при выполнении программы из внешней флеш памяти по SPIFI.

В примере настраивается режим памяти SPIFI с адресом 0x90000000, а также вывод, подключенный к светодиоду, в режим GPIO. Светодиод мигает на PORT2_7 (BOARD_LITE) или на PORT0_3 и PORT1_3 (BOARD_DIP), при этом код выполняется из внешней флеш, а не из внутренней памяти.

LL_GPIO — В данном примере демонстрируется работа с GPIO через LL_GPIO.

Светодиоды, подключенные к выводам PORT0_3 и PORT1_3, настраиваются как GPIO и попеременно мигают с заданной задержкой.


ADC, DAC


HAL_ADC — Демонстрируется работа АЦП.

В примере реализуются однократные измерения на нескольких каналах с выводом результата в UART0. Канал АЦП переключается не сразу после записи в регистр, а по завершении текущего преобразования. Для одиночных измерений с разных каналов рекомендуется записывать следующий канал сразу после старта преобразования на текущем канале. При многократных измерениях на одном канале, после переключения канала рекомендуется сделать одно дополнительное измерение для переключения на выбранный канал.

HAL_ADC_IRQ — Демонстрируется работа с прерыванием АЦП.

Измерения запускаются и обрабатываются в обработчике прерывания, результаты выводятся в UART0. Особенности переключения каналов и рекомендации по измерениям см. в описании примера HAL_ADC.

HAL_DAC — Демонстрируется работа ЦАП.

На вывод PORT_1_12 задается напряжение, которое периодически увеличивается от 0В до 1,2В.


DMA


HAL_DMA_Crypto — Демонстрируется работа DMA с крипто-блоком.

Канал 0 DMA передает массив данных plain_text в крипто-блок, а канал 1 записывает зашифрованные данные в массив cipher_text. Затем зашифрованные данные сравниваются с ожидаемыми данными. Результат выводится по UART0. При шифровании используется алгоритм “Кузнечик” в режиме шифрования ECB. Ключ и открытый текст взяты из контрольных примеров ГОСТ 34.13—2015 приложение А.

HAL_DMA_I2C_Master — Демонстрируется работа DMA с I2C в режиме ведущего.

Можно использовать вместе с ведущим из примера HAL_DMA_I2C_Slave. Ведущий передает 10 байт ведомому по адресу 0x36, а затем читает столько же байт. Канал 0 DMA записывает из массива data в регистр I2C TXDR. Канал 1 DMA считывает из регистра I2C RXDR в массив data. Результат выводится в UART0.

HAL_DMA_I2C_Slave — Демонстрируется работа DMA с I2C в режиме ведомого.

Можно использовать вместе с ведущим из примера HAL_DMA_I2C_Master. Ведомый читает 10 байт от ведущего по адресу, а затем записывает столько же байт. Канал 0 DMA записывает из массива data в регистр I2C TXDR. Канал 1 DMA считывает из регистра I2C RXDR в массив data. Результат выводится в UART0. При использовании DMA передача более 255 байт не поддерживается в HAL.

HAL_DMA_Memory_Memor_IRQ — Демонстрируется передача данных из памяти в память с использованием DMA и прерываний.

Канал DMA копирует данные из массива word_src в массив word_dst. Прерывания DMA обрабатываются в функции trap_handler, где по завершении передачи выводится содержимое приемного массива в UART0.

HAL_DMA_Memory_Memory — Демонстрируется передача данных из памяти в память с использованием DMA.

Канал DMA настраивается на чтение и запись слов из массива word_src в массив word_dst. После завершения передачи содержимое приемного массива выводится по UART0.

HAL_DMA_SPI_Master — Демонстрируется передача и прием данных ведущим по SPI с помощью DMA.

Канал 0 DMA записывает байты из массива master_output в регистр SPI TXDATA. Канал 1 DMA записывает байты из регистра SPI RXDATA в массив master_input. Пример можно использовать вместе с ведомым из примера HAL_DMA_SPI_Slave.

HAL_DMA_SPI_Slave — Демонстрируется передача и прием данных ведомым по SPI с помощью DMA.

Канал 0 DMA записывает байты из массива slave_output в регистр SPI TXDATA. Канал 1 DMA записывает байты из регистра SPI RXDATA в массив slave_input. Пример можно использовать вместе с ведущим из примера HAL_DMA_SPI_Master.

HAL_DMA_Timer32 — Демонстрируется использование DMA для последовательной передачи значений синусоидального сигнала из массива word_src во входной регистр ЦАП0 (DAC0) по переполнению таймера Timer32, что позволяет формировать периодический аналоговый сигнал.


USART


HAL_USART — Демонстрирует прием и передачу данных по интерфейсу USART.

При передаче на устройство (микроконтроллер) строки текста, символы загружаются в буфер, пока не будет обнаружен символ ‘\n’ возврата каретки. Он заменяется на символ ‘\0’ конца строки, а затем содержимое буфера печатается функцией HAL_USART_Print.

HAL_USART_DMA — Демонстрирует передачу данных по интерфейсу USART с использованием DMA.

В главном цикле запускается передача данных по DMA, затем в течение времени задержки DMA передает данные из ОЗУ в USART порт.

HAL_USART_IRQ — Демонстрирует прием и передачу данных по интерфейсу USART по прерываниям.

Программа считывает отправленные по интерфейсу USART строки длины не более BUFFER_LENGTH-1 и отправляет их по USART обратно. Скорость порта USART - 115200 бод (может быть изменена, см. USART_Init())

HAL_USART_Modem — Демонстрирует передачу данных по интерфейсу USART с использованием модемных сигналов RTS и CTS.

Устройство Transmitter в бесконечном цикле передает байт ‘\n’ по интерфейсу USART, устройство Receiver принимает данные, но считывает их с задержкой 1000 мкс, при этом на время задержки линия RTS автоматически устанавливается в лог.1. Устройство Transmitter не посылает следующий байт до того момента, как RTS не будет сброшен в лог.0. Если при передаче данных обнаружена ошибка timeout, на плате загораются светодиоды. Сигнал RTS (“request to send”, запрос на передачу, выход, соединяется с CTS внешнего устройства) используется, чтобы оповестить внешнее устройство о готовности микроконтроллера принять байт данных. Активный уровень — низкий. RTS устанавливается в “1” аппаратно во время приема стоп-бита, когда модуль USART принял данные, но процессор еще не успел их прочитать. После чтения данных из регистра RXDATA сигнал RTS автоматически сбрасывается в “0”. Сигнал CTS (“clear to send”, очищен для записи, вход, соединяется с RTS внешнего устройства) оповещает микроконтроллер, что устройство, принимающее данные по линиям USART, готово принять данные. Активный уровень — низкий. Флаг TXC (“передача завершена”) модуля USART не будет установлен до тех пор, пока на линии CTS лог.1. Сигнал DTR (выход, соединяется с DSR внешнего устройства) сообщает внешнему устройству, что микроконтроллер готов принять данные. Линия DTR управляется программно. Сигнал DSR (вход, соединяется с DTR внешнего устройства) используется для того, чтобы определить, готово ли внешнее устройство к приему данных. Обработка состояния линии DSR должна выполняться программно, при изменении состояния линии устанавливается соответствующий флаг.


I2C


Hal_I2C_Master — Демонстрируется работа I2C в режиме ведущего.

Ведущий записывает по адресу 0x36 10 байт, а затем считывает. Используется режим автоматического окончания. Пример может быть использован совместно с ведомым из примера Hal_I2C_Slave.

Hal_I2C_Master_IRQ — Демонстрируется работа I2C в режиме ведущего с использованием прерываний.

Ведущий записывает по адресу 0x36 10 байт, а затем считывает. Используется режим автоматического окончания. Результат выводится в UART0. Пример может быть использован совместно с ведомым из примера Hal_I2C_Slave_IRQ.

Hal_I2C_Slave — Демонстрируется работа I2C в режиме ведомого.

Ведомый считывает 10 байт от ведущего, а затем записывает. Используется растягивание сигнала SCL Пример может быть использован совместно с ведущим из примера Hal_I2C_Master.

Hal_I2C_Slave_IRQ — Демонстрируется работа I2C в режиме ведомого с использованием прерываний.

Ведомый считывает 10 байт от ведущего, а затем записывает. Используется растягивание сигнала SCL. Результат выводится в UART0. Пример может быть использован совместно с ведущим из примера Hal_I2C_Master_IRQ.

I2C_Scan — Демонстрируется мониторинг шины I2C, выводя в порт адреса найденных слейвов.


SPI


HAL_SPI_Master — Демонстрирует работу с SPI в режиме ведущего.

Ведущий передает и принимает от ведомого на выводе CS0 20 байт. Результат передачи выводится по UART0. Пример можно использовать совместно с ведомым из примера HAL_SPI_Slave.

HAL_SPI_Master_IRQ — Демонстрирует работу с SPI в режиме ведущего с использованием прерываний.

Ведущий передает и принимает от ведомого на выводе CS0 20 байт. Сигнал CS управляется вручную с помощью функций HAL_SPI_CS_Enable и HAL_SPI_CS_Disable. Результат передачи выводится по UART0. Пример можно использовать совместно с ведомым из примера HAL_SPI_Slave_IRQ.

HAL_SPI_Slave — Демонстрирует работу с SPI в режиме ведомого.

Ведомый передает и принимает от ведущего 20 байт. Результат передачи выводится по UART0. Пример можно использовать совместно с ведущим из примера HAL_SPI_Master.

HAL_SPI_Slave_IRQ — Демонстрирует работу с SPI в режиме ведомого с использованием прерываний.

Ведомый передает и принимает от ведущего 20 байт. Результат передачи выводится по UART0. Пример можно использовать совместно с ведущим из примера HAL_SPI_Master_IRQ.

HAL_SPIFI_QuadSPI — Демонстрируется чтение и запись данных во внешнюю флеш память Winbond W25 в режиме Quad SPI.

HAL_SPIFI_QuadSPI_DMA — Демонстрируется чтение и запись данных во внешнюю флеш память Winbond W25 в режиме Quad SPI с использованием DMA.

Включается Quad-режим, выполняется стирание сектора, затем передача массива данных во флеш и чтение этих данных обратно. Передача и приём по SPI обслуживаются двумя каналами DMA, результаты операций выводятся по UART0.

HAL_SPIFI_SingleSPI — Демонстрируется чтение и запись значений во внешнюю флеш память Winbond W25 по Standard (Single) SPI.

SPIFI — Демонстрирует запись прошивки во внешнюю флеш память по SPIFI.

Прошивка из примера Blink для платы BOARD_LITE, на которой пользовательский светодиод подключен к выводу PORT2_7, преобразована в массив байт в файле array.h. Эти данные загружаются во внешнюю флеш по SPIFI, процесс выполнения загрузки выводится по UART0. После успешной записи внешней флеш можно сменить режим загрузки перемычками BOOT на загрузку из внешней флеш. В этом случае светодиод начнет мигать. Работа с внешней флеш памятью идет в режиме Single SPIFI.

SPIFI_Quad — Демонстрируется работа с внешней флеш памятью в Quad SPI режиме на низком уровне, без использования HAL.

Пример находится в разработке и может работать некорректно.


RTC


Hal_RTC — Демонстрируется работа RTC.

В RTC настраивается текущее время и время срабатывания будильника, которое отличается от текущего на 5 секунд. Будильник проводит сравнение времени и даты по всем полям. Текущее время RTC выводится по UART0. На 5й секунде должен сработать будильник и отправить “Alarm!” по UART0.

Hal_RTC_IRQ — Демонстрируется работа RTC с использованием прерывания.

В RTC настраивается текущее время и время срабатывания будильника, которое отличается от текущего на 5 секунд. Будильник проводит сравнение времени и даты по всем полям. Текущее время RTC выводится по UART0. На 5й секунде должен сработать будильник и вызвать прерывание, в обработчике которого выводится “Alarm!” по UART0.


Таймеры


HAL_SCR1_Timer — Демонстрирует работу с системным таймером.

Настраивается вывод PORT1_3, который подключен к светодиоду, в режим GPIO. Системный таймер отсчитывает 1 секунду, после чего на выводе PORT1_3 инвертируется выходной сигнал. Пример для платы DIP-MIK32.

HAL_SCR1_Timer_IRQ — Демонстрирует работу с прерыванием системного таймера по сравнению.

Настраивается вывод PORT1_3, который подключен к светодиоду, в режим GPIO. По достижению счетчика таймера значения сравнения срабатывает прерывание, по которому переменная flag устанавливается в 1. В зависимости от значения flag инвертируется сигнал на выводе PORT1_3. Пример для платы DIP-MIK32.

HAL_System_Time — Демонстрирует возможности работы со временем в библиотеке HAL.

Функции системного времени: uint32_t HAL_Micros() - возвращает время в микросекундах uint32_t HAL_Millis() - возвращает время в миллисекундах Функции временных задержек: void HAL_DelayUs(uint32_t time_us) - задержка в микросекундах void HAL_DelayMs(uint32_t time_ms) - задержка в миллисекундах По умолчанию временные задержки реализованы в виде цикла с изменяемым количеством проходов, а функции системного времени возвращают 0. Однако можно применить один из 16 или 32-разрядных таймеров, или таймер SCR1 для организации подсчета системного времени. В этом случае необходимо переопределить функции системных часов, а также проинициализировать нужный таймер в теле программы.

HAL_Timer16 — Демонстрирует работу с Timer16.

Таймер тактируется и считает в непрерывном режиме от внутреннего источника (sys_clk - системная частота). Значения счетчика периодически выводятся по UART0. На выводе PORT0_10 генерируется ШИМ сигнал.

HAL_Timer16_IRQ — Демонстрируется работа прерываний TIMER16_1.

Таймер запускается и генерирует на выводе PORT0_10 ШИМ сигнал. Выводы GPIO0_3 и GPIO1_3 меняют свое состояние по достижению счетчиком CNT предельного значения ARR и значения сравнения CMP соответственно.

HAL_Timer32 — Демонстрируется работа Timer32.

Нулевой канал таймера используется в режиме захвата. На Port0_0 подается периодичный сигнал (ШИМ), частота которого измеряется и выводится в UART0.

HAL_Timer32_IRQ — Демонстрируется работа прерываний TIMER32_1.

Нулевой канал таймера используется в режиме захвата. На Port0_0 подается периодичный сигнал (ШИМ), частота которого измеряется и выводится в UART0.

HAL_Timer32_PWM — Демонстрируется работа Timer32 в режиме ШИМ.

Нулевой канал таймера используется в режиме ШИМ. На Port0_0 генерирует периодичный сигнал (ШИМ) с заполнением 50 %, частота которого задается верхним пределом таймера. Таймер считает от частоты системной шины, поэтому для установки частоты нужно передать по UART0 значение: top = (частота основного генератора) / (задаваемая частота). Например, для частоты 100кГц следует отправить “t320\n”.


WDT


HAL_WDT — Демонстрируется работа сторожевого таймера WDT.

В начале программа инициализирует такие периферии как UART и WDT. Затем по UART отправляется строка “Start”, что говорит об успешном старте программы. После этого запускается таймер WDT, который отсчитывает 1000 мс. Затем значение счетчика таймера сбрасывает функцией HAL_WDT_Refresh. После этого программа заходит в бесконечный цикл, в котором таймер досчитывает до конца и формирует сигнал сброса.

HAL_WDT_IRQ — Демонстрируется работа сторожевого таймера WDT с использованием прерывания.

В начале программа инициализирует такие периферии как GPIO, UART и WDT. Затем по UART отправляется строка “Start”, а вывод PORT2_7 несколько раз быстро мигает светодиодом, что говорит об успешном старте программы. После этого запускается таймер WDT, который отсчитывает 1000 мс. За 256 тактов таймера формируется прерывание, в обработчике которого PORT2_7 меняет свое состояние, а счетчик таймера сбрасывается.


EEPROM


HAL_EEPROM — Демонстрируется стирание, запись и чтение EEPROM с использованием HAL библиотеки.

HAL_EEPROM_to_SPIFI — Демонстрирует настройку и переход к выполнению программы из SPIFI.

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


Другие примеры


HAL_CRC32 — Демонстрируется работа с CRC32 (алгоритм CRC-32Q).

Вычисляется контрольная сумма для массива байт message и для массива слов data. Результат выводится по UART0.

HAL_Crypto — Демонстрируется работа с крипто-блоком.

Используется алгоритм шифрования Кузнечик в разных режимах шифрования (ECB, CBC, CTR) Ключ и открытый текст взяты из контрольных примеров ГОСТ 34.13—2015 приложение А. В каждом режиме шифрования текст зашифровывается, затем расшифровывается и сравнивается с ожидаемым. Результат выводится в UART0.

HAL_OTP — Демонстрируется работа с OTP - одноразовой программируемой памятью.

Для записи на вывод VPRG должно быть подано напряжение (8-8.5)В. Если на данный вывод не подано напряжение или подано 3.3В, то запись не осуществится или пройдет некорректно. В начале в основной блок данных записываются слова из массива otp_data_write. После этого значение переменной otp_data_writeTestRow записывается в тестовую строку, otp_data_writeTestColumn в тестовый столбец, otp_data_writeTestBit в тестовый бит. Затем из OTP считываются все данные. Результат выводится по UART0.

HAL_TSENS — Демонстрируется работа температурного сенсора.

Датчик тактируется от внешнего осциллятора OSC32K. Запускается одно одиночное измерение температуры, после чего запускается измерение в непрерывном режиме. Результат выводится по UART0.

HAL_TSENS_IRQ — Демонстрируется работа температурного сенсора с использованием прерываний.

Датчик тактируется от внешнего осциллятора OSC32K. Устанавливается значение верхнего порога HI_THRESHOLD, соответствующее 35 ℃. Значение нижнего порога LOW_THRESHOLD остается по умолчанию -40 ℃. Затем датчик начинает измерять температуру в непрерывном режиме. При этом включаются прерывания по окончанию преобразования и по выходу значения датчика за пороговые значения LOW_THRESHOLD и HI_THRESHOLD. По окончанию преобразования переменной temperature присваивается новое значение температуры. При превышении верхнего порога температуры зажигается светодиод на выводе PORT2_7, устанавливается флаг hiFlag и не сбрасывается до тех пор, пока температура не опустится ниже 30 ℃. Результат выводится по UART0.

SSD1306 — В данном примере демонстрируется работа с OLED‑дисплеем SSD1306 совместно с модулем RTC.

В начале программа инициализирует RTC и дисплей, очищает экран и задаёт области для вывода цифр. Текущее время считывается из RTC и отображается на экране в формате ЧЧ:ММ.

Описание
Конвейеры
0 успешных
0 с ошибкой
Разработчики