Page 1 of 1

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

Posted: 29 Aug 2013, 08:58
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 7116 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 7116 times
Если поставить TIM2->SR = 0; в начало прерывания, то флаг сбрасывается корректно.

Кто-нибуть сталкивался с таким?

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

Posted: 29 Aug 2013, 11:24
by N1X
Не помню где, но в какой-то периферии я такое уже видел... Если слишком шустро, то тоже кажись влетал в хендлер второй раз... Вот только не помню stm8 или stm32... Причем мне сдается что это какой-то коммуникационный интерфейс был...