Перейти к содержанию
    

STM32F207 - таймеры и DMA

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

 

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

 

Вопрос: что я делаю не так и как надо делать правильно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

пишут у таймера к DMA подкючают только TIM2_CHx, TIM2_UP

а регистр TIM2->ARR как к ним относится?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

пишут у таймера к DMA подкючают только TIM2_CHx, TIM2_UP

а регистр TIM2->ARR как к ним относится?

 

Если верить документации (RM0033 Reference manual), то TIM2_CHx и TIM2_UP это только запросы на ПДП, а ограничений на адреса как памяти, так и периферии я нигде не увидел. Какая разница потоку DMA откуда и куда писать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как я понял, используется режим DMA - M2M ?

Попробуйте в режиме отладки выдавать значения из таблицы не в TIM2->ARR, а в переменную. Чтобы разобратся, что именно глючит таймер или DMA

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как я понял, используется режим DMA - M2M ?

Попробуйте в режиме отладки выдавать значения из таблицы не в TIM2->ARR, а в переменную. Чтобы разобратся, что именно глючит таймер или DMA

 

TIM2->ARR - это регистр перезагрузки (до скольки считать) второго таймера, так что режим самый обычный: память->периферия.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

То есть в TIM2->DCR надо задать 0x002C (одна пересылка/смещение ARR), а затем в настройках DMA указать адрес периферии TIM2->DMAR? Я все правильно понял?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я все правильно понял?

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

 

TIM2->DCR = (&(TIM2->ARR) - &(TIM2->CR1))/sizeof(TIM2->CR1)

или

TIM2->DCR = offsetof(TIM_TypeDef, ARR)/4

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, правильно, только не 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: .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...