Библиотека воспроизведения TMRPCM WAV

victor_pv
Вт 30 июня 2015 г., 8:48 вечера
Мне нужно было иметь возможность воспроизвести некоторые звуки и решил сделать снимок для портирования этой библиотеки, которая воспроизводит звук в Arduino, используя таймеры в режиме выхода ШИМ.
https: // github.com/tmrh20/tmrpcm/wiki

Я почти закончил портировать его, хотя я снимаю кучу вариантов, которые очень специфичны для AVR, но вызов функции будет одинаковым с той же функциональностью и, надеюсь, хорошей совместимости с различными файлами WAV. Я никогда не использовал библиотеку в Ардуино, но раньше слышал аудио с ШИМ и достаточно хорош для того, что мне нужно.
Сначала я использую прерывания и, вероятно, буду использовать DMA позже, чтобы освободить процессор.
Я сделаю порт доступным после завершения. Я не планирую на 16 -битное качество, но должен быть довольно легко реализовать, просто используя 2 куб. В любом случае я использую целый таймер, поэтому использование 1 или 2 выходов на канал просто означает использование еще 2 контакта.

victor_pv
Чт, 2 июля 2015 г., 13:35
Просто быстрое обновление для любого, кто читает эту ветку, у меня сейчас есть библиотека без каких -либо ошибок сейчас.
Мне нужно провести фильтр и динамик и проверить его.

Rogerclark
Пт, 3 июля 2015 г., 4:02
Виктор,

Спасибо, что сообщили сообществу, как это происходит. Я полагаю, качество воспроизведения должно быть лучше, чем на AVR, так как скорость дискретизации и т. Д

victor_pv
Сб, 04 июля 2015 г., 21:26
Наконец, он работал, за исключением обратного вызова Systick, который должен загружать данные с SD -карты в буфер.
Я думаю, что не могу должным образом получить доступ к SDCARD из функции, вызванной из ISR. Это может быть связано с использованием прерываний для порта SPI, я могу проверить его позже без DMA &прерывания.

В любом случае, я отошел от использования класса. Я удалил все классные вещи и много условного компиляции. Для меня это работает лучше, по крайней мере, в настоящее время это работает.
Я могу воспроизводить разные файлы wav. Качество кажется просто справедливым для того, что оно есть, плюс я не отфильтровал шум, у меня не было достаточно маленького конденсатора вокруг.
Он играет только с 8 битами разрешения, в стерео. Следующим шагом является тестирование с использованием 2 -й каналов для каждого аудиоканала, для достижения 16 бит разрешения и добавления надлежащего фильтра RC Low Pass.
Я сделал элементарный усилитель с BS170, и это работает достаточно хорошо.
После того, как я протестировал это немного больше и отдал код, я поделюсь им.

Аудиоаритория должна быть полезна для воспроизведения любого звука, поэтому она может пригодиться для очень маленьких звуков, хранящихся во флэш-памяти, или, как я использую его сейчас, для файлов wav, хранящихся в SD-карте.

Я думаю, что качество может быть наравне с библиотекой ESP8266 MP3 с правильным фильтром шума.

Rogerclark
Сб, 04 июля 2015 г., 21:33
Привет, Виктор,

Re: ISR

Я прочитал кое -что на днях о приоритетах прерывания на руке.

Каждому входу ISR выделяется приоритет, тем ниже число, тем выше приоритет, i.эн. 0 = самый высокий приоритет.
Прерывания более высокого приоритета могут прервать код, уже работающий в более низком приоритетном прерывании.

Однако, как говорится... Я не думал, что SPI использует ISR (или ваш код использует SPI ISR ?

victor_pv
Солнце 5 июля 2015 г. 5:11
Rogerclark написал:Привет, Виктор,

Re: ISR

Я прочитал кое -что на днях о приоритетах прерывания на руке.

Каждому входу ISR выделяется приоритет, тем ниже число, тем выше приоритет, i.эн. 0 = самый высокий приоритет.
Прерывания более высокого приоритета могут прервать код, уже работающий в более низком приоритетном прерывании.

Однако, как говорится... Я не думал, что SPI использует ISR (или ваш код использует SPI ISR ?

Rogerclark
Sun 5 июля 2015 г., 6:18
Виктор

В идеале нам нужно отказаться от блокировки функций, если это возможно.

Хорошо блокирующие функции в порядке, но они не дают нам полного польза от DMA, я.E они дают немного более быстрые переводы, но они не дают нам способности, чтобы процессор мог бы уйти и делать другие вещи, пока DMA передает.

И в идеале мы могли бы запустить несколько отдельных SPI DMA на разных каналах.

эн.глин. Я создал испытательную установку с SD -картой, а также декодер MP3 VS1053, где SD находится на SPI1, а декодер MP3 на SPI2 - однако в настоящее время нет смысла использовать 2 канала SPI в качестве невозможного передачи из SD В то же время, как и его перевод в mp3.

Кроме того, если бы у меня был пользовательский интерфейс (которого я не в данный момент), у меня, вероятно, были бы проблемы, так как большую часть времени код должен ждать, пока трансфер SD завершает или завершите перенос MP3 Мне нужно написать код, который опросывает для пользовательского интерфейса

Mrburnette
Солнце 5 июля 2015 г. 13:11
Rogerclark написал:Виктор

В идеале нам нужно отказаться от блокировки функций, если это возможно.

Хорошо блокирующие функции в порядке, <...>

Кроме того, если бы у меня был пользовательский интерфейс (которого я не в данный момент), у меня, вероятно, были бы проблемы, так как большую часть времени код должен ждать, пока трансфер SD завершает или завершите перенос MP3 Мне нужно написать код, который опросывает для пользовательского интерфейса

victor_pv
Sun 5 июля 2015 г., 14:00
Я сделал несколько тестов с COOS. Я полагаю, что я включил это с одним из портов COO (есть 2, старый, который я нашел, и последняя версия, которую я перенес, переведя изменения в старом).
Что ж, этот пример идет, чтобы проверить, использует ли использование некоторой функции RTO в DMA во время петли, поэтому RTOS сразу же выпускает ЦП для другой задачи, обеспечивает любую прирост.
Я не помню, реализовал ли я это с помощью задержки, что является фактом, вызывает переключение задач в RTOS или семафор, который имеет такой же эффект, или я даже использовал новую функцию задачи, которую я нашел на форумах и Я реализовал, мне придется оглянуться назад, чтобы подтвердить.

Но результатом этого теста было то, что наличие блока DMA в цикле времени без какой -либо дополнительной команды «выпуск процессора» или, чтобы его выпустили процессор для другой задачи, имели очень мало или без влияния DMA для доступа к экрану.

Как отмечает Рэй, использование RTO уже позаботится о предоставлении процессора другим задачам, когда вы блокируете. Я заметил, когда я посмотрел MP3 -плеер ESP8266, который они используют Freertos, так что ESP может делать все это сетевые вещи, и в то же время легко запустить клиентскую программу.
Я согласен с Рэем, что мы должны использовать его больше. Я совершенно новичок в этом, и все еще должен многому научиться, но я уже написал несколько примеров, чтобы проверить вещи и был впечатлен этим.
Недавно я написал тестовый эскиз, который измеряет использование процессора во время запуска одного и того же наброска кубиков, который довольно быстро вращает 2 куба на экране.
Использование процессора составило около 28% только с помощью быстрого драйвера DMA для экрана.

Затем мне нужно проверить игрока WAV в COOS или Freertos, и я планирую измерить использование процессора для него. Мое намерение состоит в том, чтобы заставить WAV Player DMA.
Плохая часть заключается в том, что каналы DMA разделяются между различными периферийными устройствами, поэтому вам необходимо тщательно спланировать, какие периферийные устройства будут использовать DMA, а какие не будут.

О блокировании SPI DMA, я помню, мы говорили о реализации механизма обратного вызова, а не блокировали, но мы решили заблокировать, потому что большинство нынешних драйверов переключают CS и другие булавки, как только вызов SPI возвращается, и их нужно будет сильно переписать на Управление не блокирующим доступом SPI. Но с RTOS нам не нужно что -либо переписать, просто запустите задачу DMA и переключение и позвольте планировщику RTOS решить, что запустить дальше.

Все еще должно быть легко обеспечить блокировку и опцию без блокировки, поэтому, когда вы пишете драйвер для чего-то, вы можете решить, может ли вариант не блокировки работать и планировать вокруг него с самого начала.

Чтобы побудить кого -либо использовать RTO, я опубликую где -нибудь эскиз, который измеряет использование процессора и показывает его на экране.
Я планирую использовать его все время при использовании RTO и, возможно, удаляю его только после того, как проект будет закончен, но во время разработки я думаю, что это отличная помощь.

РЕДАКТИРОВАТЬ: видео, показывающее использование процессора, затем приходит добавление воспроизведения WAV, черные клавиши звучат потрясающе даже с 8BITS ;)
https: // www.YouTube.com/watch?v = obedcxq7sza

Mrburnette
Солнце 5 июля 2015 г. 22:40
victor_pv написал:Я сделал несколько тестов с COOS.
https: // www.YouTube.com/watch?v = obedcxq7sza

Rogerclark
Солнце 5 июля 2015 г. 22:48
Ребята,

Это интересно использовать RTO для преодоления блокировки передач DMA.

Должен признать, я немного старая школа, когда дело доходит до ОС в реальном времени на встроенных устройствах. В прошлые дни микропроцессоры действительно не хватало, чтобы очень хорошо справиться с RTO.

Однако, поскольку у нас теперь есть 128 КБ, с большим количеством ОЗУ и больше циклов процессора, я думаю, что это делает его более практичным

victor_pv
Солнце 5 июля 2015 г. 11:44
Использование процессора увеличивается примерно до 53%, играя в файл wav одновременно.
Это около 25% для данных SD и перемещения в регистры таймера.

Теперь я нашел трудный способ, которым библиотека SDFAT не любит интенсивные ISRS ЦП.
Это происходит как в COO, так и без COO, с обычной нагрузкой на одну задачу с загрузки с SD -карты, а таймер ISR перемещает данные в таймеры.
Что ж, симптомы заключаются в том, что доступ к SDCARD замедляется до ползания, и файл больше не играет правильно, он поворачивает один и тот же буфер на несколько раз, прежде чем другой будет загружен другой.
Когда я попробовал то же самое в COO, я вижу, что использование процессора до 100%, и иногда это даже влияет на экран. Я не уверен, что это вызывает, но я установил код SDFAT, чтобы не использовать DMA, и все еще происходит, так что не является библиотекой DMA.
Затем я попытался отключить таймер ISR и установить нагрузку буфера, чтобы продолжать перезагружать буферы, даже если ничто не пускает его, и тогда это больше не происходит. Таким образом, это кажется тяжелой обработкой в ​​таймере ISR, которая вызывает его.
Библиотека TMRPCM выполняет преобразование данных между 16 -битным и 8 -битным, а моно в стерео и даже корректировки громкости - все в таймере ISR, что, кажется, слишком много. Я измерил почти 10% использование процессора в таймере ISR, что, кажется, слишком много.
Итак, я собираюсь изменить часть WAV Timer ISR, чтобы просто сбросить буфер в регистры и переместить всю обработку данных в ту же задачу, которая загружает буферы. Таким образом, он будет читать буфер 512bytes, обработать его и написать его в новом буфере, чтобы таймер сбрасывался прямо в регистры.
Это поможет мне достичь другой цели, которая использует DMA в круговой режиме для сброса аудио буфера в таймер CCR. Таким образом, мне даже больше не нужен таймер ISR. Уменьшает использование процессора и уменьшает влияние ISR в библиотеке SDFAT, беспроигрышный :)

В любом случае, это видео игрока WAV, работающего на COO, одновременно вращается с кубиками, все еще много процессора осталось для других вещей
https: // www.YouTube.com/watch?v = difgit6bnjm

victor_pv
Ср. 8 июля 2015 г., 21:06
Рэй, вы являетесь мастером практических приложений.
Я хочу сделать простое хорошее приложение, показывающее функции RTOS, с дисплеем и игроком WAV.

Я могу позаботиться о звуковой игре, и у нас есть RTO и драйверы, работающие хорошо, но я никогда не писал ни одной системы меню.
Вы знаете любую библиотеку, которая может справиться с этим, или DO DO, вы можете указать мне на какой -то пример?

Я хочу сделать немного простым, чтобы просто показать функции, поэтому вместо того, чтобы 2 бессмысленных кубика вращались на экране, имели список файлов wav в папке и предоставили меню, которое вы можете прокручивать вверх и вниз, и нажимайте воспроизведение с еще один ключ. Это просто, нет необходимости в чем -то супер причудливом, хорошем чистом интерфейсе, возможно, просто выделяйте в другом цвете, какой вариант меню вы.

Кстати, я решил проблемы, которые я описал раньше, с замедлением SDFAT. Я обнаружил, что оставил кучу отладки сериала.Отпечатки включены, отключили их и решены проблемы. Получитель этого усиления заключается в том, что он заставил меня попробовать SDFAT на SPI2, поэтому я внес модификации в библиотеке SPI, чтобы выполнить передачи DMA в SPI2, и я избавился от прерываний для управления передачами DMA.

Mrburnette
Чт, 09 июля 2015 г. 12:53
victor_pv написал:Рэй, вы являетесь мастером практических приложений.
Я хочу сделать простое хорошее приложение, показывающее функции RTOS, с дисплеем и игроком WAV.
Я могу позаботиться о звуке, и у нас есть RTO и драйверы, работающие хорошо, но я никогда не писал никаких видов Система меню.
Вы знаете любую библиотеку, которая может справиться с этим, или DO DO, вы можете указать мне на какой -то пример?

victor_pv
Чт, 09 июля 2015 г., 16:00
Mrburnette написал:victor_pv написал:Рэй, вы являетесь мастером практических приложений.
Я хочу сделать простое хорошее приложение, показывающее функции RTOS, с дисплеем и игроком WAV.
Я могу позаботиться о звуке, и у нас есть RTO и драйверы, работающие хорошо, но я никогда не писал никаких видов Система меню.
Вы знаете любую библиотеку, которая может справиться с этим, или DO DO, вы можете указать мне на какой -то пример?

Mrburnette
Чт, 09 июля 2015 г., 17:46
victor_pv написал: <...>
Я думаю, что постараюсь просто представить список файлов wav на экране и использовать короткий нажмите, чтобы прокрутить следующую, нажмите Long, чтобы воспроизводить, долго нажмите, чтобы остановить.
Это сделало бы игрока WAV за 10 долларов ;)

victor_pv
Чт, 09 июля 2015 г., 19:35
Спасибо за все советы. Используя кнопку таким образом, мне нужна только 1 кнопка для многих вещей, и Mini уже включает в себя одну кнопку, поэтому один компонент, который мне нужно добавить ;)

Что вы думаете о чем -то вроде:
Печать экрана приветствия (хороший BMP, конечно, это одно из преимуществ использования SDCARD).
Если кнопка нажата в рамках Welcome Time Out, представьте короткое диагностическое меню.
Диагностика включает в себя проверку, присутствует ли SDCARD и отображение информации о ней, а также проведение короткого теста динамика с тоном.
Нажмите кнопку еще раз приведите вас к экрану игрока.
Экран игрока отображает все доступные дорожки, выделите первый.
Если ничего не преследует, начните играть с этим, и когда все закончится, перейдите к следующему и так далее.
Если пользователь нажимает кнопку, скажем, 2 секунды, начните играть на треке.
Если пользователь нажимает кнопку на 2 секунды во время игры.
Если пользователь нажимает кнопку на короткое время во время игры, выделите следующий трек, но ничего больше.
Если пользователь нажимает кнопку на 2 секунды, воспроизводите этот трек.

Так что в основном мне нужен один указатель на трек, который он сейчас играет, и один указатель на трек выделен, который может спуститься к следующему циклическому манеру.
Мне нужен массив со всеми обнаруженными динами. Указатели на воспроизводимый трек и выделенный трек - это просто указание на этот массив.

Я думаю, что это чисто и достаточно просто, не нуждается в Addional Adware Apneak Apen Maple Mini, дисплей с SDCARD и динамик. (Вероятно, MOSFET, конденсатор резистор для рудиментарного усилителя и фильтра с низким проходом). И это должно соответствовать слева в слева (сейчас занимает около 40 КБ, но удаление кубиков должно освободить некоторые), а в слевах оперативной памяти (остается около 4 или 5 кб, но удаление кубиков должно освободить некоторые). Я использую 2 x 1K буфера для таймеров, плюс 512bytes One для загрузки данных с SDCARD и кучу стеков для каждой задачи. Многое из этого можно уменьшить или уйти.
Я также планирую добавить опцию DMA в обновление Timer CCR, чтобы освободить циклы процессора.

Mrburnette
Чт, 09 июля 2015 11:40
victor_pv написал:Спасибо за все советы. Используя кнопку таким образом, мне нужна только 1 кнопка для многих вещей, и Mini уже включает в себя одну кнопку, поэтому один компонент, который мне нужно добавить ;)

Что вы думаете о чем -то вроде:

victor_pv
Солнце 26 июля 2015 г., 16:47
Mrburnette написал:victor_pv написал:Спасибо за все советы. Используя кнопку таким образом, мне нужна только 1 кнопка для многих вещей, и Mini уже включает в себя одну кнопку, поэтому один компонент, который мне нужно добавить ;)

Что вы думаете о чем -то вроде:

Rogerclark
Солнце 26 июля 2015 г. 9:19 вечера
Ультра круто..

Спасибо, что поделились

Mrburnette
Пн 27 июля 2015 г., 11:53
Очень хорошо!

Удивлен скоростью видео с декодированием звука. Потрясающий.

Луча

victor_pv
Пн 27 июля 2015 г. 12:43
Mrburnette написал:Очень хорошо!

Удивлен скоростью видео с декодированием звука. Потрясающий.

Луча

Rogerclark
Пн 27 июля 2015 г., 21:30
Виктор

Я не думаю, что вы улучшаете скорость этого кода. Таким образом, предполагая, что вы DMAING входного буфера, единственное улучшение скорости будет в LIB, когда он обрабатывает и воспроизводит аудиодата

victor_pv
Вт 28 июля 2015 г. 1:37 утра
Что ж, спасибо, что напомнили мне, потому что я забыл снова включить DMA в библиотеке SDFAT после того, как я отключил его, и не использовал DMA. Это побрило немного использования процессора, но я обнаружил небольшую ошибку в последнем коде для функций SPI.
В DMATRANSFER и 2 функциях DMASEND у нас есть эта линия:
uint8 b;

Теперь B не всегда инициализируется и может привести к тому, что случайное число возвращается в библиотеку SDFAT, которое влияет на некоторые случаи (довольно случайно, иногда он работает, иногда он выходит в руб. Содержание).

В какой -то момент я забыл инициализировать это до 0, поэтому нам просто нужно добавить линию рядом с ней:
b = 0;

Или изменить линию на
uint8 b = 0;

Это не влияет на работу DMA в библиотеке TFT, потому что не заботится о возвращенном значении, но библиотека SDFAT использует это значение для обнаружения, если перевод времена. С возвращенными значениями B, он думает.

Я не буду отправлять тягу, потому что мы не можем объединиться автоматически, так что в SPI.CPP, функции DMATRANSFER, DMASEND (для 8 бит) и другой DMASEND (на 16 бит), измените эту линию, чтобы инициализация B на 0.

Об улучшении вывода, на данный момент он проверяет только то, является ли звук моно или стерео, а затем сбрасывает значение из буфера в регистр таймера, но не выполняет никакого преобразования данных, которое выполняется в цикле выше, когда Данные читаются, поэтому я не думаю, что смогу значительно улучшить выходную часть, если я не сделаю это с DMA, который я тоже рассмотрел, но мне нужно тщательно планировать, потому что я уже использую 2 канала DMA для SPI1, 2 режима для SPI2 , и я планирую использовать еще 2 для IR TX и IR RX, это 6 каналов, поэтому мне нужно планировать, какие таймеры я буду использовать для каждой вещи, поэтому я не получаю 2 устройства, нуждающихся в одном и том же канале одновременно.

Цикл выше потребляет около 20% моего процессора :( Если я прочитаю 8 -битный ваг, который идет прямо в выходной буфер без обработки, я вижу, что на 20% меньше используемого времени ЦП, чем если бы я прочитал 16 -битный wav, который должен использовать цикл.

Rogerclark
Вт 28 июля 2015 г. 1:48
Виктор

Просто дайте мне знать, в какой его функции это функция, и я обновлю ее вручную

victor_pv
Вт 28 июля 2015 г. 1:55 утра
Rogerclark написал:Виктор

Просто дайте мне знать, в какой его функции это функция, и я обновлю ее вручную

Rogerclark
Вт 28 июля 2015 г. 2:01
Я прямо отредактировал файл в GitHub

https: // github.com/rogerclarkmelbourne/ ... RC/SPI.CPP

Можете ли вы быстро взглянуть и подтвердить, что я сделал правильные

Вассилис
Вт 28 июля 2015 г. 8:38 утра
ух ты! очень круто!
Молодец, Виктор

victor_pv
Вт 28 июля 2015 г. 13:13
Rogerclark написал:Я прямо отредактировал файл в GitHub

https: // github.com/rogerclarkmelbourne/ ... RC/SPI.CPP

Можете ли вы быстро взглянуть и подтвердить, что я сделал правильные

Вассилис
Вт 28 июля 2015 г. 15:19
victor_pv написал:Vassilis Спасибо, нет ничего близкого к полному манипуляционному игроку, но обеспечивает создание большего количества звуков, чем просто простой сигнал звукового сигнала :)
В какой -то момент я хочу попробовать перенести либмад или спираль в нашу ядро, для MCU с 48 КБ или более. Уже есть версии для STM32F1, но с использованием периферийной библиотеки STD. Это может помочь устранить 1 компонент в таких проектах, как ваш MP3 WebPlayer. и доска RC такая же цена или дешевле, чем доска декодеров MP3. Если вы чувствуете себя смелым, чтобы иметь дело с ЦАП и таймерами STM32, я могу передать вам ссылки с рабочими портами.

victor_pv
Вт 28 июля 2015 г. 16:29
Вассилис написал:victor_pv написал:Vassilis Спасибо, нет ничего близкого к полному манипуляционному игроку, но обеспечивает создание большего количества звуков, чем просто простой сигнал звукового сигнала :)
В какой -то момент я хочу попробовать перенести либмад или спираль в нашу ядро, для MCU с 48 КБ или более. Уже есть версии для STM32F1, но с использованием периферийной библиотеки STD. Это может помочь устранить 1 компонент в таких проектах, как ваш MP3 WebPlayer. и доска RC такая же цена или дешевле, чем доска декодеров MP3. Если вы чувствуете себя смелым, чтобы иметь дело с ЦАП и таймерами STM32, я могу передать вам ссылки с рабочими портами.

Вассилис
Вторник 28 июля 2015 г., 21:51
Я наконец -то заказал плату STM32F103Vet6 для ее тестирования. Он включает в себя все необходимые функции для декодирования MP3.
- 64 КБ ОЗУ
- 512 КБ вспышка
- 2 x i2s
- 2 X DAC

и многое другое...

Rogerclark
Вт 28 июля 2015 г. 22:16
Можете ли вы опубликовать ссылку на доску

Спасибо

Вассилис
Ср. 29 июля 2015 г., 6:05
Rogerclark написал:Можете ли вы опубликовать ссылку на доску

Спасибо

Rogerclark
Ср. 29 июля 2015 г. 6:10
ХОРОШО

У меня есть 2 или 3 из них

Мадиас
Ср. 29 июля 2015 г. 15:11
Имейте в виду, что эта доска STM32F103VET6 для почти 10 USD также имеет некоторые вкусности: У платы есть три чип -фабрика SO8, где SPI Flash 25Q16, EEPROM 24C02 были сварены, 485 сварки IC по их собственным потребностям (Каким бы ни был "485 IC"....)
http: // www.aliexpress.com/item/free-shi ... 80157.HTML
Я заказал это неделю назад, потому что я тоже хочу поиграть с i2s :)

Samghan20
Солнце 07 августа 2016 г., 19:05
Привет
Библиотека Witch TMRPCM работает в STM32?

Rogerclark
Солнце 07 августа 2016 11:31
Я не думаю, что кто -то на этом форуме перенесла эту библиотеку

Mrburnette
Пн, 8 августа 2016 г. 14:48
Rogerclark написал:Я не думаю, что кто -то на этом форуме перенесла эту библиотеку

Rogerclark
Пн, 8 августа 2016 г., 21:13
Спасибо, Рэй

Golpesar132
Ср 27 сентября 2017 г., 17:50
Есть ли простой пример для этой библиотеки и воспроизводить wav??
Что должно быть в моем wav file??