糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > 洋桃技术支持0002:中断函数调用冲突问题

洋桃技术支持0002:中断函数调用冲突问题

时间:2020-12-13 22:20:01

相关推荐

洋桃技术支持0002:中断函数调用冲突问题

【洋桃技术支持】编号0002:中断函数调用冲突问题

提问:

杜老师,我的程序进入到中断之后,执行完一次中断就不返回主函数了,请问这是什么原因呢?

问题的扩展:

在开启中断函数后 (下图中的NVIC_Configuration函数),程序编译正常,但在单片机上运行时则会发生各种未知的错误。关掉中断后错误消失。这种因开启中断而产生的错误是什么原因导致的?

解答:

关于中断函数出错的问题,有很多可能的原因。比如中断重复触发、函数嵌套错误、中断向量控制器设置错误、电路设计问题等。

在使用洋桃开发板做中断实验的案例中,因为使用了洋桃现有硬件,可排除因电路设计导致的问题。如果是使用了洋桃的示例程序,也可以排除中断向量控制器设置错误的问题。这里要注意:如果您不是用我们的洋桃1号开发板,不是用我们的示例程序,则需要注意这两处问题。最后可能的就是中断重复触发、函数嵌套错误问题。

1,中断重复触发问题

重复触发一般出现在外部电平触发的情况,比如我们设置某一个IO接口在低电平时触发中断,当接口为低电平后,中断触发。可是中断处理函数执行完成退出后,外部接口还是低电平,这时又会再一次进入中断处理函数,只要低电平不离开,中断就会一直循环。给开发者的感觉就是中断不能退回到主函数的假象。

解决这个问题可以通过在中断触发后断开触发源,也就是让接口强制拉高,这样观察中断是否回到主函数。对于这种问题最好的方法就是把IO接口设置为使用“上升沿”或“下降沿”触发,这样可以保证只有接口从高到低电平,或从低到高电平的一瞬间触发,而在电平稳定在高或低的时候不重复触发。

2,函数嵌套错误问题

函数嵌套错误也是常见的问题。导致这种问题的原因是在主函数和中断处理函数里面都调用了同一个子函数。例如在主函数中调用了延时函数,而中断处理函数中也调用了延时函数。这时编译器就会报错,即使可以通过编译,程序也不能正常工作。因为在主函数中当程序执行到延时函数的时候触发了中断,那么中断处理函数又调用了一次延时函数,这时主函数中的延时函数的寄存器数据就会被中断处理函数中延时函数所替换。当程序回到主函数继续执行原来的延时函数时,其延时数据都是错误的,是被中断替换的错误数据。这会导致不可预知的问题。

解决方法是不要让主函数和中断处理函数调用同一个子函数。如果中断函数想用延时函数,那就专门为它写一个独立的延时函数。在洋桃1号开发板的示例程序中延时函数是使用嘀嗒定时器做计时的,如果要给中断处理函数加延时,可以独立写一个采用定时器2/3/4计时的延时函数,不要使用同一个定时器。假如是主函数与中断处理函数都要修改一组寄存器数据,可以在进入中断函数时,用程序把这组数据先复制到另一个不被修改的寄存器中,然后在退出中断处理程序时再把数据复制回原寄存器。这样就不会导致数据错乱了。

以上是我个人经验所总结的问题,可能在实践中还会有新的问题和原因,欢迎大家向我反馈,我会整理成技术支持文档,帮助更多人解决问题。谢谢。

如果觉得《洋桃技术支持0002:中断函数调用冲突问题》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。