реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F207 - таймеры и DMA, Как настроить DMA для таймеров
Gary_K
сообщение Oct 17 2013, 06:42
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 23-06-09
Из: Саратов
Пользователь №: 50 555



Доброго здоровья всем присутствующим! Помогите добрым советом...

На STM32F207 имеем спарку из двух таймеров - ведущий (TIM2) запускает ведомого (TIM9). Ведомый формирует импульс фиксированной длины в однократном режиме, меняя у ведущего ARR получаем частотно-импульсную модуляцию. Пока частота менялась раз в несколько миллисекунд задавал ARR из программы, теперь есть задача гораздо быстрей менять частоту по заданной таблице - решил использовать DMA. Настроил OC3 в TIM4 на выдачу запроса DMA со скоростью просмотра таблицы, в DMA1 зарядил Stream7/Channel_2 на выдачу данных таблицы в TIM2->ARR. Не заработало sad.gif. Хочется именно DMA, так как прерываний и так хватает (еще и FreeRTOS крутится), а темп выдачи значений достаточно шустрый - 50мкс. С ЦАП и I2C запустить DMA получилось без вопросов.

Вопрос: что я делаю не так и как надо делать правильно?
Go to the top of the page
 
+Quote Post
Falkon_99
сообщение Oct 17 2013, 07:33
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 26-03-12
Из: Харьков
Пользователь №: 71 010



пишут у таймера к DMA подкючают только TIM2_CHx, TIM2_UP
а регистр TIM2->ARR как к ним относится?
Go to the top of the page
 
+Quote Post
Gary_K
сообщение Oct 17 2013, 07:42
Сообщение #3





Группа: Новичок
Сообщений: 5
Регистрация: 23-06-09
Из: Саратов
Пользователь №: 50 555



Цитата(Falkon_99 @ Oct 17 2013, 11:33) *
пишут у таймера к DMA подкючают только TIM2_CHx, TIM2_UP
а регистр TIM2->ARR как к ним относится?


Если верить документации (RM0033 Reference manual), то TIM2_CHx и TIM2_UP это только запросы на ПДП, а ограничений на адреса как памяти, так и периферии я нигде не увидел. Какая разница потоку DMA откуда и куда писать?
Go to the top of the page
 
+Quote Post
Falkon_99
сообщение Oct 17 2013, 07:55
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 26-03-12
Из: Харьков
Пользователь №: 71 010



Как я понял, используется режим DMA - M2M ?
Попробуйте в режиме отладки выдавать значения из таблицы не в TIM2->ARR, а в переменную. Чтобы разобратся, что именно глючит таймер или DMA
Go to the top of the page
 
+Quote Post
SSerge
сообщение Oct 17 2013, 08:15
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



У таймера есть регистры TIMx_DCR и TIMx_DMAR, они специально сделаны для обновления прочих регистров таймера через DMA.
На F20x не проверял, а с F100 и F103 передача по DMA напрямую в регистры таймера тоже не заработала, а через TIMx_DMAR завелось.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Gary_K
сообщение Oct 17 2013, 09:05
Сообщение #6





Группа: Новичок
Сообщений: 5
Регистрация: 23-06-09
Из: Саратов
Пользователь №: 50 555



Цитата(Falkon_99 @ Oct 17 2013, 11:55) *
Как я понял, используется режим DMA - M2M ?
Попробуйте в режиме отладки выдавать значения из таблицы не в TIM2->ARR, а в переменную. Чтобы разобратся, что именно глючит таймер или DMA


TIM2->ARR - это регистр перезагрузки (до скольки считать) второго таймера, так что режим самый обычный: память->периферия.
Go to the top of the page
 
+Quote Post
Gary_K
сообщение Oct 17 2013, 10:12
Сообщение #7





Группа: Новичок
Сообщений: 5
Регистрация: 23-06-09
Из: Саратов
Пользователь №: 50 555



Цитата(SSerge @ Oct 17 2013, 12:15) *
У таймера есть регистры TIMx_DCR и TIMx_DMAR, они специально сделаны для обновления прочих регистров таймера через DMA.
На F20x не проверял, а с F100 и F103 передача по DMA напрямую в регистры таймера тоже не заработала, а через TIMx_DMAR завелось.


То есть в TIM2->DCR надо задать 0x002C (одна пересылка/смещение ARR), а затем в настройках DMA указать адрес периферии TIM2->DMAR? Я все правильно понял?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Oct 17 2013, 11:35
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(Gary_K @ Oct 17 2013, 17:12) *
Я все правильно понял?

Да, правильно, только не 0x002C, а смещение до регистра в словах.

TIM2->DCR = (&(TIM2->ARR) - &(TIM2->CR1))/sizeof(TIM2->CR1)
или
TIM2->DCR = offsetof(TIM_TypeDef, ARR)/4

и DMA должно писать в DMAR 32-битными словами.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Gary_K
сообщение Oct 17 2013, 16:30
Сообщение #9





Группа: Новичок
Сообщений: 5
Регистрация: 23-06-09
Из: Саратов
Пользователь №: 50 555



Цитата(SSerge @ Oct 17 2013, 15:35) *
Да, правильно, только не 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 wacko.gif .
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 02:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016