Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32f103
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
chOl
Вопрос к знатокам. Задача: одновременная работа 4-х, 8-ми разрядных PWM каналов, частота PWM > 32 kHz, значения в регистрах обновлять через 125uS, данные являются 8-ми разрядными выборками аудио сигналов и хранятся в 4-х flash массивах. Вопрос, возможно ли обойтись без обработчика прерываний, а использовать только DMA для циклической пересылки из flash в TIMx->CCRx? Использую контроллер STM32F103B (второй день нет результата). Пасиба.
KnightIgor
Цитата(chOl @ Apr 14 2011, 07:35) *
Вопрос к знатокам. Задача: одновременная работа 4-х, 8-ми разрядных PWM каналов, частота PWM > 32 kHz, значения в регистрах обновлять через 125uS, данные являются 8-ми разрядными выборками аудио сигналов и хранятся в 4-х flash массивах. Вопрос, возможно ли обойтись без обработчика прерываний, а использовать только DMA для циклической пересылки из flash в TIMx->CCRx? Использую контроллер STM32F103B (второй день нет результата). Пасиба.

Вопросом на вопрос: а зачем использовать прерывания? CCRx состоит по сути из двух регистров: рабочего (теневого, active), с которым происходит сравнение для выработки PWM, и защелки (хранения, preload), где содержится значение для сравнения. Таким образом, если установлен бит OCxPE регистра TIMx_CCMR1 (стр. 395 документа RM0008.PDF Doc ID 13902 Rev 12.), защелка переписывается аппаратно в рабочий регистр только в момент сравнения (match). То есть, запись в защелку можно производить в любой момент, а действовать новое знаение начнет синхронно, как только предыдущее значение "отыграет свое" в момент match.

А DMA использовать можно для записи в CCRx: см. регистр TIMx_DIER, стр. 390 документа RM0008.PDF Doc ID 13902 Rev 12, совместно с регистрами TIMx_DCR и TIMx_DMAR, стр. 403. Там хитро наворочено: DMA нужно указать регистр TIMx_DMAR в качестве регистра периферии, а регистром TIMx_DCR обозначить, куда же будут попадать данные. Или же можно воспользоваться тем фактом, что CCRx регистры каналов расположены по адресам друг за другом, и писать в них из DMA, задав инкрементирование адреса периферии.
koyodza
Цитата(chOl @ Apr 14 2011, 08:35) *
Вопрос к знатокам. Задача: одновременная работа 4-х, 8-ми разрядных PWM каналов, частота PWM > 32 kHz, значения в регистрах обновлять через 125uS, данные являются 8-ми разрядными выборками аудио сигналов и хранятся в 4-х flash массивах. Вопрос, возможно ли обойтись без обработчика прерываний, а использовать только DMA для циклической пересылки из flash в TIMx->CCRx? Использую контроллер STM32F103B (второй день нет результата). Пасиба.

Если хотите использовать один канал DMA, то так сделать не получится.
DMA не умеет пересылать по одному запросу некоторыми порциями.
Здесь или 1. использовать 4 таймера (по одному каналу DMA на каждый),
или 2. иметь прерывание после пересылки каждого блока данных, а блоком данных тогда будут значения для четырёх каналов, один сэмпл.

Кстати, тоже выводил звук через таймеры STM32 правда у меня только один канал.
Скажу, что обновлять значения в регистрах лучше всё-таки не 8кГц, а с передискретизацией. Я делал 24кГц, и два дополнительных отсчёта вычислял по соседним.
Ещё, если используется динамик прямо в устройстве, то можно подавать ШИМ прямо на него, не преобразовывая в аналоговый сигнал. Только буфер поставить, и отдельным сигналом отключать буфер когда ничего не выводится.
При тактовой таймера 24МГц вполне прилично получается вывод голосовых сообщений, записанных как 8ксэмплов/сек
Регулировка громкости тоже работает нормально, простым умножением
akimych
Вообще если я правильно понимаю смысл "DMA burst length" (в TIMx_DCR), то можно по одному запросу записать данные в неск. регистров таймера подряд. Только тогда данные должны быть не в 4х массивах, а в одном, где каждый элемент - 4 сэмпла для 4х каналов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.