STM32L011: флаг прерывания не может быть очищен в обработчике прерываний - PullRequest
1 голос
/ 30 марта 2019

Используя обработчик прерываний LPTIM1, мой код настроен на очистку флага прерывания сразу после ввода обработчика, но во время отладки флаг в «Регистре очистки прерываний» (ICR) не установлен на 0, и поэтому программа переходит прямо в обработчик прерываний после его выхода из-за ожидающего бита прерывания, установленного в «Регистре прерываний и состояний» (ISR)

Вот код:

extern "C" void LPTIM1_IRQHandler()
{
  if(LPTIM1->ISR && LPTIM_ISR_ARRM){         //check if Interrupt flag is set
 //   __disable_irq();
    LPTIM1->ICR |= LPTIM_ICR_ARRMCF;        //reset Interrupt flag in the "Clear"-Register
    flag_TimerInterrupt = true;             //set flag for enabling next LED-cycle
  }

Я не нашел никаких подсказок в поиске в интернете относительно подобных проблем.

1 Ответ

1 голос
/ 30 марта 2019

Описание бита ARRMCF в регистре ICT LPTIM в справочном руководстве STM32L0x1 гласит:

Запись 1 в этот бит очищает флаг ARRM в регистре LPT_ISR.

Сам бит ARRMCF - и все остальные биты в регистре ICR - не читаются, поэтому не следует ожидать получения какого-либо конкретного значения при их чтении. Фактически, ваш код, который использует |=, является подозрительным, потому что вы неявно говорите компилятору читать из этого регистра. Я думаю, что вы должны изменить его, чтобы использовать обычное назначение.

Кроме того, вы используете неправильный оператор C, чтобы проверить, установлен ли ваш флаг прерывания.

Кроме того, я не уверен, как битовые макросы определены в вашей среде, поэтому я буду в безопасности и не буду использовать их в коде, который я собираюсь представить.

Взяв все это вместе, я бы предложил изменить ваш код на:

extern "C" void LPTIM1_IRQHandler()
{
  if (LPTIM1->ISR & (1 << 1))
  {
    // ARRM interrupt flag is set, so clear it.
    LPTIM1->ICR = (1 << 1);
    flag_TimerInterrupt = true;
  }
}

Кроме того, если вы используете отладчик, вполне возможно, что это прерывание запускается таймером тысячи раз в секунду, пока отладчик ожидает вашего следующего действия. Если это так, вы никогда не сможете пошагово пройти через код основного цикла (код вне каких-либо прерываний). Возможно, вам придется просто отладить это на реальном оборудовании, пока оно не заработает. Вы можете использовать GPIO для получения информации о состоянии вашей программы и просмотра сигналов GPIO на осциллографе. Я не очень часто использовал отладчики STM32, поэтому, возможно, таймеры могут быть заморожены, пока отладчик ждет вас.

...