реклама на сайте
подробности

 
 
> STM32f4 Basic timer?
TolikG
сообщение Nov 5 2014, 12:33
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071



Простейшая задача: при помощи таймера отсчитать задержку N микросекунд и выставить прерывание. Пол дня чтения мануала и гугля не дали результата. Все найденные примеры работают в цикле (проверил). Попытался запускать таймер однократно, а в обработчике прерывания - останавливать. После этого записываю новое значение задержки в прескаллер и снова запускаю таймер. Результат - желаемая задержка происходит не в текущем цикле таймера, а только в следующем. Мануал гласит, что регистры обновляются по событию переполнения таймера. Подскажите решение.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
Genadi Zawidowsk...
сообщение Nov 5 2014, 12:58
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Совет - сперва включить таймер, поставить значение для срабатывания, настроить прескалер, а потом разрешить счёт таймеру.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 5 2014, 13:33
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(TolikG @ Nov 5 2014, 17:33) *
Мануал гласит, что регистры обновляются по событию переполнения таймера. Подскажите решение.

Сгенерировать событие переполнения таймера вручную:
Код
TIM2->EGR |= TIM_EGR_UG;


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
TolikG
сообщение Nov 5 2014, 14:09
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 19-03-10
Пользователь №: 56 071



Цитата(AHTOXA @ Nov 5 2014, 16:33) *
Сгенерировать событие переполнения таймера вручную:
Код
TIM2->EGR |= TIM_EGR_UG;

Так пробовал, но при этом генерируется прерывание. Пришлось запретить прерывание, обновить регистры, очистить регистр статуса, разрешить прерывание... Криво как то, но заработало. Задержка при этом увеличилась по сравнению с циклическим примером
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 5 2014, 14:37
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Тогда сделайте иначе. Прескалер и ARR не трогайте, пусть таймер молотит постоянно по полному кругу, а интервал засекайте модулем сравнения:
Код
TIM2->CCR2 = TIM2->CNT + delay_value
;
Прерывание, соответственно, ловите от модуля сравнения.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
domowoj
сообщение Nov 5 2014, 16:46
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



У таймеров есть режимы предварительной записи,

// TIM2->CR1 |= TIM_CR1_ARPE;//Включен режим предварительной записи
//регистра автоперезагрузки
// TIM2->CCMR1 |= TIM_CCMR1_OC2PE;//Включен режим предварительной
//загрузки регистра сравнения

так вот выключите предварительную запись.


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01388 секунд с 7
ELECTRONIX ©2004-2016