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

таймеры STM32F2xx

Не получается разобраться с модулями таймеров в ST'шных контроллерах.

 

Задача в следующем:

по трём линиям сформировать три одиночных последовательных импульса длительностью T, "дёрнуть" прерывание, посчитать T на следующий цикл, снова сформировать импульсы и т.д.

В общем случае количество линий может быть от 2 до 6, в данном случае, вроде б, ограничиваемся тремя.

post-35877-1370035667.png

 

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

Изучать, как запускать таймеры параллельно, не хочется. Должен быть более простой способ!

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


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

Что-то как-то глухо...

 

Задаю вопрос по-другому: если я заведу все 3 линии на TIM1_CH 1,2,3, у меня получится желаемое? Я не прошу писать за меня софт, мне пока что нужно сделать плату.

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


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

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

для этого есть режим one pulse в стм32

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


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

Если погрешность T может варьироваться в пределах до сотни тактов МК, то можно генерировать импульсы программно, как написал MK2.

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


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

Первый и третий импульсы сформировать можно, а вот со вторым беда.

Главная проблема - невозможность сформировать для одного пина два события за один период работы таймера.

Получается управлять положением только одного фронта импульса, другой фронт оказывается всегда привязан к концу периода.

Варианты как сделать:

1. формировать два выходных сигнала, потом из них на логике (И либо ИЛИ) сделать нужный импульс.

2. по событию (передний фронт) запускать другой таймер в режиме одновибратора на нужную длительность.

3. каждый импульс формировать в отдельном периоде таймера, при этом по DMA каждый раз перезагружать регистры таймера. Если времени много, можно и программно, по прерыванию от переполнения.

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


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

Ну вот, платы готовы, таймер запущен.

 

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

 

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

 

 

Кстати, дурацкий вопрос: у меня очень странно заработал DMA: пока размер данных NDTR=1, регистры обновлялись в совершенно произвольные моменты времени. Переделал на NDTR=2, сделав 2 копии одной и той же переменной, стало хорошо. Размер данных - 16 бит в передатчике (память) и приёмнике (таймер).

Как вариант, можно поставить 32 бита в приёмнике и передатчике, тогда работает с NDTR=1.

Это какая-то бага, или я что-то где-то недочитал?

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


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

Не получается разобраться с модулями таймеров в ST'шных контроллерах.

 

Задача в следующем:

по трём линиям сформировать три одиночных последовательных импульса длительностью T, "дёрнуть" прерывание, посчитать T на следующий цикл, снова сформировать импульсы и т.д.

В общем случае количество линий может быть от 2 до 6, в данном случае, вроде б, ограничиваемся тремя.

post-35877-1370035667.png

 

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

Изучать, как запускать таймеры параллельно, не хочется. Должен быть более простой способ!

 

Проще всего, мне кажется, сделать на одном таймере, в обработчике прерывания дергать gpio.

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


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

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).

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


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

В RM0033 этого упоминания не нашёл.

К тому же TIM1&TIM8 registers must be written by half-words (16 bits) or words (32 bits). (RM0033, page 332).

Извиняюсь, ночью было, не посмотрел, что серия F2.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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