硬汉嵌入式论坛

 找回密码
 立即注册
查看: 8149|回复: 22
收起左侧

[NUCLEO-H743ZI] 【STM32H743实验例程】实验16:STM32H743移植SEGGER硬件异常分析代码,比较实用,含使用说明

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2018-4-24 01:57:42 | 显示全部楼层 |阅读模式
SEGGER 硬件异常代码和手册:
HardFaultHandler.zip (4.57 KB, 下载次数: 328)
AN00016_AnalyzingHardFaultsOnCortexM.pdf (103.64 KB, 下载次数: 387)

实验介绍
开发平台:官方STM32H743 NUCLEO板子
开发环境:MDK5.25正式版
软件版本:
(1)CMSIS软件包 V5.3.0
(2)H7的HAL库版本 V1.2.0

例程下载: 实验16:STM32H743移植SEGGER的硬件异常分析代码.7z (1.1 MB, 下载次数: 462)



1、测试方法比较简单,进入调试状态,全速运行,然后按下User按键,就好进入硬件异常中断,此时停止调试,程序就好自动定位到如下位置
QQ截图20180424015715.png

2、在Watch1窗口添加变量_Continue
QQ截图20180424015822.png

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


4、怎么查看原因分析,看这个,继续在Watch1里面添加HardFaultRegs结构变量,这个结构体变量添加了所有大家想看的东西
2018-04-24_020548.jpg


5、具体上面的变量代表什么含义呢,代码里面有详细注释

  1. /*********************************************************************
  2. *
  3. *       Static data
  4. *
  5. **********************************************************************
  6. */
  7. #if DEBUG
  8. static volatile unsigned int _Continue;  // Set this variable to 1 to run further

  9. static struct {
  10.   struct {
  11.     volatile unsigned int r0;            // Register R0
  12.     volatile unsigned int r1;            // Register R1
  13.     volatile unsigned int r2;            // Register R2
  14.     volatile unsigned int r3;            // Register R3
  15.     volatile unsigned int r12;           // Register R12
  16.     volatile unsigned int lr;            // Link register
  17.     volatile unsigned int pc;            // Program counter
  18.     union {
  19.       volatile unsigned int byte;
  20.       struct {
  21.         unsigned int IPSR : 8;           // Interrupt Program Status register (IPSR)
  22.         unsigned int EPSR : 19;          // Execution Program Status register (EPSR)
  23.         unsigned int APSR : 5;           // Application Program Status register (APSR)
  24.       } bits;
  25.     } psr;                               // Program status register.
  26.   } SavedRegs;

  27.   union {
  28.     volatile unsigned int byte;
  29.     struct {
  30.       unsigned int MEMFAULTACT    : 1;   // Read as 1 if memory management fault is active
  31.       unsigned int BUSFAULTACT    : 1;   // Read as 1 if bus fault exception is active
  32.       unsigned int UnusedBits1    : 1;
  33.       unsigned int USGFAULTACT    : 1;   // Read as 1 if usage fault exception is active
  34.       unsigned int UnusedBits2    : 3;
  35.       unsigned int SVCALLACT      : 1;   // Read as 1 if SVC exception is active
  36.       unsigned int MONITORACT     : 1;   // Read as 1 if debug monitor exception is active
  37.       unsigned int UnusedBits3    : 1;
  38.       unsigned int PENDSVACT      : 1;   // Read as 1 if PendSV exception is active
  39.       unsigned int SYSTICKACT     : 1;   // Read as 1 if SYSTICK exception is active
  40.       unsigned int USGFAULTPENDED : 1;   // Usage fault pended; usage fault started but was replaced by a higher-priority exception
  41.       unsigned int MEMFAULTPENDED : 1;   // Memory management fault pended; memory management fault started but was replaced by a higher-priority exception
  42.       unsigned int BUSFAULTPENDED : 1;   // Bus fault pended; bus fault handler was started but was replaced by a higher-priority exception
  43.       unsigned int SVCALLPENDED   : 1;   // SVC pended; SVC was started but was replaced by a higher-priority exception
  44.       unsigned int MEMFAULTENA    : 1;   // Memory management fault handler enable
  45.       unsigned int BUSFAULTENA    : 1;   // Bus fault handler enable
  46.       unsigned int USGFAULTENA    : 1;   // Usage fault handler enable
  47.     } bits;
  48.   } syshndctrl;                          // System Handler Control and State Register (0xE000ED24)

  49.   union {
  50.     volatile unsigned char byte;
  51.     struct {
  52.       unsigned char IACCVIOL    : 1;     // Instruction access violation
  53.       unsigned char DACCVIOL    : 1;     // Data access violation
  54.       unsigned char UnusedBits  : 1;
  55.       unsigned char MUNSTKERR   : 1;     // Unstacking error
  56.       unsigned char MSTKERR     : 1;     // Stacking error
  57.       unsigned char UnusedBits2 : 2;
  58.       unsigned char MMARVALID   : 1;     // Indicates the MMAR is valid
  59.     } bits;
  60.   } mfsr;                                // Memory Management Fault Status Register (0xE000ED28)

  61.   union {
  62.     volatile unsigned int byte;
  63.     struct {
  64.       unsigned int IBUSERR    : 1;       // Instruction access violation
  65.       unsigned int PRECISERR  : 1;       // Precise data access violation
  66.       unsigned int IMPREISERR : 1;       // Imprecise data access violation
  67.       unsigned int UNSTKERR   : 1;       // Unstacking error
  68.       unsigned int STKERR     : 1;       // Stacking error
  69.       unsigned int UnusedBits : 2;
  70.       unsigned int BFARVALID  : 1;       // Indicates BFAR is valid
  71.     } bits;
  72.   } bfsr;                                // Bus Fault Status Register (0xE000ED29)
  73.   volatile unsigned int bfar;            // Bus Fault Manage Address Register (0xE000ED38)

  74.   union {
  75.     volatile unsigned short byte;
  76.     struct {
  77.       unsigned short UNDEFINSTR : 1;     // Attempts to execute an undefined instruction
  78.       unsigned short INVSTATE   : 1;     // Attempts to switch to an invalid state (e.g., ARM)
  79.       unsigned short INVPC      : 1;     // Attempts to do an exception with a bad value in the EXC_RETURN number
  80.       unsigned short NOCP       : 1;     // Attempts to execute a coprocessor instruction
  81.       unsigned short UnusedBits : 4;
  82.       unsigned short UNALIGNED  : 1;     // Indicates that an unaligned access fault has taken place
  83.       unsigned short DIVBYZERO  : 1;     // Indicates a divide by zero has taken place (can be set only if DIV_0_TRP is set)
  84.     } bits;
  85.   } ufsr;                                // Usage Fault Status Register (0xE000ED2A)

  86.   union {
  87.     volatile unsigned int byte;
  88.     struct {
  89.       unsigned int UnusedBits  : 1;
  90.       unsigned int VECTBL      : 1;      // Indicates hard fault is caused by failed vector fetch
  91.       unsigned int UnusedBits2 : 28;
  92.       unsigned int FORCED      : 1;      // Indicates hard fault is taken because of bus fault/memory management fault/usage fault
  93.       unsigned int DEBUGEVT    : 1;      // Indicates hard fault is triggered by debug event
  94.     } bits;
  95.   } hfsr;                                // Hard Fault Status Register (0xE000ED2C)

  96.   union {
  97.     volatile unsigned int byte;
  98.     struct {
  99.       unsigned int HALTED   : 1;         // Halt requested in NVIC
  100.       unsigned int BKPT     : 1;         // BKPT instruction executed
  101.       unsigned int DWTTRAP  : 1;         // DWT match occurred
  102.       unsigned int VCATCH   : 1;         // Vector fetch occurred
  103.       unsigned int EXTERNAL : 1;         // EDBGRQ signal asserted
  104.     } bits;
  105.   } dfsr;                                // Debug Fault Status Register (0xE000ED30)

  106.   volatile unsigned int afsr;            // Auxiliary Fault Status Register (0xE000ED3C), Vendor controlled (optional)
  107. } HardFaultRegs;
  108. #endif
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2018-4-24 02:20:59 | 显示全部楼层
如果喜欢使用MDK自带的,看此贴即可:

http://www.armbbs.cn/forum.ph ... 2%BC%FE%D2%EC%B3%A3



配合MDK的Faults Report看效果更佳,其实就SEGGER做的结构体变量图形化展示。
1、选上自动更新
1.png

2、打开Fault Reports
2.png
1.png

3、出现异常时有更新
2.png






回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2018-4-24 02:37:04 | 显示全部楼层
QQ截图20180424023421.png
回复

使用道具 举报

2

主题

569

回帖

575

积分

金牌会员

积分
575
发表于 2018-4-24 03:12:58 | 显示全部楼层
https://github.com/armink/CmBacktrace
以前用这个东西,但是没有针对7…
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2018-4-24 10:40:15 | 显示全部楼层
使用貌似蛮复杂的啊
先收藏,以后有空再研究
回复

使用道具 举报

27

主题

272

回帖

353

积分

高级会员

积分
353
发表于 2018-4-24 13:25:49 | 显示全部楼层
MARK 一下
回复

使用道具 举报

6

主题

17

回帖

35

积分

新手上路

积分
35
发表于 2018-6-22 11:49:41 | 显示全部楼层
确实很有用,好贴
回复

使用道具 举报

82

主题

401

回帖

667

积分

金牌会员

积分
667
QQ
发表于 2018-7-7 20:35:48 | 显示全部楼层
根据多年经验,大部分是数组越界或者野指针造成内存方位错误造成的,建议楼主好好检查源程序。
武汉天纵鹏元科技有限公司。承接嵌入式项目开发,相关技术交流。STM32,物联网,工业控制方向。QQ  408137104
回复

使用道具 举报

82

主题

401

回帖

667

积分

金牌会员

积分
667
QQ
发表于 2018-7-7 20:36:52 | 显示全部楼层
雷鹏 发表于 2018-7-7 20:35
根据多年经验,大部分是数组越界或者野指针造成内存方位错误造成的,建议楼主好好检查源程序。

不好意思回复错了帖子
武汉天纵鹏元科技有限公司。承接嵌入式项目开发,相关技术交流。STM32,物联网,工业控制方向。QQ  408137104
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2018-7-8 03:49:10 | 显示全部楼层
雷鹏 发表于 2018-7-7 20:36
不好意思回复错了帖子

,没关系
回复

使用道具 举报

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
发表于 2018-7-22 09:15:38 | 显示全部楼层
进异常最大无非是两种:
内存溢出和硬件操作非法
这种异常调试能定位到出错的入口?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2018-7-22 09:45:46 | 显示全部楼层
jplzl10000 发表于 2018-7-22 09:15
进异常最大无非是两种:
内存溢出和硬件操作非法
这种异常调试能定位到出错的入口?

对,原理比较简单,进去后跳出来
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2018-9-27 14:53:09 | 显示全部楼层
本帖最后由 hpdell 于 2018-9-27 15:31 编辑
eric2013 发表于 2018-7-22 09:45
对,原理比较简单,进去后跳出来

这个方法有没有支持 iar 编译器的啊 ?

目前貌似只支持 mdk 的编译器
另外初始化时,如下的 两个函数貌似只使用了一个 ?

        SEGGER_RTT_Init();    这个是不是不需要进行初始化啊 ?????????????????????????
        SEGGER_RTT_ConfigUpBuffer(0, "RTT", 0, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);  是否只调用这个进行初始化就可以了啊  ???

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2018-9-28 00:34:01 | 显示全部楼层
hpdell 发表于 2018-9-27 14:53
这个方法有没有支持 iar 编译器的啊 ?

目前貌似只支持 mdk 的编译器

支持。

函数 SEGGER_RTT_Init();要初始化一下。
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2018-9-28 09:15:13 | 显示全部楼层
本帖最后由 hpdell 于 2018-9-28 11:08 编辑
eric2013 发表于 2018-9-28 00:34
支持。

函数 SEGGER_RTT_Init();要初始化一下。
没有看到支持 iar 编译器的 启动文件啊 ??
另外,如下几个寄存器是 H7 的,我想移植到 F7 上,但是在 F7 的参考资料里面没有找到这个几个寄存器的定义啊 ?
H7 的寄存器定义如下:
#define SYSHND_CTRL  (*(volatile unsigned int*)  (0xE000ED24u))  // System Handler Control and State Register
#define NVIC_MFSR    (*(volatile unsigned char*) (0xE000ED28u))  // Memory Management Fault Status Register
#define NVIC_BFSR    (*(volatile unsigned char*) (0xE000ED29u))  // Bus Fault Status Register
#define NVIC_UFSR    (*(volatile unsigned short*)(0xE000ED2Au))  // Usage Fault Status Register
#define NVIC_HFSR    (*(volatile unsigned int*)  (0xE000ED2Cu))  // Hard Fault Status Register
#define NVIC_DFSR    (*(volatile unsigned int*)  (0xE000ED30u))  // Debug Fault Status Register
#define NVIC_BFAR    (*(volatile unsigned int*)  (0xE000ED38u))  // Bus Fault Manage Address Register
#define NVIC_AFSR    (*(volatile unsigned int*)  (0xE000ED3Cu))  // Auxiliary Fault Status Register



请问一下你是在哪个资料里面找到的啊 ??


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2018-9-29 03:01:52 | 显示全部楼层
hpdell 发表于 2018-9-28 09:15
没有看到支持 iar 编译器的 启动文件啊 ??
另外,如下几个寄存器是 H7 的,我想移植到 F7 上,但是在 F7 ...

这些都在编程手册。
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2018-9-29 14:32:47 | 显示全部楼层
eric2013 发表于 2018-9-29 03:01
这些都在编程手册。

多谢多谢了啊,刚刚下载了,貌似 H7, F7 可以共用啊
回复

使用道具 举报

2

主题

33

回帖

39

积分

新手上路

积分
39
发表于 2023-8-21 12:50:35 来自手机 | 显示全部楼层
这个和调试器没关系吧,也不需要SWO功能吧
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2023-8-22 08:50:05 | 显示全部楼层
木偶 发表于 2023-8-21 12:50
这个和调试器没关系吧,也不需要SWO功能吧

不需要,这个是软件代码和下载器无关。
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2023-12-6 09:00:45 | 显示全部楼层
我通过这个抓取为什么r0-r3还有lr和pc都是0xffffffff,这个怎么分析,我通过人为的方法让程序死机他能正常抓取,这个现象是怎么回事
Snipaste_2023-12-06_08-48-59.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2023-12-7 08:07:22 | 显示全部楼层
随风了 发表于 2023-12-6 09:00
我通过这个抓取为什么r0-r3还有lr和pc都是0xffffffff,这个怎么分析,我通过人为的方法让程序死机他能正常 ...

1、寄存器值都无效,估计无法锁定原始位置了。
调整SEGGER硬件异常检测机制检查方法
https://www.armbbs.cn/forum.php?mod=viewthread&tid=103142

2、精确异常的话,这个BFSR的值是记录触发异常访问的位置,可以看下map文件,这个地方访问什么了
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2023-12-7 09:16:37 | 显示全部楼层
eric2013 发表于 2023-12-7 08:07
1、寄存器值都无效,估计无法锁定原始位置了。
调整SEGGER硬件异常检测机制检查方法
https://www.armbb ...

1、我使用J_LINK调试了8天一直不会出现这个问题,
     这个__asm("BKPT 0")代替断点,感觉和断点也没有什么区别,暂时不需要打这么多断点,
     通过这个帖子的方法把寄存器保存起来,然后出现后在通过J_LINK调试抓取,抓取结果如上,
2、map不是编译时生成的文件吗,其中主要保存一些变量函数地址,这个怎么查看BFSR的记录
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2023-12-7 10:43:52 | 显示全部楼层
随风了 发表于 2023-12-7 09:16
1、我使用J_LINK调试了8天一直不会出现这个问题,
     这个__asm("BKPT 0")代替断点,感觉和断点也没有 ...

可以看这个地址在那个范围里面。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 15:13 , Processed in 0.257748 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表