Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: таймеры STM32F2xx
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
esaulenka
Не получается разобраться с модулями таймеров в ST'шных контроллерах.

Задача в следующем:
по трём линиям сформировать три одиночных последовательных импульса длительностью T, "дёрнуть" прерывание, посчитать T на следующий цикл, снова сформировать импульсы и т.д.
В общем случае количество линий может быть от 2 до 6, в данном случае, вроде б, ограничиваемся тремя.
Нажмите для просмотра прикрепленного файла

На предыдущем изделии этим занимался модуль PWM в контроллере LPC, а тут - таймеров много, но как это сделать...
Изучать, как запускать таймеры параллельно, не хочется. Должен быть более простой способ!
esaulenka
Что-то как-то глухо...

Задаю вопрос по-другому: если я заведу все 3 линии на TIM1_CH 1,2,3, у меня получится желаемое? Я не прошу писать за меня софт, мне пока что нужно сделать плату.
MK2
можете поочередно одним таймером формировать последовательность импульсов, только каждый импульс нужно будет формировать программно, аппаратно без соединения таймеров не получится
для этого есть режим one pulse в стм32
MarYuriy
Если погрешность T может варьироваться в пределах до сотни тактов МК, то можно генерировать импульсы программно, как написал MK2.
SSerge
Первый и третий импульсы сформировать можно, а вот со вторым беда.
Главная проблема - невозможность сформировать для одного пина два события за один период работы таймера.
Получается управлять положением только одного фронта импульса, другой фронт оказывается всегда привязан к концу периода.
Варианты как сделать:
1. формировать два выходных сигнала, потом из них на логике (И либо ИЛИ) сделать нужный импульс.
2. по событию (передний фронт) запускать другой таймер в режиме одновибратора на нужную длительность.
3. каждый импульс формировать в отдельном периоде таймера, при этом по DMA каждый раз перезагружать регистры таймера. Если времени много, можно и программно, по прерыванию от переполнения.
esaulenka
Ну вот, платы готовы, таймер запущен.

Таймеры, надо заметить, крррайне замороченные. До меня дошли все тонкости только с третьего прочтения документации (до этого с STM не работал).

В итоге сделал на одном таймере и DMA, перезагружая TIM1->CCER новыми значениями.


Кстати, дурацкий вопрос: у меня очень странно заработал DMA: пока размер данных NDTR=1, регистры обновлялись в совершенно произвольные моменты времени. Переделал на NDTR=2, сделав 2 копии одной и той же переменной, стало хорошо. Размер данных - 16 бит в передатчике (память) и приёмнике (таймер).
Как вариант, можно поставить 32 бита в приёмнике и передатчике, тогда работает с NDTR=1.
Это какая-то бага, или я что-то где-то недочитал?
MarYuriy
Cкорее всего, см. RM0008 (стр. 270)
Addressing an AHB peripheral that does not support byte or halfword write
operations
Fujitser
Цитата(esaulenka @ Jun 1 2013, 03:34) *
Не получается разобраться с модулями таймеров в ST'шных контроллерах.

Задача в следующем:
по трём линиям сформировать три одиночных последовательных импульса длительностью T, "дёрнуть" прерывание, посчитать T на следующий цикл, снова сформировать импульсы и т.д.
В общем случае количество линий может быть от 2 до 6, в данном случае, вроде б, ограничиваемся тремя.
Нажмите для просмотра прикрепленного файла

На предыдущем изделии этим занимался модуль PWM в контроллере LPC, а тут - таймеров много, но как это сделать...
Изучать, как запускать таймеры параллельно, не хочется. Должен быть более простой способ!


Проще всего, мне кажется, сделать на одном таймере, в обработчике прерывания дергать gpio.
esaulenka
Цитата(MarYuriy @ Jul 4 2013, 01:59) *
Cкорее всего, см. RM0008 (стр. 270)
Addressing an AHB peripheral that does not support byte or halfword write
operations



В RM0033 этого упоминания не нашёл.
К тому же TIM1&TIM8 registers must be written by half-words (16 bits) or words (32 bits). (RM0033, page 332).
MarYuriy
Цитата(esaulenka @ Jul 4 2013, 11:18) *
В RM0033 этого упоминания не нашёл.
К тому же TIM1&TIM8 registers must be written by half-words (16 bits) or words (32 bits). (RM0033, page 332).

Извиняюсь, ночью было, не посмотрел, что серия F2.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.