Это видео недоступно.
Сожалеем об этом.
Анимация Вечного огня и музыка на микроконтроллере STM32: демка в честь 77 годовщины Дня Победы
HTML-код
- Опубликовано: 8 май 2022
- Анимация Вечного огня и музыка на микроконтроллере STM32: демка в честь 77 годовщины Дня Победы. Написал демку, которая выводит на дисплей анимированный Вечный огонь и воспроизводит соответствующую музыку. Все данные изображений и музыки будут храниться во флэш памяти микроконтроллера. Поэтому качество картинок и звука, естественно, ограничено. Так, звук выводится в разрешении 8 бит и с частотой дискретизации (сэмплирования) 8000 Гц.
Проект будет полезен тем, кто хочет разобраться с выводом звука на микроконтроллере, с организацией буфера PCM и работой прерываниями. Для вывода изображений в формате jpeg применяется не библиотека libjpeg, а библиотека от ChaNa, которая была мной доработана (что доработано - читайте в комментариях в библиотечных файлах).
Проект доступен для скачивания по ссылке: drive.google.c...
Поддержать канал:
donate.qiwi.co...
yoomoney.ru/to...
Покупал на Алиэкспресс:
программатор ST-Link alii.pub/6fdujg
плата разработки stm32f401ccu6 alii.pub/6fdumy
плата разработки stm32f411ceu6 alii.pub/6fduop
аудио-ЦАП pcm5102a alii.pub/6fdurf
макетная плата alii.pub/6fduuq
провода для макетной платы alii.pub/6fduwo
3.2" дисплей с тачскрином ILI9341 spi alii.pub/6fdvcf
1.3" дисплей ST7789 spi alii.pub/6fdvks
модуль микро SD карты alii.pub/6fdvoh
stm32, stm32f401ccu6, stm32 прерывания, stm32 изображение, stm32 звук, stm32 музыка, stm32 i2s, st7789, pcm5102
#stm32
#программирование
#анимация
#звук
#демка
Подключение дисплея st7789 по spi c dma на CMSIS и LL рассмотрено в видео ruclips.net/video/8tIJ16riJqo/видео.html
Подключение SD-карты по spi с dma на CMSIS и LL рассмотрено в видео ruclips.net/video/z99bLhlnukM/видео.html
Подключение кнопок на таймере с прерыванием на CMSIS и LL с устранением дребезга, автоповтором и буферов ввода (прямо как на PC 😉) рассмотрено в видео ruclips.net/video/e-w5HS75neg/видео.html
Файловый менеджер (структура и код) рассмотрен в видео ruclips.net/video/4c_PwnasQvs/видео.html
Подключение аудио-цап (audio dac) по интерфейсу i2s на CMSIS и LL рассмотрено в видео ruclips.net/video/p0IhX-XiiiQ/видео.html
К каждому из перечисленных видео есть ссылка в описании на проект для скачивания.
Поддержать канал:
donate.qiwi.com/payin/VadRov
yoomoney.ru/to/4100117522443917
Покупал на Алиэкспресс:
программатор ST-Link alii.pub/6fdujg
плата разработки stm32f401ccu6 alii.pub/6fdumy
плата разработки stm32f411ceu6 alii.pub/6fduop
аудио-ЦАП pcm5102a alii.pub/6fdurf
макетная плата alii.pub/6fduuq
провода для макетной платы alii.pub/6fduwo
3.2" дисплей с тачскрином ILI9341 spi alii.pub/6fdvcf
1.3" дисплей ST7789 spi alii.pub/6fdvks
модуль микро SD карты alii.pub/6fdvoh
Спасибо . Повторил - все работает . Сейчас ковыряюсь в коде. При добавлении проекта компилятор ругался на кириллические символы в пути к исходникам, лечится перенесением папки с проектом в C:\Users\%Username%\STM32CubeIDE\workspace_1.6.1 . Великолепное пособие для старта
Можно проект аудио процессора, добавить pcm1808??? Было бы очень интересно... Эффекты эквалайзер
У 401 в корпусе UQFN48 (см. DS9716 Rev 11) нет возможности вывода тактовой частоты i2s "наружу" (выход i2s_MCK недоступен), которая нужна для тактирования pcm1808 (вывод SCKI м/с). А у старшего брата - 411 есть. Поэтому 401 работает с теми ЦАП, которые имеют встроенный модуль PLL, т.е. могут работать без внешнего тактирования MCK. Внешнее тактирование модулей i2s и для 401 в корпусе UQFN48 также недоступно (вывод I2S_CKIN недоступен). Так что, есть проблемы в использовании "малолапых" м/с, распространенных в отладках на Али.
@@VadRov ок, спасибо. Чёт даже не подумал об этом
@@edwardk552 , а я невнимательность вчера допустил. Сегодня посмотрел (по случаю) дополнительно карту альтернативных функций выводов GPIO для 411. Так вот, внешнее тактирование I2S_CKIN предусмотрено через пин PA2. Т.е. 411 может и тактировать, и тактироваться, а 401 "не туда и не сюда".
@@VadRov да я тоже видел что 411 можно тактировать а 401 нет
А как в данном случае заменить 8битный формат вав файла на 16битный ? Я пробовал в функции заливки буффера вместо
(*pData)>>7 писать просто p_pcm_buff [i] = p_pcm_buff[i+1] = *pdata ;
Cам указатель pData у меня соотв. на uint16_t и массив с данными звука uint16_t wav[] ; В итоге вместо исходного семпла ( пытаюсь семпл бас бочки играть) выходит какой-то дико искаженный вариант . Если перевести этот же семпл в формат 8 бит и код не трогать - играет нормально , но с шумом поверх основного звука ( видимо понижение битности сказывается ). Причем одна программа которой переводил вав в код - HxD перегоняет данные в формате uint8_t , а другая может и 8 и 16 и с знакои и без знака . Но пробовал все варианты , и моно и стерео - так и не удалось воспроизвести в 16битном формате. Где может быть затык ? Я так понимаю вся соль в правильном заполнении буфера . Но вроде же проще некуда - бери из исходного массива 16 бит на семпл и кидай в промежуточный буффер , но что-то где-то не работает
Вроде, все правильно делаете (если еще и указатель входных данных верно инкрементируете). Так же примите во внимание, что в данном случае i2s настраивается всего на частоту дискретизации 8000 Гц (и сэмпл должен быть получен для аналогичной частоты). Ожидать какого-то хорошего качества не приходится при таких настройках.
Кстати, я экспериментировал и со стерео, и с 16-битами. Проблем, как помню, не было (с учетом изменения кода подготовки pcm буфера). Для преобразования использовал редактор Audacity. Заголовки отрезал в Hex Editor Neo.
@@VadRov я изменил настройки pll под 44,1 kHz , так дело не в дискретизации , а именно в функции заполнения буфера, я еще игрался с разными вариантами , каждый раз звук был искажен , но по разному . Инкрементирую указатель +2 , я так понимаю мы этой строчкой копируем сначала семпл для левого канала , потом для правого (I+1) и смещаемся в цикле на два элемента к следующей паре семплов LR . Возможно проблема в программе с которой я вытягиваю аудиоданные в виде кода . Попробую Вашу связку , спасибо. Этот же семпл на плате Teensy точно так же из флеш памяти камня играет нормально, но там и утилита своя есть для преобразования в код , и готовая библиотека аудио . Вот пытаюсь ее функционал перенести на стм32. Мне от нее нужно всего навсего проигрывать семпл каждый раз когда срабатывает датчик ( триггер ) снимающий удар по бас бочке . Пробовал на есп32 , там был другой баг - при повторах семпла куда-то из звука девалась часть атаки в самом начале, причем в разных количествах.
@@Morpheus.theDreamlord , не знаю какие проблемы у Вас возникают. Вроде, все просто.
void Fill_pcmbuffer(void)
{
for (int i = 0; i < 2*128; i+=2)
{
if (!data_left)
{
pdata = (uint8_t*)music_kick.data;
data_left = (uint32_t)music_kick.size;
}
/*
//mono 8 бит
p_pcm_buffer[i] = p_pcm_buffer[i+1] = (*pdata)
@@VadRov а разве указатель на data не uint16_t должен быть , если формат wav 44,1 и 16 бит ? Ибо вот этом походу и затык - одна прога переводит код в массив размером unsigned short , а другая unsigned char . Хотя вавка в одном и другом случае 16 бит на семпл . И этот нюанс я Гугле так и не выяснил , как правильно .
@@VadRov то , что Вы написали выше работает , я это сразу уточнил в первом комментарии . Но работает этот код только если wav формате 44,1 8 bit/sample . И в этом случае в звуке присутствует фоновый шум . Но сам звук правильный , да . Вот если битность 16 начинается проблема . Может еще дело в формате little endian/big endian ? Wav вроде хранит двухбайтные семплы в little endian , а стм в какой последовательности должна их принимать ?