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

Все о микроконтроллерах: AVR, PIC, STM8, STM32, Arduino, Altera, Xilinx, все что угодно. Этот раздел для всего что клацает байтиками.
Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 29 авг 2013, 08:58

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

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

Код: Выделить всё

 
    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;


Ничего страшного - просто запускается таймер. Разрешено только прерывание по обновлению.

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

Код: Выделить всё

  extern "C" void TIM2_IRQHandler();
  void TIM2_IRQHandler()
  {
      TurnOn( TEST_PIN );
      TurnOff( TEST_PIN );
     
      TIM2->SR = 0; 
  }


Вопреки ожиданиям, на ножке появляется два прямоугольника:
double.png
double.png (2.66 КБ) 7058 просмотров


Тоесть, флаг не сбрасывается.

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

Код: Выделить всё

TIM2->SR = (uint16_t)~TIM_IT_Update;


Результат абсолютно тот-же. Самое интересное, что вызов функции из библиотеки работает правильно:

Код: Выделить всё

TIM_ClearITPendingBit(TIM2, TIM_IT_Update);


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

Код: Выделить всё

  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 КБ) 7058 просмотров


Если поставить TIM2->SR = 0; в начало прерывания, то флаг сбрасывается корректно.

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

Аватара пользователя
N1X
Сообщения: 321
Откуда: Беларусь, Гомель

Сообщение N1X » 29 авг 2013, 11:24

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

Вернуться в «Микроконтроллеры и ПЛИС»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 19 гостей