CAN 2 次初始化进 Hardfault 的问题分析
-
CAN 2 次初始化进 Hardfault 的问题分析
1.1 问题背景
- 硬件:MD14 开发板
- 软件:SDK 1_3_1
- 问题描述:
- 在主函数中进行 CAN 初始化,用中断打断这个初始化,然后在中断里重新做 CAN 初始化,中断弹回时会在当前位置跳入 Hardfault
1.2 问题分析
-
因为 CAN 部分寄存器涉及到冻结模式下才能进行配置,在 CAN 初始化的过程中用中断去打断他,打断的位置不确定,推断可能是冻结模式的切换导致 Hardfault
-
测试代码流程如下
-
测试结果,确实当 main 函数中的 CAN 初始化正在进行,此时被中断打断,中断中又执行了 CAN 初始化,当中断执行结束回到主程序时,就可能会进入 Hardfault,tmrCnt 的值代表进入中断的次数
-
验证猜想,是 Freeze Mode 导致的 Hardfault
a. Debug 在 FLEXCAN_ClearRAM 位置打断点,查看寄存器 CAN0 -> MRC -> FRZ 为 1 此时为冻结模式
b. 不触发定时器中断,让 FLEXCAN_ClearRAM 函数在非冻结模式下执行
c. 测试结果符合预期当在非冻结模式下去操作需要在冻结模式下操作的寄存器就会触发 Hardfault
1.3 解决方案
- 建议规避在 CAN 初始化过程中,触发其他中断,并且在触发的中断回调函数中又会对 CAN 进行初始化的操作
发帖前请查看
帮助没办法联网的电脑使用YCT
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...