STM32异常跳转Hardfault时,导致事故的问题追踪排查

MDK中调试,对hardfault的原因进行追踪:

主要是在debug中的寄存器窗口进行观察, LR寄存器是返回的地址, 可以看到出现事故后,成了FFFFFFF1, 也就是跳进了hardfault,

在该事故的SP堆栈寄存器上(R13), 找到当前的内存位置:0x2000015C0,并打开查看:

粗红框是hardfault, 不用管, 紧接着的地址是08007A0B, 查找汇编窗口, 观察到

也就是说,是由于该串口导致, 屏蔽后测试下:

问题解决。该问题是由于旧版库的调试单元的串口没有屏蔽导致。

同时也应证了一句流言:“Hardfault是个筐,什么都能往里装,出了问题看汇编,卡在B寄存器基本是中断出了问题”

### STM32 NMI中断使用教程及常见问题解决方案 #### 什么是NMI中断? 非屏蔽中断(Non-Maskable Interrupt, NMI)是一种特殊的硬件中断,在STM32微控制器中具有最高优先级。与其他可屏蔽中断不同,NMI无法通过软件禁用,因此它通常用于处理紧急事件或系统级别的异常情况。 在某些情况下,例如当Flash存储器发生ECC校验错误,可能会触发NMI中断[^2]。这种行为可能导致程序进入死循环或者停止运行,尤其是在未正确配置NMI中断的情况下。 --- #### 如何启用和配置NMI中断? 要使能并处理NMI中断,可以按照以下方法操作: 1. **设置向量表地址** 确保启动文件中的向量表指向正确的内存位置。如果使用了自定义的RAM加载地址,则需调整`SCB->VTOR`寄存器来指定新的向量表基址[^4]。 2. **编写NMI中断服务例程 (ISR)** 定义一个专门用来响应NMI事件的服务函数。以下是基于CMSIS标准的一个简单实现方式: ```c void NMI_Handler(void) { // 添加必要的调试信息打印语句以便定位问题根源 while(1); // 进入无限等待状态直到找到根本原因后再决定如何恢复执行流 } ``` 3. **检查可能引发NMI的原因** 对于特定型号如STM32Gx系列而言,已知存在因Flash ECC机制而导致意外激活的情况。此应仔细查阅数据手册确认是否有对应的位域可用于关闭该功能;另外还需排查是否存在其他潜在干扰源比如电源噪声等外界因素影响到正常工作模式下的MCU表现形式。 --- #### 常见问题及其解决办法 | 序号 | 描述 | 解决方案 | |------|------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 | 上电重启后直接卡住不动 | 如果怀疑是因为flash ecc error引起的nmi exception , 可尝试修改option bytes disable flash parity check feature . 同也要注意供电电压是否稳定可靠 | | 2 | 外设误触碰引起不必要跳转 | 查看电路设计图核实所有gpio pin初始状态下都处于预期逻辑电平; 若有必要的话增加适当拉电阻抗减少浮空输入带来的不确定性 | | 3 | 缺乏有效的错误捕捉手段 | 实现完善的fault handler structure including hard fault analysis toolchain integration so that developers can quickly identify where things went wrong | 上述表格列出了几个典型的场景以及相应的对策建议供参考学习之用. --- ```c // 示例代码片段展示如何捕获硬错并记录上下文环境变量值方便后续追踪分析过程 #include "stm32fxxx_it.h" void HardFault_Handler(void){ uint32_t stacked_r0; asm volatile ("TST lr, #4\n" "ITE EQ\n" "MRSEQ r0, MSP\n" "MRSNE r0, PSP"); stacked_r0 = *(uint32_t *)(__get_MSP()+8); Error_Handler(stacked_r0,__LINE__,__FILE__); } ``` --- #### 总结说明 通过对以上内容的学习理解可以帮助开发者更好地掌握关于stm32平台下有关non-maskable interrupt方面的基础知识要点及相关实践经验分享[^1]. 正确合理地运用这些技术能够有效提升系统的健壮性和鲁棒性能指标水平. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值