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

 
 
> 32stmf0 timer interrupts, при инициализации СРАЗУ прерывает
alexf
сообщение Sep 28 2016, 02:20
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 420
Регистрация: 22-12-04
Пользователь №: 1 608



Прошу прощения ели тема поднималась - не нашел.
Проект на STM32F070. Timer3 используется для задержки. Простейший режим: считаем вверх до ARR, прерывание по переполнению. Почему то после инициализации первое прерывание происходит СРАЗУ. Вне зависимости от прескалера и ARR. А дальше все как и положено.

После долгих упражнений решил обмануть - первый раз жду переполнения, благо ждать микросекунды, и сбрасываю. Так работает, но как то коряво. В чем собственно корень зла?
Пробовал инизиализачию и через HAL и напрямую. Без разницы.
Код
void Timer3Init(void){

    int PrescalerValue = (uint32_t)(SystemCoreClock / 100000) - 1;
    TIM3->CR1 = 0;   // disable timer
    TIM3->PSC = PrescalerValue;
    TIM3->ARR = 2;
    TIM3->CR1 = TIM_CR1_CEN;   // Enable timer
    while((TIM3->SR & 1) == 0); // <*************** танец с бубном тут
    TIM3->CR1 = 0;   // disable timer
    NVIC_ClearPendingIRQ(TIM3_IRQn);
    NVIC_EnableIRQ(TIM3_IRQn); // Enable interrupt from TIM3 (NVIC level)
}

void StartTimer3(int timeout){
  Timer3Expired = 0;
  TIM3->CR1 = 0;   // disable timer
  TIM3->ARR = timeout / 10;
  TIM3->CR1 = TIM_CR1_CEN;   // Enable timer
  TIM3->SR = 0; // clear interrupt flag
  TIM3->DIER = TIM_DIER_UIE; // Enable update interrupt (timer level)
}

На разных форумах читал что похожая фигня на других линейках, но ответа нигде не нашел. Вдруг тут повезет?

Сообщение отредактировал IgorKossak - Sep 28 2016, 09:54
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ViKo
сообщение Sep 28 2016, 04:31
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Попробуйте очистить SR до того, как разрешите работу.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 28 2016, 04:51
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Перед тем как разрешать прерывания надо чистить и регистр флагов таймера и соответствующий бит в регистре NVIC.CLRPEND.
Go to the top of the page
 
+Quote Post
alexf
сообщение Sep 28 2016, 07:58
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 420
Регистрация: 22-12-04
Пользователь №: 1 608



Цитата(jcxz @ Sep 27 2016, 21:51) *
Перед тем как разрешать прерывания надо чистить и регистр флагов таймера и соответствующий бит в регистре NVIC.CLRPEND.


А "NVIC_ClearPendingIRQ(TIM3_IRQn);" не это делает?

SR чистил, не помогло.
Цитата
Дело в том, что регистр PSC (как и ARR, если мне не изменяет память) буферизован,


Я так понял что ARR может быть буферизован или нет в зависимости от CR1->ARPE. Но проблема не в PSC.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 28 2016, 09:49
Сообщение #5


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

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



Цитата(alexf @ Sep 28 2016, 12:58) *
Я так понял что ARR может быть буферизован или нет в зависимости от CR1->ARPE. Но проблема не в PSC.

Да, буферизация ARR отключается. (И вы ее отключили). А вот буферизация PSC - нет. Таким образом, вы думаете, что PSC равен PrescalerValue, а в действительности он у вас равен 0. Поэтому, когда вы задаёте ARR 2, то таймер срабатывает через 2 цикла.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alexf
сообщение Sep 28 2016, 21:08
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 420
Регистрация: 22-12-04
Пользователь №: 1 608



Цитата(AHTOXA @ Sep 28 2016, 02:49) *
Да, буферизация ARR отключается. (И вы ее отключили). А вот буферизация PSC - нет. Таким образом, вы думаете, что PSC равен PrescalerValue, а в действительности он у вас равен 0. Поэтому, когда вы задаёте ARR 2, то таймер срабатывает через 2 цикла.


Задаю ARR=2 я специально, когда ХОЧУ чтобы первое переполнение было быстрее. А пока этого не делал, в ARR записывал 1500, но все равно СРАЗУ происходило первое переполнение.
Возможно это делается специально чтобы записались ARR и PSC. В общем мой костыль работает надежно, так и оставлю.
Go to the top of the page
 
+Quote Post



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

 


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


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