Это видео недоступно.
Сожалеем об этом.

Анимация Вечного огня и музыка на микроконтроллере 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
    #программирование
    #анимация
    #звук
    #демка

Комментарии • 21

  • @VadRov
    @VadRov  2 года назад

    Подключение дисплея 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

  • @alexshu1609
    @alexshu1609 2 года назад

    Спасибо . Повторил - все работает . Сейчас ковыряюсь в коде. При добавлении проекта компилятор ругался на кириллические символы в пути к исходникам, лечится перенесением папки с проектом в C:\Users\%Username%\STM32CubeIDE\workspace_1.6.1 . Великолепное пособие для старта

  • @edwardk552
    @edwardk552 Год назад

    Можно проект аудио процессора, добавить pcm1808??? Было бы очень интересно... Эффекты эквалайзер

    • @VadRov
      @VadRov  Год назад +1

      У 401 в корпусе UQFN48 (см. DS9716 Rev 11) нет возможности вывода тактовой частоты i2s "наружу" (выход i2s_MCK недоступен), которая нужна для тактирования pcm1808 (вывод SCKI м/с). А у старшего брата - 411 есть. Поэтому 401 работает с теми ЦАП, которые имеют встроенный модуль PLL, т.е. могут работать без внешнего тактирования MCK. Внешнее тактирование модулей i2s и для 401 в корпусе UQFN48 также недоступно (вывод I2S_CKIN недоступен). Так что, есть проблемы в использовании "малолапых" м/с, распространенных в отладках на Али.

    • @edwardk552
      @edwardk552 Год назад

      @@VadRov ок, спасибо. Чёт даже не подумал об этом

    • @VadRov
      @VadRov  Год назад

      @@edwardk552 , а я невнимательность вчера допустил. Сегодня посмотрел (по случаю) дополнительно карту альтернативных функций выводов GPIO для 411. Так вот, внешнее тактирование I2S_CKIN предусмотрено через пин PA2. Т.е. 411 может и тактировать, и тактироваться, а 401 "не туда и не сюда".

    • @edwardk552
      @edwardk552 Год назад

      @@VadRov да я тоже видел что 411 можно тактировать а 401 нет

  • @Morpheus.theDreamlord
    @Morpheus.theDreamlord 17 дней назад

    А как в данном случае заменить 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 бит на семпл и кидай в промежуточный буффер , но что-то где-то не работает

    • @VadRov
      @VadRov  16 дней назад

      Вроде, все правильно делаете (если еще и указатель входных данных верно инкрементируете). Так же примите во внимание, что в данном случае i2s настраивается всего на частоту дискретизации 8000 Гц (и сэмпл должен быть получен для аналогичной частоты). Ожидать какого-то хорошего качества не приходится при таких настройках.
      Кстати, я экспериментировал и со стерео, и с 16-битами. Проблем, как помню, не было (с учетом изменения кода подготовки pcm буфера). Для преобразования использовал редактор Audacity. Заголовки отрезал в Hex Editor Neo.

    • @Morpheus.theDreamlord
      @Morpheus.theDreamlord 16 дней назад

      @@VadRov я изменил настройки pll под 44,1 kHz , так дело не в дискретизации , а именно в функции заполнения буфера, я еще игрался с разными вариантами , каждый раз звук был искажен , но по разному . Инкрементирую указатель +2 , я так понимаю мы этой строчкой копируем сначала семпл для левого канала , потом для правого (I+1) и смещаемся в цикле на два элемента к следующей паре семплов LR . Возможно проблема в программе с которой я вытягиваю аудиоданные в виде кода . Попробую Вашу связку , спасибо. Этот же семпл на плате Teensy точно так же из флеш памяти камня играет нормально, но там и утилита своя есть для преобразования в код , и готовая библиотека аудио . Вот пытаюсь ее функционал перенести на стм32. Мне от нее нужно всего навсего проигрывать семпл каждый раз когда срабатывает датчик ( триггер ) снимающий удар по бас бочке . Пробовал на есп32 , там был другой баг - при повторах семпла куда-то из звука девалась часть атаки в самом начале, причем в разных количествах.

    • @VadRov
      @VadRov  15 дней назад

      @@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)

    • @Morpheus.theDreamlord
      @Morpheus.theDreamlord 15 дней назад

      @@VadRov а разве указатель на data не uint16_t должен быть , если формат wav 44,1 и 16 бит ? Ибо вот этом походу и затык - одна прога переводит код в массив размером unsigned short , а другая unsigned char . Хотя вавка в одном и другом случае 16 бит на семпл . И этот нюанс я Гугле так и не выяснил , как правильно .

    • @Morpheus.theDreamlord
      @Morpheus.theDreamlord 15 дней назад

      @@VadRov то , что Вы написали выше работает , я это сразу уточнил в первом комментарии . Но работает этот код только если wav формате 44,1 8 bit/sample . И в этом случае в звуке присутствует фоновый шум . Но сам звук правильный , да . Вот если битность 16 начинается проблема . Может еще дело в формате little endian/big endian ? Wav вроде хранит двухбайтные семплы в little endian , а стм в какой последовательности должна их принимать ?