k1921vg015_simple
Для чего?
Написание программ для К1921ВГ015 без использования лишних прослоек по типу “HAL”. Есть заголовочные файлы с описанием регистров оборудования, есть документация на микроконтроллер. Этого вполне достаточно. К тому же без HAL собранные программы получаются заметно компактней.
Особенности
- Код инициализации PLL расчитывает настройки по заданной частоте генератора с внешним кварцем HSE и двух результирующий частот на выходе блока PLL. Т.о. нет надобности вручную подбирать настроки PLL.
- Загружать собранные “прошивки” удобно и быстро во флэш-память контроллера можно через преобразователь USB<->UART, подключенный к UART0, подробности см. tools/README.md
- Кроме этого, доступен загрузчик через USB по протоколу DFU - см. пример ex_usb.
Задание значений частот через Makefile:
# частота кварца, от которого работает HSE
HSE_CLOCK_FREQ=18432000
# частоты на выходе блока PLL
PLL_CLOCK_FREQ0=50000000
PLL_CLOCK_FREQ1=32000000
Далее эти значения передаются с ключами -D компилятору. Ну и ничто не мешает просто задавать эти значение в виде констант в коде. Подробности о расчёте см. в файле tools/README.md !Внимание! В большинстве примеров задано HSE_CLOCK_FREQ=0, при этом происходит автоматическое определение частоты HSE на основе сигнала LSE (32768 Гц), т.е. если на Вашей плате не распаян “часовой” кварц, то лучше проставлять значение частоты кварца на HSE в явном виде. Зачем сделано автоопределение частоты кварца HSE - у меня две отладочных платы, на одной кварц 8 МГц, на другой 18.432 МГц. Чтобы не менять параметры при смене платы.
На чём тестируется?
- На вот этой плате.
- Сейчас распаяно (минимальная обвязка для запуска примера ex_base): кварцевый резонатор на 18.432 МГц, конденсаторы по питанию, разъём USB, линейный стбилизатор на 3.3В, разъём с сигналами JTAG, обвязка питания батарейного домена. Восемь светодиодов подключены к портам PB4..PB7, PB12..PB15.
Чем собирается?
Не требуется скачивать никакое “Syntacore IDE” и прочие SDK.
Всё прекрасно собирается “штатным” (Debian 13) компилятором из комплекта riscv64-unknown-elf.
Для сборки и отладки нужно поставить следующие пакеты (вроде ничего не забыл):
- gcc-riscv64-unknown-elf
- make
- openocd
- gdb-multiarch
- dfu-util (опционально)
Если не собирается с gcc-12
То из параметров компиляции нужно убрать использование расширения zbs, т.е. вместо
-march=rv32imfc_zba_zbb_zbc_zbs_zicsr
поставить
-march=rv32imfc_zba_zbb_zbc_zicsr
Под gcc-14 собирается нормально.
Обход бага с делением на float константу из флэш-памяти
- Так как всё расчитано на использование “штатного” компилятора, который не знает про закидоны ядра К1921ВГ015, то принят ряд мер в соответствии с Errata.
- В коде, где есть деление на float константу, константы читаются из ОЗУ (записываются туда при начальной инициализации), см. ex_i2c/main.c, utils/xprintf.c
- В utils/xprintf.c всё переведено с double на float, чтобы избежать программной обработки чисел с плавающей точкой; оставшиеся места - преобразование double->float в xprintf.c:xvfprintf() и если будете выводить float через xprintf()/xsprintf() - то преобразование float->double.
Сборка
make - цель по умолчанию с оптимизацие по скорости
Другие цели:
- speed - оптимизация по скорости
- size - оптимизация по размеру
- debug - без оптимизации, с отладочной инфой, для запуска в ОЗУ (в примере ex_picojpeg_2 такой цели нет, т.к. оно в ОЗУ не влезет)
- dfu - оптимизация по скорости (то же, что и speed)
- upload - загрузка собранного бинарника через UART0 (должен быть залит загрузчик ex_loader_2); если надо собрать, то собирает с оптимизацией по скорости
- upload.dfu - загрузка собранного бинарника через USB с помощью dfu-util (должен быть залит загрузчик ex_usb_dfu); если надо собрать, то собирает с оптимизацией по скорости Внимание: цели для всех примеров (кроме debug) собираются для размещения во флэше с адреса 0x80002000, т.е. с учётом того, что первые 8 КиБ занимает загрузчик. Для сборки с размещением от начала флэша (0x80000000) есть скрипт компоновщика flash.ld, который используется при сборке загрузчиков ex_loader_2, ex_usb_dfu и ex_usb_dfuse.
Подключение отладчика
“Штатным” (Debian 13) openocd и J-Link V8 через JTAG порт.
Заливка во флэш
Так как “штатный” openocd не поддерживает flash контроллера К1921ВГ015, то для удобной заливки собранного кода используется загрузчик, работающий через UART0 (занимает первый сектор флэша размером 4КиБ). Чтобы занести сам загрузчик (см. ex_loader_2) в этот первый сектор, используется скрипт tools/k1921vg015_uploader.py. Т.о. сборка и заливка кода во флэш производится одной командой make upload. Ещё можно использовать загрузчик из примера ex_usb и заливать прошивку через dfu-util командой make upload.dfu
Отладка
Через gdb-multiarch. Опять же по причине отсутствия поддержки К1921ВГ015 в openocd отладка производится для сборок с размещением в ОЗУ, при этом загрузка кода производится через gdb командой load. Тем, кто использует openocd с поддержкой К1921ВГ015 можно отлаживаться и во флэше :)
Собственно список примеров (в алфавитном порядке)
- ex_base - базовые настройки, GPIO (с “механизмом маскирования”), UART, TMR0
- ex_adc - пример использования АЦП последовательного приближения
- ex_buttons - обработка кнопок, подключенных к GPIO, с одновременными нажатиями и автоповтором
- ex_crc - блок CRC
- ex_crypto - блок CRYPTO
- ex_dac - работа с 16-битным таймером и ШИМ (TMR0, DMA)
- ex_dma - DMA в разных режимах
- ex_encoder - блоки GPIO и UART, поворотный энкодер
- ex_hash - работа с блоком HASH, человеческий пример, а не то, что в примерах от НИИЭТ
- ex_hash_dma - то же самое, что и ex_hash, но с участием DMA
- ex_i2c - работа с датчиком BME280/BMP280 через I2C; вывод показаний на экран (ST7735) и в UART0
- ex_24C32 - работа с EEPROM 24С32 через I2C
- ex_loader_2 - загрузчик для последовательного порта (все примеры, кроме ex_loader, собираются по-умолчанию для заливки через этот загрузчик)
- ex_onewire - блок UART, работа с устройствами на шине 1-wire
- ex_1wire_copy_key - блок UART, работа с устройствами на шине 1-wire, “копирование” ключей DS1990 (проверена запись на RW1990.1, на RW1990.2 и TM2004 не проверено)
- ex_picojpeg - пример вывода изображения в формате JPEG на экран, из формата JPEG декодируется с помощью библиотеки picojpeg
- ex_picojpeg_2 - второй пример с picojpeg, “картинки” в исходники для сборки добавляются непосредственно из JPG файлов
- ex_qspi - блок QSPI, проверялось с W25Q32FW, подключены все 4 линии
- ex_qspi_2 - блок QSPI, проверялось с W25Q32FV, подключены 2 линии
- ex_radio_rс - блок SPI, работа с трансивером SI4432/B0, приём пакетов
- ex_radio_tr - блок SPI, работа с трансивером SI4432/B0, передача пакетов
- ex_rng - минимальная работа с блоком ГСЧ
- ex_scmrtos - базовый пример с scmRTOS
- ex_scmrtos_2 - пример для scmRTOS с “дёрганием” события в прерывании от периферии (TMR32)
- ex_scmrtos_3 - пример с scmRTOS для замера скорости переключения контекста процессов
- ex_sdadc - пример работы с сигма-дельта АЦП
- ex_spi_dma - SPI/DMA на примере экрана с контроллером ST7735
- ex_spi_dma_2 - SPI/DMA на примере экрана с контроллером ILI9341
- ex_usb_dfu - пример работы с USB и контроллером Flash, загрузчик прошивки по протоколу DFU; в примере ex_base есть цель для сборки dfu, по которой собирается бинарник со скриптом линкера flash_dfu.ld и цель upload.dfu для заливки через утилиту dfu-util.
- ex_usb_dfu_2 - то же, что и ex_usb_dfu, но с управлением “подтяжкой” USB.DP через GPIOA.15 (USB.DP -> резистор 510 Ом -> GPIOA.15)
- ex_usb_dfuse - пример работы с USB и контроллером Flash, загрузчик прошивки по протоколу DFUse (вариант DFU, версия 1.1A); можно заливать сборки по make dfu.
- ex_usb_dfuse_2 - то же, что и ex_usb_dfuse, но с управлением “подтяжкой” USB.DP через GPIOA.15 (USB.DP -> резистор 510 Ом -> GPIOA.15)
Другие директории
- devices - “драйверы” различных устройств
- fonts - растровые шрифты со сглаживанием в упакованном формате с кодировкой utf-8 (см. fonts/README.md)
- images - “упакованные” изображения, для вывода на экран используются функции из devices/display.c
- ld_scripts - скрипты компоновщика для размещения программ в ОЗУ, Flash, Flash с загрузчиком
- libbaremetal - минимальные исходники библиотек libc и libm, понемногу дополняется подтягиванием из musl libc
- k1921vg015_hwlibs - заголовочные файлы с описанием регистров оборудования микроконтроллера
- scmrtos - порт scmRTOS для К1921ВК015
- tools - различные загрузчики, утилита расчёта настроек PLL
- utils - утилита для преобразования TGA файлов в сжатые изображения (см. например ex_i2c) для последующего вывода на экран
Микроконтроллер К1921ВГ015
Описание
Примеры программ для К1921ВГ015 без использования Syntacore IDE, PLIB015 и прочего.