Полная версия этой страницы:
таймеры STM32F2xx
esaulenka
May 31 2013, 21:34
Не получается разобраться с модулями таймеров в ST'шных контроллерах.
Задача в следующем:
по трём линиям сформировать три одиночных последовательных импульса длительностью T, "дёрнуть" прерывание, посчитать T на следующий цикл, снова сформировать импульсы и т.д.
В общем случае количество линий может быть от 2 до 6, в данном случае, вроде б, ограничиваемся тремя.
Нажмите для просмотра прикрепленного файлаНа предыдущем изделии этим занимался модуль PWM в контроллере LPC, а тут - таймеров много, но как это сделать...
Изучать, как запускать таймеры параллельно, не хочется. Должен быть более простой способ!
esaulenka
Jun 3 2013, 20:04
Что-то как-то глухо...
Задаю вопрос по-другому: если я заведу все 3 линии на TIM1_CH 1,2,3, у меня получится желаемое? Я не прошу писать за меня софт, мне пока что нужно сделать плату.
можете поочередно одним таймером формировать последовательность импульсов, только каждый импульс нужно будет формировать программно, аппаратно без соединения таймеров не получится
для этого есть режим one pulse в стм32
MarYuriy
Jun 7 2013, 17:45
Если погрешность T может варьироваться в пределах до сотни тактов МК, то можно генерировать импульсы программно, как написал MK2.
Первый и третий импульсы сформировать можно, а вот со вторым беда.
Главная проблема - невозможность сформировать для одного пина два события за один период работы таймера.
Получается управлять положением только одного фронта импульса, другой фронт оказывается всегда привязан к концу периода.
Варианты как сделать:
1. формировать два выходных сигнала, потом из них на логике (И либо ИЛИ) сделать нужный импульс.
2. по событию (передний фронт) запускать другой таймер в режиме одновибратора на нужную длительность.
3. каждый импульс формировать в отдельном периоде таймера, при этом по DMA каждый раз перезагружать регистры таймера. Если времени много, можно и программно, по прерыванию от переполнения.
esaulenka
Jul 3 2013, 20:34
Ну вот, платы готовы, таймер запущен.
Таймеры, надо заметить, крррайне замороченные. До меня дошли все тонкости только с третьего прочтения документации (до этого с STM не работал).
В итоге сделал на одном таймере и DMA, перезагружая TIM1->CCER новыми значениями.
Кстати, дурацкий вопрос: у меня очень странно заработал DMA: пока размер данных NDTR=1, регистры обновлялись в совершенно произвольные моменты времени. Переделал на NDTR=2, сделав 2 копии одной и той же переменной, стало хорошо. Размер данных - 16 бит в передатчике (память) и приёмнике (таймер).
Как вариант, можно поставить 32 бита в приёмнике и передатчике, тогда работает с NDTR=1.
Это какая-то бага, или я что-то где-то недочитал?
MarYuriy
Jul 3 2013, 21:59
Cкорее всего, см. RM0008 (стр. 270)
Addressing an AHB peripheral that does not support byte or halfword write
operations
Fujitser
Jul 4 2013, 00:52
Цитата(esaulenka @ Jun 1 2013, 03:34)

Не получается разобраться с модулями таймеров в ST'шных контроллерах.
Задача в следующем:
по трём линиям сформировать три одиночных последовательных импульса длительностью T, "дёрнуть" прерывание, посчитать T на следующий цикл, снова сформировать импульсы и т.д.
В общем случае количество линий может быть от 2 до 6, в данном случае, вроде б, ограничиваемся тремя.
Нажмите для просмотра прикрепленного файлаНа предыдущем изделии этим занимался модуль PWM в контроллере LPC, а тут - таймеров много, но как это сделать...
Изучать, как запускать таймеры параллельно, не хочется. Должен быть более простой способ!
Проще всего, мне кажется, сделать на одном таймере, в обработчике прерывания дергать gpio.
esaulenka
Jul 4 2013, 08:18
Цитата(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
Jul 4 2013, 10:13
Цитата(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.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.