您的位置 首页 新能源

一个关于CAN出错中断重复呈现的论题

某日,有一客户反映他们在做STM32F407的CAN通信的出错测试时,发现出现类似死机的现象。后来跟踪调试发现是开启了出错中断,因其不停中断导…

某日,有一客户反映他们在做STM32F407的CAN通讯的犯错测验时,发现呈现相似死机的现象。后来盯梢调试发现是敞开了犯错中止,因其不断中止导致的形似死机现象。疑惑的是,经过进一步测验,发现即便铲除了“中止恳求标志”后也无效。大致景象如下:

在CAN通讯时分让某节点做插拔、断电等测验,人为的发生一些CAN总线过错,看看能否让总线康复正常。成果测验发现,假如总线呈现过错,并且打开了CAN过错中止处理的话,经过仿真器调试发现CPU一直在处理CAN过错中止,其他程序得不到处理而呈死机状况。先是置疑CAN控制器由于各类过错条件而进入过错中止后,虽在过错中止里铲除了相关中止状况标志,但由于计数器值没有清零的原因,立刻又发生新的过错中止,这样循环反复,导致其他程序得不到调度。

然后持续做试验,将CAN_IER寄存器中的LECIE和EWGIE这两种中止使能封闭掉,发现仍是有这个问题。客户觉得这样有点古怪。

从客户大略描绘的现象来看,很像没有铲除中止标志导致中止没完没了。经进一步的沟通了解,客户除了敞开相关收发中止外,还使能了LECIE、EWGIE、EPVIE、BOFIE、ERRIE跟犯错有关的中止,当然SLKIE和WKUIE没有使能。

结合CAN_IER和CAN_ESR寄存器的相关描绘,能够看出即便封闭了LECIE、EWGIE两个犯错条件,但还有EPVIE、BOFIE两种景象或许导致CAN犯错中止。

跟CAN犯错中止有关的寄存器首要涉及到3个,分别是CAN主控状况寄存器CAN_MSR,CAN中止使能寄存器CAN_IER,CAN过错状况寄存器CAN_ESR.说实在的,这个跟CAN犯错中止有关的东西仍是有点杂乱。看看下图,蓝色方框里的是各种过错中止的使能位,赤色方框里的是各类犯错条件或状况改变条件。请注意图中的与逻辑符号&和或逻辑符号+。

上图中下方与CAN_MSR相关的两类中止触发源跟本论题无关,就不提了,要点看看上方那四个与CAN犯错有关的中止源。

仔细的人会发现,其实CAN_IER中的ERRIE位是一个CAN犯错中止总开关,只有当它被使能的前提下,EWG、EPV、BOF、LEC四个中的一个或几个犯错事情合作各自的中止使能位才干发生犯错中止,并统一将CAN_MSR中的过错中止恳求ERRI方位1,然后恳求CAN过错中止。明显,CAN过错中止的恳求标志位是ERRI@CAN_MSR,而不是CAN_ESR中的EWGF\EPVF\BOFF的任一位。

聊到这儿,咱们根本对CAN犯错中止相关的寄存器和相关标志有了大致的了解。要掌握一点,CAN犯错中止有个总使能位ERRIE,其它几个犯错事情合作该总使能位终究发生过错中止恳求,置位ERRI@CAN_MSR。

回到上面的论题,当检查客户的CAN过错中止处理程序时,发现他在中止程序里的确是做了些标志的铲除【原意是想铲除中止恳求标志】。惋惜的是满是对CAN_ESR寄存器中的相关过错标志进行清零,即对LEC\EWGF\EPVF\BOFF这几个东西清零,偏偏没有对ERRI@CAN_MSR的清零。要害的东西成了漏网之鱼。

还有,他对EWGF\EPVF\BOFF这几个标志清零是无效的,由于这几个标志位是只读的,置1或清零是硬件依据TEC/REC的值动态处理的。

最终让客户把CAN犯错中止代码做些调整,在进入CAN犯错中止后将CAN_MSR中的ERRI位清0,的确能够处理过错中止循环往复的问题。

小结下,MCU中止行为一般涉及到使能标志、恳求标志和触发源。使用中偶然会呈现有人把中止使能标志和中止恳求标志弄混的状况。不过比较之下,这儿谈到的CAN犯错中止比较STMCU其它外设的中止使用就要杂乱或烦琐些,特别那个犯错中止恳求标志感觉有点隐晦。上面说到的事例,当事人或许没澄清CAN犯错中止恳求标志位到底是哪个,导致进入中止服务程序后铲除动作无效,使得犯错中止服务程序没完没了,并且还会影响到其它进程正常运转从而导致其它连锁反常。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/266535.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部