- 平台:LPC1788
- 中断源:外部中断1(红外接收)
- 现象:红外解码失败。
正常情况下一次红外遥控按键应该产生16次外部中断。诊断代码却显示执行了32次外部中断服务函数,也就是说一次中断事件,产生了两次中断。以下将这种问题简称为中断执行异常问题。
期间排除掉红外遥控硬件电路、软件配置、红外遥控头输出波形、CPU勘误等可能性。
最后看到Keil官网知识库中一篇文章ARM: Cortex-M3/M4 Interrupts Happening Twice?,才确定问题所在。
这篇文章给出了以下信息:
- 所有Cortex-M3/M4内核处理器都有可能出现中断执行异常问题,无论是NXP还是ST…
- 有问题的CPU的所有中断都可能出现中断执行异常问题,无论是外部中断还是定时器中断…
哪些设备可能会出现中断执行异常:
- Cortex-M3/M4设计中增加了外部系统级写缓冲区,并且
- 清除中断标志代码位于中断服务程序的最后。
这是因为清除中断代码后立即退出中断,但由于外部系统级写缓冲区的存在,中断标志在退出中断后还没能清掉,导致再次触发中断。这意味着处理器指令执行速度越快,越容易出现这种问题。
所以解决办法就是确保中断清除掉再从中断服务程序中退出。可选的解决办法有:
- 清除中断代码稍微放前面一些(不一定彻底)
- 增加判断中断标志是否清除的代码