使用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
}
我在互联网搜索中没有发现类似问题的提示。
答案 0 :(得分: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调试器,因此也许可以在调试器等待您时冻结计时器。