Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4 срабатывает прерывание хотя таймер не включен
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Xeon
Добрый день! Использую 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); не помогло. Сам же таймер я включаю позже. Как правильно делать?
ViKo
Цитата(Xeon @ Apr 27 2015, 16:46) *
В регистре SR выставляется флаг UIF, пытался его сбросить используя TIM_ClearITPendingBit(TIM2, TIM_IT_Update); не помогло. Сам же таймер я включаю позже. Как правильно делать?

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


Спасибо за ответ. Мне необходимо запускать таймер когда по USART принимаю пакет для того, чтобы реализовать тайминг по приёму пакета, т.е. если во время приёма пакета между байтами превышен некоторый временной интервал, то считается что пакет отвалился. Это значит что таймер мне требуется запускать в момент приёма первого байта, и останавливать после приёма всего пакета. Т.е. таймер у меня всё время не будет запущен. Думаю косяк где-то в инициализации, пока не разобрался...
AHTOXA
Цитата(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); ещё на одну строчку выше.
Xeon
Цитата(AHTOXA @ Apr 27 2015, 20:19) *
Попробуйте поднять TIM_ClearITPendingBit(TIM2, TIM_IT_Update); ещё на одну строчку выше.


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

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

За годы форумной войны с реализацией уарта в STM можно было б матчасть и подтянуть...
Прерывание IDLE есть, срабатывает при паузе, равной одному байту (длина не настраивается).
AHTOXA
Кстати, в STM32L0xx в USART добавили полноценный тайм-аут на приём (программируемой длительности) и управление сигналом DE для RS-485. Теперь USART как никогда близок к идеалуsm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.