Цитата(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, задав инкрементирование адреса периферии.