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