历史上的今天
今天是:2024年08月27日(星期二)
2019年08月27日 | 【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析
2019-08-27 来源:eefocus
11.1 初学者重要提示
MDK本身也是支持硬件异常分析的,就是不够直观,此贴是MDK的硬件异常分析文档:
http://forum.armfly.com/forum.php?mod=viewthread&tid=21940 。
IAR8带的硬件异常分析比较好用,在本章11.6小节有说明。
11.2 移植方法
直接移植SEGGER的硬件异常代码会有错误警告,这里针对IAR和MDK版本做了些简单修改,方便大家移植到自己的工程里面。
MDK版本移植
源文件位于本章配套例子的UserseggerHardFaultHandlerMDK文件夹,添加如下两个文件到工程里面即可。

IAR版本移植
源文件位于本章配套例子的UserseggerHardFaultHandlerIAR文件夹,添加如下两个文件到工程里面即可。

在文件SEGGER_HardFaultHandler.c里面都添加了串口打印功能,方便不用编译器的调试功能时,通过串口打印提示是否进入硬件异常。
#define ERR_INFO "rnEnter HardFault_Handler, System Halt.rn"
#if 1
{
const char *pError = ERR_INFO;
uint8_t i;
for (i = 0; i < strlen(ERR_INFO); i++)
{
USART1->TDR = pError[i];
/* 等待发送结束 */
while((USART1->ISR & USART_ISR_TC) == 0);
}
}
#endif
11.3 MDK锁定硬件异常位置方法
以本章配套的例子为大家做个说明。
1、测试方法比较简单,进入调试状态,全速运行,然后按下K1按键,就会进入硬件异常中断,此时停止调试,程序就会自动定位到如下位置:

2、在Watch1窗口添加变量_Continue

3、修改为任何非0数值,就可以继续单步调试。这个代码后面还有一个第1步中的while循环,也可以继续采用第2步的方法修改。退出硬件异常后就是大家进入硬件异常前下一条要执行的指令(可能还是这个函数本身,因为一个函数由多个指令完成)。定位到出问题的位置:

11.4 IAR锁定硬件异常位置方法
以本章配套的例子为大家做个说明。
1、测试方法比较简单,进入调试状态,全速运行,然后按下K1按键,就会进入硬件异常中断,此时停止调试,程序就会自动定位到如下位置:

2、在Watch1窗口添加变量_Continue

3、修改为任何非0数值,就可以继续单步调试。这个代码后面还有一个第1步中的while循环,也可以继续采用第2步的方法修改。退出硬件异常后就是大家进入硬件异常前下一条要执行的指令(可能还是这个函数本身,因为一个函数由多个指令完成)。定位到出问题的位置:

11.5 硬件异常原因分析
SEGGER提供的这个机制查找出问题的位置比较方便,具体原因需要继续在调试界面里面添加HardFaultRegs结构变量,这个结构体变量添加了所有大家想看的东西。下面是MDK调试状态查看部分结构体数值:

具体上面的变量代表什么含义呢,代码里面有注释,查阅起来没有IAR自带的硬件异常提示方便(注意,下面的代码用到了位域)。
#if DEBUG
static volatile unsigned int _Continue; // Set this variable to 1 to run further
static struct {
struct {
volatile unsigned int r0; // Register R0
volatile unsigned int r1; // Register R1
volatile unsigned int r2; // Register R2
volatile unsigned int r3; // Register R3
volatile unsigned int r12; // Register R12
volatile unsigned int lr; // Link register
volatile unsigned int pc; // Program counter
union {
volatile unsigned int byte;
struct {
unsigned int IPSR : 8; // Interrupt Program Status register (IPSR)
unsigned int EPSR : 19; // Execution Program Status register (EPSR)
unsigned int APSR : 5; // Application Program Status register (APSR)
} bits;
} psr; // Program status register.
} SavedRegs;
union {
volatile unsigned int byte;
struct {
unsigned int MEMFAULTACT : 1; // Read as 1 if memory management fault is active
unsigned int BUSFAULTACT : 1; // Read as 1 if bus fault exception is active
unsigned int UnusedBits1 : 1;
unsigned int USGFAULTACT : 1; // Read as 1 if usage fault exception is active
unsigned int UnusedBits2 : 3;
unsigned int SVCALLACT : 1; // Read as 1 if SVC exception is active
unsigned int MONITORACT : 1; // Read as 1 if debug monitor exception is active
unsigned int UnusedBits3 : 1;
unsigned int PENDSVACT : 1; // Read as 1 if PendSV exception is active
unsigned int SYSTICKACT : 1; // Read as 1 if SYSTICK exception is active
unsigned int USGFAULTPENDED : 1; // Usage fault pended; usage fault started but was replaced by a
higher-priority exception
unsigned int MEMFAULTPENDED : 1; // Memory management fault pended; memory management fault started
but was replaced by a higher-priority exception
unsigned int BUSFAULTPENDED : 1; // Bus fault pended; bus fault handler was started but was replaced
by a higher-priority exception
unsigned int SVCALLPENDED : 1; // SVC pended; SVC was started but was replaced by a higher-priority
exception
unsigned int MEMFAULTENA : 1; // Memory management fault handler enable
unsigned int BUSFAULTENA : 1; // Bus fault handler enable
unsigned int USGFAULTENA : 1; // Usage fault handler enable
} bits;
} syshndctrl; // System Handler Control and State Register (0xE000ED24)
/* 省略未写 */
volatile unsigned int afsr; // Auxiliary Fault Status Register (0xE000ED3C), Vendor controlled (optional)
} HardFaultRegs;
#endif
11.6 IAR自带的硬件异常分析
还以本章配套的例子为例,进入调试状态,全速运行,然后按下K1按键,就会进入硬件异常中断,此时停止调试,IAR还会弹出一个硬件异常错误分析,刚进来的时候也许是个空白

单步调试刷新下就出来了:

指出了问题的原因是操作的数据地址有问题。
11.7 实验例程
专门为本章节配套了一个例子:V7-009_移植SEGGER的硬件异常分析机制。大家可以按照本章教程提供的方法进行测试。
11.8 总结
除了SEGGER的硬件异常分析方案,建议也测试下MDK和IAR的,以后遇到硬件异常问题,解决起来可以得心应手。
史海拾趣
|
据国外媒体报道,一家超强的山寨厂最近设计出一种令人匪夷所思的手机,它包含一个点烟器,可以通过隐藏在摄像头孔中的点烟器点香烟。 当然,这上去是个点烟器,实际上也是一台手机,它拥有2.5英寸触摸屏,3波段GSM,支持双SIM卡,还有130万像素摄 ...… 查看全部问答> |
|
【为C2000做贡献】TI DSP各款芯片的原理图和PCB图 供大家分享 TI DSP各款芯片的原理图和PCB图 供大家分享,可以加精不? [ 本帖最后由 fxw451 于 2011-4-7 09:30 编辑 ]… 查看全部问答> |
|
尽管我们不能改变制度,也不一定能够改变别人,但我们可以改变自己,因为没有人能够阻止我们不断进步,如果失败或者失意,那只能怪我们自己无能,怪我们自己不善于学习,不能怪别人没有给您机会,更不能怪这个社会...... ...… 查看全部问答> |
|
//**************************************** // 用按键控制LED的移位 // //**************************************** & ...… 查看全部问答> |
|
我在用MSP430编程给GPRS模块AT指令的时候,GPRS模块会返回比如“OK\"返回值,那么,我想在编程中检测到”ok\"后再进行下一条命令传输,我从哪个寄存器中去检测“ok\"呢?… 查看全部问答> |
|
请问各位大神,ADS1115的通道选择是怎么控制的啊,用AIN四个引脚怎么学配置呢?ADDR和ALERT/RDY引脚是怎么用的?加参考电压应该怎么加啊?转换之后的数据该怎么算呢?(全都选择默认设置:confige register:0x84和0x83)请求各位大神的帮助! … 查看全部问答> |




