【STM32F407开发板用户手册】第11章 STM32F407移植SEGGER的硬件异常分析

本文主要是介绍【STM32F407开发板用户手册】第11章 STM32F407移植SEGGER的硬件异常分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255

第11章       STM32F407移植SEGGER的硬件异常分析

本章节为大家介绍SEGGER的硬件异常分析代码在MDK和IAR中的使用方法,在实际项目中比较有实用价值,因为我们经常会遇到进入硬件异常的情况。

目录

第11章       STM32F407移植SEGGER的硬件异常分析

11.1 初学者重要提示

11.2 移植方法

11.3 MDK锁定硬件异常位置方法

11.4 IAR锁定硬件异常位置方法

11.5 硬件异常原因分析

11.6 IAR自带的硬件异常分析

11.7 实验例程

11.8 总结


 

11.1 初学者重要提示

  1.   MDK本身也是支持硬件异常分析的,就是不够直观,此贴是MDK的硬件异常分析文档:http://www.armbbs.cn/forum.php?mod=viewthread&tid=21940 。
  2.   IAR8带的硬件异常分析比较好用,在本章11.6小节有说明。

11.2 移植方法

直接移植SEGGER的硬件异常代码会有错误警告,这里针对IAR和MDK版本做了些简单修改,方便大家移植到自己的工程里面。

  •   MDK版本移植

源文件位于本章配套例子的\User\segger\HardFaultHandlerMDK文件夹,添加如下两个文件到工程里面即可。

  •   IAR版本移植

源文件位于本章配套例子的\User\segger\HardFaultHandlerIAR文件夹,添加如下两个文件到工程里面即可。

在文件SEGGER_HardFaultHandler.c里面都添加了串口打印功能,方便不用编译器的调试功能时,通过串口打印提示是否进入硬件异常。

#define ERR_INFO "\r\nEnter HardFault_Handler, System Halt.\r\n"#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、第1步:测试方法比较简单,进入调试状态,全速运行,然后按下K1按键,就会进入硬件异常中断,此时停止调试,程序就会自动定位到如下位置:

 

2、在Watch1窗口添加变量_Continue

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

 

11.4 IAR锁定硬件异常位置方法

以本章配套的例子为大家做个说明。

1、第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 furtherstatic struct {struct {volatile unsigned int r0;            // Register R0volatile unsigned int r1;            // Register R1volatile unsigned int r2;            // Register R2volatile unsigned int r3;            // Register R3volatile unsigned int r12;           // Register R12volatile unsigned int lr;            // Link registervolatile unsigned int pc;            // Program counterunion {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 activeunsigned int BUSFAULTACT    : 1;   // Read as 1 if bus fault exception is activeunsigned int UnusedBits1    : 1;unsigned int USGFAULTACT    : 1;   // Read as 1 if usage fault exception is activeunsigned int UnusedBits2    : 3;unsigned int SVCALLACT      : 1;   // Read as 1 if SVC exception is activeunsigned int MONITORACT     : 1;   // Read as 1 if debug monitor exception is activeunsigned int UnusedBits3    : 1;unsigned int PENDSVACT      : 1;   // Read as 1 if PendSV exception is activeunsigned int SYSTICKACT     : 1;   // Read as 1 if SYSTICK exception is activeunsigned int USGFAULTPENDED : 1;   // Usage fault pended; usage fault started but was replaced by ahigher-priority exceptionunsigned int MEMFAULTPENDED : 1;   //  Memory management fault pended; memory management fault startedbut was replaced by a higher-priority exceptionunsigned int BUSFAULTPENDED : 1;   // Bus fault pended; bus fault handler was started but was replacedby a higher-priority exceptionunsigned int SVCALLPENDED   : 1;   // SVC pended; SVC was started but was replaced by a higher-priorityexceptionunsigned int MEMFAULTENA    : 1;   // Memory management fault handler enableunsigned int BUSFAULTENA    : 1;   // Bus fault handler enableunsigned 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 实验例程

专门为本章节配套了一个例子:V5-001_移植SEGGER的硬件异常分析机制。大家可以按照本章教程提供的方法进行测试。

11.8 总结

除了SEGGER的硬件异常分析方案,建议也测试下MDK和IAR的,以后遇到硬件异常问题,解决起来可以得心应手。

 

这篇关于【STM32F407开发板用户手册】第11章 STM32F407移植SEGGER的硬件异常分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/502690

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Python异常处理之避免try-except滥用的3个核心原则

《Python异常处理之避免try-except滥用的3个核心原则》在Python开发中,异常处理是保证程序健壮性的关键机制,本文结合真实案例与Python核心机制,提炼出避免异常滥用的三大原则,有需... 目录一、精准打击:只捕获可预见的异常类型1.1 通用异常捕获的陷阱1.2 精准捕获的实践方案1.3

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏