Перейти к содержанию
    

STM32F4 срабатывает прерывание хотя таймер не включен

Добрый день! Использую 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); не помогло. Сам же таймер я включаю позже. Как правильно делать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Включайте раньше, тогда, видимо, сбросите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Включайте раньше, тогда, видимо, сбросите.

 

Спасибо за ответ. Мне необходимо запускать таймер когда по USART принимаю пакет для того, чтобы реализовать тайминг по приёму пакета, т.е. если во время приёма пакета между байтами превышен некоторый временной интервал, то считается что пакет отвалился. Это значит что таймер мне требуется запускать в момент приёма первого байта, и останавливать после приёма всего пакета. Т.е. таймер у меня всё время не будет запущен. Думаю косяк где-то в инициализации, пока не разобрался...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    //TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    NVIC_EnableIRQ(TIM2_IRQn);

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Действительно помогло. Большое спасибо!)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ. Мне необходимо запускать таймер когда по USART принимаю пакет для того, чтобы реализовать тайминг по приёму пакета, т.е. если во время приёма пакета между байтами превышен некоторый временной интервал, то считается что пакет отвалился.

Вообще-то для этой цели обычно в UART имеется флаг таймаута приёма (взводится если RX-буфер не пуст и в течение N бит подряд была тишина на RxD) и соответствующее ему прерывание.

Не знаю правда если он в STM-ных UART....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще-то для этой цели обычно в UART имеется флаг таймаута приёма (взводится если RX-буфер не пуст и в течение N бит подряд была тишина на RxD) и соответствующее ему прерывание.

Не знаю правда если он в STM-ных UART....

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

Прерывание IDLE есть, срабатывает при паузе, равной одному байту (длина не настраивается).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...