Gary_K 0 17 октября, 2013 Опубликовано 17 октября, 2013 · Жалоба Доброго здоровья всем присутствующим! Помогите добрым советом... На STM32F207 имеем спарку из двух таймеров - ведущий (TIM2) запускает ведомого (TIM9). Ведомый формирует импульс фиксированной длины в однократном режиме, меняя у ведущего ARR получаем частотно-импульсную модуляцию. Пока частота менялась раз в несколько миллисекунд задавал ARR из программы, теперь есть задача гораздо быстрей менять частоту по заданной таблице - решил использовать DMA. Настроил OC3 в TIM4 на выдачу запроса DMA со скоростью просмотра таблицы, в DMA1 зарядил Stream7/Channel_2 на выдачу данных таблицы в TIM2->ARR. Не заработало :(. Хочется именно DMA, так как прерываний и так хватает (еще и FreeRTOS крутится), а темп выдачи значений достаточно шустрый - 50мкс. С ЦАП и I2C запустить DMA получилось без вопросов. Вопрос: что я делаю не так и как надо делать правильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Falkon_99 0 17 октября, 2013 Опубликовано 17 октября, 2013 · Жалоба пишут у таймера к DMA подкючают только TIM2_CHx, TIM2_UP а регистр TIM2->ARR как к ним относится? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gary_K 0 17 октября, 2013 Опубликовано 17 октября, 2013 · Жалоба пишут у таймера к DMA подкючают только TIM2_CHx, TIM2_UP а регистр TIM2->ARR как к ним относится? Если верить документации (RM0033 Reference manual), то TIM2_CHx и TIM2_UP это только запросы на ПДП, а ограничений на адреса как памяти, так и периферии я нигде не увидел. Какая разница потоку DMA откуда и куда писать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Falkon_99 0 17 октября, 2013 Опубликовано 17 октября, 2013 · Жалоба Как я понял, используется режим DMA - M2M ? Попробуйте в режиме отладки выдавать значения из таблицы не в TIM2->ARR, а в переменную. Чтобы разобратся, что именно глючит таймер или DMA Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 17 октября, 2013 Опубликовано 17 октября, 2013 · Жалоба У таймера есть регистры TIMx_DCR и TIMx_DMAR, они специально сделаны для обновления прочих регистров таймера через DMA. На F20x не проверял, а с F100 и F103 передача по DMA напрямую в регистры таймера тоже не заработала, а через TIMx_DMAR завелось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gary_K 0 17 октября, 2013 Опубликовано 17 октября, 2013 · Жалоба Как я понял, используется режим DMA - M2M ? Попробуйте в режиме отладки выдавать значения из таблицы не в TIM2->ARR, а в переменную. Чтобы разобратся, что именно глючит таймер или DMA TIM2->ARR - это регистр перезагрузки (до скольки считать) второго таймера, так что режим самый обычный: память->периферия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gary_K 0 17 октября, 2013 Опубликовано 17 октября, 2013 · Жалоба У таймера есть регистры TIMx_DCR и TIMx_DMAR, они специально сделаны для обновления прочих регистров таймера через DMA. На F20x не проверял, а с F100 и F103 передача по DMA напрямую в регистры таймера тоже не заработала, а через TIMx_DMAR завелось. То есть в TIM2->DCR надо задать 0x002C (одна пересылка/смещение ARR), а затем в настройках DMA указать адрес периферии TIM2->DMAR? Я все правильно понял? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 17 октября, 2013 Опубликовано 17 октября, 2013 · Жалоба Я все правильно понял? Да, правильно, только не 0x002C, а смещение до регистра в словах. TIM2->DCR = (&(TIM2->ARR) - &(TIM2->CR1))/sizeof(TIM2->CR1) или TIM2->DCR = offsetof(TIM_TypeDef, ARR)/4 и DMA должно писать в DMAR 32-битными словами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gary_K 0 17 октября, 2013 Опубликовано 17 октября, 2013 · Жалоба Да, правильно, только не 0x002C, а смещение до регистра в словах. TIM2->DCR = (&(TIM2->ARR) - &(TIM2->CR1))/sizeof(TIM2->CR1) или TIM2->DCR = offsetof(TIM_TypeDef, ARR)/4 и DMA должно писать в DMAR 32-битными словами. Фантастика! Действительно заработало - огромное спасибо SSerge, но кто бы мог подумать... Во-первых, механизм работы через DCR/DMAR в основном описании таймеров отсутствует - есть только описание самих регистров, но туда далеко не все заглядывают (особенно при работе через библиотеки периферии). Во-вторых, DMA и в самом деле заработал только при описании и массива в памяти и регистра DMAR как 32-битных слов, и это при том, что в перечислении основных функций DMA заявлено автоматическое преобразование форматов, а сам регистр DMAR в библиотеке описан как uint16_t. Зело загадочна микросхема STM32F207 . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться