打印
[APM32E1]

硬件报错快速定位方法

[复制链接]
685|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在实际调试项目过程中,有时候会进入硬件报错中断,然而代码体量较大时,逐条分析代码不实际,本篇文章就在调试过程中出现硬件报错后,该如何快速定位硬件报错代码的操作进行抛砖引玉。
1.模拟错误代码
使用APM32E103ZET6开发板,并配合附件测试代码模拟错误程序,具体错误操作如下:
volatile unsigned int* testdata1;  
unsigned int testdata2;
testdata1 = (unsigned int*)0x12345678;
testdata2 = *testdata1;
(void)testdata2;
如上代码中,testdata2 = *testdata1; 这里对testdata1 地址取值属于对非法地址取值。

2.使用Show Caller Code



如图所示,在发生HardFault后,在<Call Stack+Local>中找到<HardFault_Handler>右键找到<Show Caller Code>可以立即定位到出错代码大致位置。
注意,该方案在代码体量较大时,并不准确。


3.使用MSP/PSP定位出错代码
在发生HardFault后,通过查看LR寄存器,若LR=0xFFFF FFF9中bit 2 = 0,表示主堆栈(MSP)包含最近存储的寄存器值。反之,若BIT2=1,则线程堆栈 (PSP)包含最近存储的寄存器值。
在本实例中,bit2 =0,则MSP 的值为 0x20000690,在<Memory1>中查看如下图,找到对应LR以及PC的地址,在<Disassembly>中右键找到<Show Code at Address>并输入对应地址,即可以找到对应位置,结合代码逻辑进行分析。

4. 在工程中加载ARM内核故障文件
在原工程代码中加载<HardFaultHandler.s>以及<SEGGER_HardFaultHandler.c>文件,在工程运行到异常故障后,会进入<SEGGER_HardFaultHandler.c>中的<void HardFaultHandler(unsigned int* pStack) >文件后,通过HardFault结构体变量可以具体查看,LR/PC值,以及故障错误类型。







444444.png (348.15 KB )

444444.png

HardFault_Test.zip

5.3 MB

使用特权

评论回复
沙发
caigang13| | 2022-7-1 19:05 | 只看该作者
谢谢分享经验,学习了。

使用特权

评论回复
板凳
chenjun89| | 2022-7-3 10:06 | 只看该作者
谢谢楼主分享经验

使用特权

评论回复
地板
七毛钱| | 2022-7-4 15:54 | 只看该作者
宝剑锋从磨砺出,感谢楼主分享的宝贵经验

使用特权

评论回复
5
海滨消消| | 2022-7-7 09:27 | 只看该作者
很不错噢,挺有借鉴意义的

使用特权

评论回复
6
MessageRing| | 2022-10-4 21:01 | 只看该作者
感谢楼主的宝贵经验

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:极海半导体
简介:珠海极海半导体有限公司是一家致力于开发工业级/车规级微控制器、模拟与混合信号IC及系统级芯片的集成电路设计型企业。极海团队拥有20年集成电路设计经验和嵌入式系统开发能力,可为客户提供核心可靠的芯片产品及方案,实现准确感应、安全传输和实时控制,助力客户在智慧家居、高端消费电子、工业控制、汽车电子、智慧能源以及通信设施等领域的拓展创新。

5

主题

8

帖子

0

粉丝