STM32出现HardFault_Handler故障的原因主要有两个方面:

1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。

2、堆栈溢出。增加堆栈的大小。

MemManage_Handler:访问了内存管理单元(MPU)定义的不合法的内存区域,比如向只读区域写入数据。

BusFault_Handler:在fetch指令、数据读写、fetch中断向量或中断时存储恢复寄存器栈情况下,检测到内存访问错误则产生        BusFault。

UsageFault_Handler:检测到未定义指令或在存取内存时有未对齐。还可以通过软件配置是否检测到除数为0和其它未对齐内存访问也产生该异常,默认关闭,需要在工程初始化时配置:

SCB->CCR |= 0x18;      // 开启除数为0和内存未对齐错误中断

HardFault_Handler 在调试程序过程中,这种异常最常见。上面三种异常发生任何一种异常都会引起HardFault,在上面的三种异常未使能的情况下,默认发生异常时进入HardFault中断服务程序。使能前三种异常也要在初始化时配置:

SCB->SHCSR |= 0x00007000;   // enable Usage Fault, Bus Fault, and MMU Fault

在默认复位初始化时,HardFault使能,其它三者不使能,因此当程序中出现不合法内存访问(一般是指针错误引起)或非法的程序行为(一般就是数学里面常见的除0)时都将产生HardFault中断。

1. 摘要 Cortex-M内核实现了一个高效异常处理模块,可以捕获非法内存访问和数个程序 错误 条件。本应用笔记从程序员角度描述Cortex-M Fault 异常,并且讲述在软件开发周期中的 Fault 用法。 2. 简介 Cortex-M3(以下简称CM3)和Cortex-M4(以下简称CM4)内核的 Fault 异常可以捕获非法内存方法和非法编程行为。 Fault 异... 对比 STM32 CubeMX的移植方式与其他开发方式的不同并详细介绍各种移植方式的特点与优劣; 详细介绍 STM32 CubeMX的移植方式与步骤; 介绍部分移植过程中的问题与注意事项; 测试平台: STM32 F767IGT6 STM32 CubeMX版本:6.1.2 HA L库版本:1.16.1 RTT组件包版本:3.1.3 为什么使用ST 最近在做项目时,遇到的问题,刚开始只是用USART1+ADC+RTC_Wakeup,程序没有问题,但是后来加入USART2,遇到了在ADC_Enable( ha dc)时候进入 ha rdf ault ,由于ADC不是时刻需要,然后就把main函数中ADC_Init();放到了开启ADC前面,没有再进入 ha rdf ault 。 但是新的问题又出现了,在使能串口2中断后,串口中断在执行过程中,跳到 HA L_RTCEx_WakeUpTimerIRQ Handler (RTC_ Ha ndleTypeDef *hrtc)函数会进入h.. 1、问题描述在 stm32 h743平台上测试裸机版音乐播放器循环播放音乐正常,将驱动文件sai.c和wm8978.c移植到UCOSIII(版本V3.07.03)+emWin+FatFs平台上制作音乐播放器。测试时,一曲歌还没播完就出现了宕机(每次出现时间不一样)。2、调试步骤调试发现,宕机大部分时候进入的是 MemManage _ Handler ,极少数时候进入 Ha rdF ault _ Handler 。2-1、... 一、问题描述 在boot中不使用RTOS,跳转到APP中,APP可以正常运行。但是boot中使用RTOS跳转到APP中,程序配置完时钟后就会进入 MemManage _ Handler 错误 中断。 二、解决方法 1.在跳转APP前加__set_CONTROL(0);就不会出错了。 2.如果出现 ha rdf ault ,或者调试看到程序跳到汇编程序的B指令上,可以查一下是否在boot中用到的中断没有关闭。 三、原因分析 1.加__set_CONTROL(0);的原因是使用操作系统后系统内核会使用PSP模式,跳转 最近网上买了一套野火挑战者 STM32 F429开发板,配的是800X480的电容屏,尝试emWin开发。拿到板后我先从官方提供的例程中选了几个试了一下,感觉确实用emWin做人机界面很不错。可惜例程用的是STM的标准库,我一直以来一直在用CubeMx+Keil开发 STM32 ,所以就开始尝试把例程移植到 Ha l库。先用CubeMx配置SDRAM、LTDC等等,并把驱动一一改为 Ha l库的程序,逐一测试通过... 关注+星标公众号,不错过精彩内容作者 | strongerHuang微信公众号| 嵌入式 专栏我们平时的项目,可能会遇到死机的情况,通过在线调试,或者打印消息,可能会发现,怎么进入了 Ha ... 在内核的MCU上写程序时,稍不留神,就可能出现内存溢出的情况。我们可以知道,当我们使用该引脚用作其它功能的时候,如果把NMI引脚在电路上接地,程序在启动的时候就会触发NMI中断,从而进入到NMI_ Handler 函数中去,那程序一直卡在这了,后期再说说怎么屏蔽。两大类,外部中断由 单片机 外部设备产生,中断产生后通过 单片机 的外部管脚传递给 单片机 ,传递这个中断信号最简单的方法就是 规定 单片机 的管脚在什么状态下有外部中断产生,这样 单片机 通常是有一个或多个IO口,当在输入状态时可以用来检测外部中断信号。 .表示当前指令行(地址) B .表示一直在当前指令处原地跳转,也就是死循环。 该段代码意思是:如果处理 MemManage _ Handler 这个函数出现异常的时候就一直在这里死循环。 查阅了一下 keil-MDK 的帮助文档, 在 Built-in variables and constants 节找到了解释: 一. 问题的产生 Ha rd fault (硬 错误 ,也有译为硬件 错误 的)是在 STM32 上编写程序中所产生的 错误 ,造成 Ha rd Fault 错误 的可能原因较多,排除硬件问题,如何在代码量较大的情况下,快速定位造成的 ha rdf ault 的问题代码,就成为比较关键的问题。   本文将基于 STM32 处理器( stm32 f091),keil-MDK开发环境,总结 ha rdf ault 的调试定位方法。在其他Co...