×

Внимание

Форум находится в режиме только для чтения.

Mario на STM32

11 года 8 мес. назад - 9 года 2 мес. назад #3193 от admin
admin создал тему: Mario на STM32
Архитектура микроконтроллеров семейства STM32 позволят выполнять несколько задач одновременно. Гибко настраиваемая периферия + DMA позволяют отказаться от рутинных подключений ядра во множестве случаев. Например, при воспроизведении звуковых файлов. Инженеры компании Промэлектроника применили свой стек для работы с последовательной памятью типа M25, который можно скачать здесь. Во внешнюю последовательную (и весьма дешёвую) Flash память предварительно был записан файл формата wav. Для наших неблагочестивых экспериментов был выбран саундтрек из игры Mario, подвергнутый конвертации в 8-ми битный моно формат с частотой дискретизации 22кГц. Объём файла составил 452 килобайт, что составило примерно 20% от применённой последовательной памяти M25P16.
Работа софта была построена по следующей блок-схеме:

В процессе финального цикла «Ничего не делать» будут возникать прерывания, в момент, когда очередной фрагмент мелодии будет проигран. Прерывание будет сгенерировано контроллером прямого доступа к памяти DMA в момент окончания копирования. Работа ядра в этом случае заключается в указании DMA нового буфера, откуда требуется брать звуковые данные для ШИМ, а так же запуск процесса чтения следующей страницы внешней последовательной Flash памяти. Отметим, что оба процесса выполняются без ядра, работают таймер2, 2 канала DMA и SPI, к которому подключена внешняя память M25.

Как часто возникают прерывания? Частота дискретизации звука составляет 22кГц, объём одного буфера 256 байт, соответственно, с частотой 22000/256 = 86 Гц ядро подключается к работе воспроизведения. Время работы ядра – минимальное, размер обработчика прерывания составил 130 байт (хотя при отказе от использования библиотек можно объём/время выполнения кода существенно снизить), работа – практически линейная, так что на частоте 36МГц время выполнения составит 3.6 мкс. Таким образом, общая загрузка ядра составляет менее 0.05%. Куда потратить остальные 99.95% мощи ядра – решает разработчик приложения. С указанной задачей справится любой STM32.

В процессе создания приложения возникла задача записи файла во внешнюю микросхему памяти M25. Вообще, эта задача уже решена инженерами STMicroelectronics. Они предлагают использовать USB DFU (смотреть библиотеку USB Device). С помощью программы DFUSE DEMO можно прошить через USB не только сам контроллер, но и внешнюю память нескольких типов, в том числе и M25. Со стороны контроллера софт так же написан (его надо просто использовать как загрузочный). На нашем подопытном контроллере USB – нет. Поэтому пришлось написать стек, позволяющий принимать файлы по протоколу XMODEM. Протокол старый, но он есть в программе HiperTerminal, через которую была произведена запись файла. Усечённый программный стек «как принять файл и записать его во внешнюю M25» вы так же найдёте в работе. Усечённость стека XMODEM заключается прежде всего в отсутствии сверки контрольной суммы и вытекающие из этого ветвления по приёму файла.

Компоненты, использованные в проекте:
  • Контроллер STM32F101R8T6
  • Память M25P15VMN6TP
  • UART Трансивер ST3232B
  • Транзистор STBV32
  • Звукоизлучатель TRI-50N-C 8 Ом 1 Вт
В качестве среды разработки был использован IAR EMW версии 6.1, а отладчика – ST-Link.
Вложения:
Время создания страницы: 0.041 секунд
Работает на Kunena форум