STM32L011:无法在中断处理程序中清除中断标志
STM32L011: Interrupt flag cannot be cleared in Interrupt Handler
使用 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
}
我在互联网搜索中没有发现有关类似问题的提示。
STM32L0x1参考手册中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调试器,所以也许计时器可以在调试器等待您时冻结。
相关文章:
- 清除前检查矢量
- 类成员和中断
- ifstream文件在从行中读取时被清除
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 我的代码运行良好,但在游戏循环中中断
- 使用带有MCP23017的 pigpio 进行中断读取
- 为什么我在 AVR 中的中断无法正常工作?
- 如何清除/清空已打开的文件C++
- 使用 UDP 中断 while()-循环
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何在 CompleteAsyncIO 中访问 IOMemoryBufferDescriptor,该描述符通过中断 EP
- 如何为伺服电机创建中断或返回值?
- 开关:无外壳中断
- 如何使用中断停止循环?
- 如何在 c++ 中清除矢量容量?
- 可以清除递归函数中的变量吗?
- 在清除 istream 之前,我不应该需要取消获取它吗?
- 结构成员在访问时被清除
- STM32L011:无法在中断处理程序中清除中断标志