esaulenka 7 31 мая, 2013 Опубликовано 31 мая, 2013 · Жалоба Не получается разобраться с модулями таймеров в ST'шных контроллерах. Задача в следующем: по трём линиям сформировать три одиночных последовательных импульса длительностью T, "дёрнуть" прерывание, посчитать T на следующий цикл, снова сформировать импульсы и т.д. В общем случае количество линий может быть от 2 до 6, в данном случае, вроде б, ограничиваемся тремя. На предыдущем изделии этим занимался модуль PWM в контроллере LPC, а тут - таймеров много, но как это сделать... Изучать, как запускать таймеры параллельно, не хочется. Должен быть более простой способ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 3 июня, 2013 Опубликовано 3 июня, 2013 · Жалоба Что-то как-то глухо... Задаю вопрос по-другому: если я заведу все 3 линии на TIM1_CH 1,2,3, у меня получится желаемое? Я не прошу писать за меня софт, мне пока что нужно сделать плату. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MK2 0 4 июня, 2013 Опубликовано 4 июня, 2013 · Жалоба можете поочередно одним таймером формировать последовательность импульсов, только каждый импульс нужно будет формировать программно, аппаратно без соединения таймеров не получится для этого есть режим one pulse в стм32 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kil00 0 7 июня, 2013 Опубликовано 7 июня, 2013 · Жалоба Если погрешность T может варьироваться в пределах до сотни тактов МК, то можно генерировать импульсы программно, как написал MK2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 8 июня, 2013 Опубликовано 8 июня, 2013 · Жалоба Первый и третий импульсы сформировать можно, а вот со вторым беда. Главная проблема - невозможность сформировать для одного пина два события за один период работы таймера. Получается управлять положением только одного фронта импульса, другой фронт оказывается всегда привязан к концу периода. Варианты как сделать: 1. формировать два выходных сигнала, потом из них на логике (И либо ИЛИ) сделать нужный импульс. 2. по событию (передний фронт) запускать другой таймер в режиме одновибратора на нужную длительность. 3. каждый импульс формировать в отдельном периоде таймера, при этом по DMA каждый раз перезагружать регистры таймера. Если времени много, можно и программно, по прерыванию от переполнения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 3 июля, 2013 Опубликовано 3 июля, 2013 · Жалоба Ну вот, платы готовы, таймер запущен. Таймеры, надо заметить, крррайне замороченные. До меня дошли все тонкости только с третьего прочтения документации (до этого с STM не работал). В итоге сделал на одном таймере и DMA, перезагружая TIM1->CCER новыми значениями. Кстати, дурацкий вопрос: у меня очень странно заработал DMA: пока размер данных NDTR=1, регистры обновлялись в совершенно произвольные моменты времени. Переделал на NDTR=2, сделав 2 копии одной и той же переменной, стало хорошо. Размер данных - 16 бит в передатчике (память) и приёмнике (таймер). Как вариант, можно поставить 32 бита в приёмнике и передатчике, тогда работает с NDTR=1. Это какая-то бага, или я что-то где-то недочитал? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kil00 0 3 июля, 2013 Опубликовано 3 июля, 2013 · Жалоба Cкорее всего, см. RM0008 (стр. 270) Addressing an AHB peripheral that does not support byte or halfword write operations Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Fujitser 0 4 июля, 2013 Опубликовано 4 июля, 2013 · Жалоба Не получается разобраться с модулями таймеров в ST'шных контроллерах. Задача в следующем: по трём линиям сформировать три одиночных последовательных импульса длительностью T, "дёрнуть" прерывание, посчитать T на следующий цикл, снова сформировать импульсы и т.д. В общем случае количество линий может быть от 2 до 6, в данном случае, вроде б, ограничиваемся тремя. На предыдущем изделии этим занимался модуль PWM в контроллере LPC, а тут - таймеров много, но как это сделать... Изучать, как запускать таймеры параллельно, не хочется. Должен быть более простой способ! Проще всего, мне кажется, сделать на одном таймере, в обработчике прерывания дергать gpio. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 4 июля, 2013 Опубликовано 4 июля, 2013 · Жалоба 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). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kil00 0 4 июля, 2013 Опубликовано 4 июля, 2013 · Жалоба В RM0033 этого упоминания не нашёл. К тому же TIM1&TIM8 registers must be written by half-words (16 bits) or words (32 bits). (RM0033, page 332). Извиняюсь, ночью было, не посмотрел, что серия F2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться