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

 
 
 
Reply to this topicStart new topic
> STM32F4 срабатывает прерывание хотя таймер не включен
Xeon
сообщение Apr 27 2015, 14:46
Сообщение #1


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

Группа: Участник
Сообщений: 140
Регистрация: 21-04-11
Пользователь №: 64 524



Добрый день! Использую STM32F4DISCOVERY и Keil настраиваю таймер вот так:

Код
        // Timer initialization
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // APB1 div == 4, freq == 42 MGz
    
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_Prescaler = 42000 - 1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseStructure.TIM_Period = 1;
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    //TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    NVIC_EnableIRQ(TIM2_IRQn);

После того как отработает NVIC_EnableIRQ(TIM2_IRQn) сразу попадаю в прерывание. В регистре SR выставляется флаг UIF, пытался его сбросить используя TIM_ClearITPendingBit(TIM2, TIM_IT_Update); не помогло. Сам же таймер я включаю позже. Как правильно делать?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 27 2015, 15:14
Сообщение #2


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

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



Цитата(Xeon @ Apr 27 2015, 16:46) *
В регистре SR выставляется флаг UIF, пытался его сбросить используя TIM_ClearITPendingBit(TIM2, TIM_IT_Update); не помогло. Сам же таймер я включаю позже. Как правильно делать?

Включайте раньше, тогда, видимо, сбросите.
Go to the top of the page
 
+Quote Post
Xeon
сообщение Apr 27 2015, 17:11
Сообщение #3


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

Группа: Участник
Сообщений: 140
Регистрация: 21-04-11
Пользователь №: 64 524



Цитата(ViKo @ Apr 27 2015, 18:14) *
Включайте раньше, тогда, видимо, сбросите.


Спасибо за ответ. Мне необходимо запускать таймер когда по USART принимаю пакет для того, чтобы реализовать тайминг по приёму пакета, т.е. если во время приёма пакета между байтами превышен некоторый временной интервал, то считается что пакет отвалился. Это значит что таймер мне требуется запускать в момент приёма первого байта, и останавливать после приёма всего пакета. Т.е. таймер у меня всё время не будет запущен. Думаю косяк где-то в инициализации, пока не разобрался...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 27 2015, 17:19
Сообщение #4


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

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



Цитата(Xeon @ Apr 27 2015, 19:46) *
Код
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    //TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    NVIC_EnableIRQ(TIM2_IRQn);

Попробуйте поднять TIM_ClearITPendingBit(TIM2, TIM_IT_Update); ещё на одну строчку выше.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Xeon
сообщение Apr 28 2015, 13:16
Сообщение #5


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

Группа: Участник
Сообщений: 140
Регистрация: 21-04-11
Пользователь №: 64 524



Цитата(AHTOXA @ Apr 27 2015, 20:19) *
Попробуйте поднять TIM_ClearITPendingBit(TIM2, TIM_IT_Update); ещё на одну строчку выше.


Действительно помогло. Большое спасибо!)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 29 2015, 02:36
Сообщение #6


Гуру
******

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



Цитата(Xeon @ Apr 27 2015, 23:11) *
Спасибо за ответ. Мне необходимо запускать таймер когда по USART принимаю пакет для того, чтобы реализовать тайминг по приёму пакета, т.е. если во время приёма пакета между байтами превышен некоторый временной интервал, то считается что пакет отвалился.

Вообще-то для этой цели обычно в UART имеется флаг таймаута приёма (взводится если RX-буфер не пуст и в течение N бит подряд была тишина на RxD) и соответствующее ему прерывание.
Не знаю правда если он в STM-ных UART....
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Apr 29 2015, 07:25
Сообщение #7


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(jcxz @ Apr 29 2015, 05:36) *
Вообще-то для этой цели обычно в UART имеется флаг таймаута приёма (взводится если RX-буфер не пуст и в течение N бит подряд была тишина на RxD) и соответствующее ему прерывание.
Не знаю правда если он в STM-ных UART....

За годы форумной войны с реализацией уарта в STM можно было б матчасть и подтянуть...
Прерывание IDLE есть, срабатывает при паузе, равной одному байту (длина не настраивается).


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 29 2015, 09:06
Сообщение #8


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

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



Кстати, в STM32L0xx в USART добавили полноценный тайм-аут на приём (программируемой длительности) и управление сигналом DE для RS-485. Теперь USART как никогда близок к идеалуsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 17:47
Рейтинг@Mail.ru


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