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

发布者:点亮未来最新更新时间:2022-04-13 来源: eefocus关键字:STM32F429  移植  SEGGER  硬件异常 手机看文章 扫描二维码
随时随地手机看文章

11.1 初学者重要提示

MDK本身也是支持硬件异常分析的,就是不够直观,此贴是MDK的硬件异常分析文档:http://www.armbbs.cn/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、第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 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 实验例程

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


11.8 总结

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

关键字:STM32F429  移植  SEGGER  硬件异常 引用地址:第11章 STM32F429移植SEGGER的硬件异常分析

上一篇:第12章 STM32F429的HAL库框架设计学习
下一篇:第10章 STM32F429的FLASH,RAM和栈使用情况(map和htm文件)

推荐阅读最新更新时间:2024-11-07 11:22

ucosii在stm32上的移植详解3
移植详解1和2中主要讲了移植需要用到的基础知识,本文则对具体的移植过程进行介绍。 首先从micrium网站上下载官方移植版本(编译器使用ARM/Keil的,V2.86版本,V2.85有问题)。 下载地址: http://micrium.com/page/downloads/ports/st/stm32 解压缩后得到如下文件夹和文件: Micrium\ AppNotes Licensing Software ReadMe.pdf AppNotes包含ucosii移植说明文件。这两个文件中我们仅需关心Micrium\AppNotes\AN1xxx-RTOS\AN1018-uCO
[单片机]
基于S3C2440的Linux内核移植和yaffs2文件系统制作-- 配置Linux内核
1.3.3 配置Linux内核 1、 进入Linux-2.6.29.1内核主目录,通过以下命令将2410的默认配置文件写到当前目录下的.config。S3C2410的配置和S3C2440差不多,,在这基础上进行修改。 make s3c2410_defconfig 2、 配置内核模块的功能,有几种方式可以进行界面选择: make menuconfig(文本选单的配置方式,在有字符终端下才能使用) make xconfig(图形窗口模式的配置方式,图形窗口的配置比较直观,必须支持Xwindow下才能使用) make oldconfig(文本配置方式,在原内核配置的基础修改时使用) 这里使用make menuconfi
[单片机]
Linux-2.6.32.2内核在mini2440上的移植(十二)---移植I2C EEPROM驱动
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 【1】在内核中配置I2C 驱动 Linux-2.6.32.2 对S2C2440 的I
[单片机]
第10章 STM32F429的FLASH,RAM和栈使用情况(map和htm文件)
10.1 初学者重要提示 1、为了更好的学习本章知识点,可以看之前做的视频教程第11章: http://www.armbbs.cn/forum.php?mod=viewthread&tid=15408 。 2、本章节以MDK为例进行说明,使用IAR同理。 10.2 MAP文件分析 通过map文件,可以方便的查看工程ROM/FLASH和RAM的占用情况,包括单个源文件,甚至具体到每个函数的rom大小都给出了,通过这些信息可以很好的进行代码优化。MAP文件的内容可分为如下几部分: Section Cross References Removing Unused input sections from the ima
[单片机]
第10章 <font color='red'>STM32F429</font>的FLASH,RAM和栈使用情况(map和htm文件)
021_STM32程序移植之_ESP8266连接onenet
本次教程是使用STM32C8T6通过ESP8266-12F模块将数据传输到ONENET云端去,并且云端能够下发命令给单片机来实现云端控制。本次实验硬件设备:STM32C8T6最小系统,ESP8266-12F模块,wifi。下面是简单的设备传输结构图: /********************************神奇的分割线********************************/ 视频演示教程:https://v.qq.com/x/page/i0814q78no3.html 资料下载地址:https://download.csdn.net/download/xiaoguoge11/10858840 欢迎
[单片机]
linux2.6.32.2 mini2440平台移植-- 激活 RTC 驱动
RTC的英文全称是Real-Time Clock,翻译过来是实时时钟芯片. RTC是PC主板上的晶振及相关电路组成的时钟电路的生成脉冲,RTC经过8254电路的变频产生一个频率较低一点的OS(系统)时钟TSC,系统时钟每一个cpu周期加一,每次系统时钟在系统初起时通过RTC初始化。8254本身工作也需要有自己的驱动时钟(PIT)。 1.2.1 在初始化文件中加入 RTC 设备结构 Linux-2.6.32.2 内核对 2440 的 RTC 驱动已经十分完善了,但并未在 mach-mini2440.c 中的设备集中加入它,因此并没有被激活,加入 RTC 结构体如下红色字体: ;在 mini2440 设备集中加入 RTC
[单片机]
Altera和Synopsys合作,为ASIC设计提供Nios II处理器内核
新的DesignWare Star IP为处理器设计提供了更多的芯片选择 2007年11月14号,北京 ——Altera公司(NASDAQ: ALTR)和Synopsys有限公司(NASDAQ: SNPS)今天宣布,Altera流行的Nios II处理器内核可通过DesignWare Star IP包提供许可给客户使用。这一新品扩展了Altera现有的FPGA和HardCopy结构化ASIC产品供给,帮助Nios II用户将设计移植到标准单元ASIC。Nios II处理器内核是应用最广泛的FPGA处理器,其客户群有5,000多家电子设备生产商,包括世界上排名靠前的OEM。 Lionic公司总裁Eric Lu评论说:“多年以来我
[新品]
将FATFS移植STM32RBT6遇到的挂载不成功和返回值问题(2)
开始移植fatfs遇到了诸多问题,很是苦恼啊,移植成功思来之不易,特分享一下经验。硬件是STM32F103RBT6内存只有20kB,Flash只有128KB,考虑到内存有限,就不能支持长文件名了,在原子论坛上下载的所以要改动,在此感谢原子论坛给我带来的帮助还有安富莱论坛 http://bbs.armfly.com/read.php?tid=3601 给我带来的启示。另外硬件还有一个大的相机的SD卡,网上买的模块当然也可以自己焊接一个,采用SPI接口,SPI1和SPI2都行,看图 移植前做了大量准备,在网上尤其是原子论坛翻看各种其他人移植的心得,去fatfs的官方网站下载0.10版本的程序,看各种相关的移植心得,文档版本众多,眼
[单片机]
将FATFS<font color='red'>移植</font>STM32RBT6遇到的挂载不成功和返回值问题(2)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved