STM32L011:中断处理程序中无法清除中断标志

问题描述 投票:1回答:1

使用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
  }

我没有在互联网搜索中找到类似问题的提示。

c++ interrupt stm32 reset interrupt-handling
1个回答
1
投票

STM32L0x1 reference manual中LPTIM ICR寄存器中ARRMCF位的描述说:

向该位写入1将清除LPT_ISR寄存器中的ARRM标志。

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调试器,所以也许在调试器等你的时候可以冻结定时器。

© www.soinside.com 2019 - 2024. All rights reserved.