STM32: не сбрасываются флаги таймеров

Все о микроконтроллерах: AVR, PIC, STM8, STM32, Arduino, Altera, Xilinx, все что угодно. Этот раздел для всего что клацает байтиками.
Post Reply
User avatar
BSVi
Адепт
Posts: 3577
Joined: 15 Mar 2011, 12:32
Location: Киев

STM32: не сбрасываются флаги таймеров

Post by BSVi »

Есть камень, stm32f103c6. В нем, должны происходить прерывания по таймеру.

При инициализации, выполняется вот такое:

Code: Select all

 
    TIM2->PSC   = 24 - 1;                                        // 1us/tick
    TIM2->DIER =  TIM_DIER_UIE;

    TIM2->ARR   = period;
    TIM2->CCR1 = pw;
    TIM2->CCR2 = pw + timeout_us;

    NVIC_EnableIRQ(TIM2_IRQn);
    TIM2->CR1   = TIM_CR1_CEN;
Ничего страшного - просто запускается таймер. Разрешено только прерывание по обновлению.

Обработчик прерывания выглядит вот так:

Code: Select all

  extern "C" void TIM2_IRQHandler();
  void TIM2_IRQHandler()
  {
      TurnOn( TEST_PIN );
      TurnOff( TEST_PIN );
      
      TIM2->SR = 0;  
  }
Вопреки ожиданиям, на ножке появляется два прямоугольника:
double.png
double.png (2.66 KiB) Viewed 7120 times
Тоесть, флаг не сбрасывается.

Сначала, я подумал, что задеваю какие-то зарезервированные биты. Поэтому, сделал как в STMовской библиотеке:

Code: Select all

TIM2->SR = (uint16_t)~TIM_IT_Update;
Результат абсолютно тот-же. Самое интересное, что вызов функции из библиотеки работает правильно:

Code: Select all

TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
Хотя, там только одна строчка. После недолгих экспериментов, я обнаружил, что имеет значение сколько тактов остается до конца прерывания:

Code: Select all

  extern "C" void TIM2_IRQHandler();
  void TIM2_IRQHandler()
  {
      TurnOn( TEST_PIN );
      TurnOff( TEST_PIN );
      
      TIM2->SR = 0;  
      Nop();
      Nop();
  }
Выдает правильную картинку:
single.png
single.png (2.57 KiB) Viewed 7120 times
Если поставить TIM2->SR = 0; в начало прерывания, то флаг сбрасывается корректно.

Кто-нибуть сталкивался с таким?
User avatar
N1X
Posts: 321
Joined: 20 Sep 2011, 20:11
Location: Беларусь, Гомель

Re: STM32: не сбрасываются флаги таймеров

Post by N1X »

Не помню где, но в какой-то периферии я такое уже видел... Если слишком шустро, то тоже кажись влетал в хендлер второй раз... Вот только не помню stm8 или stm32... Причем мне сдается что это какой-то коммуникационный интерфейс был...
Post Reply