STM32出现HardFault_Handler故障

本文介绍FATFS文件系统中LFN配置模式,并针对配置模式1和2导致STM32出现HardFault_Handler故障的问题提供了解决方案。通过调整配置并引入syscall.c文件实现了内存的有效管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FATFS文件系统的LFN选项支持4种配置模式

#define _USE_LFN 1

/   0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect.

/   1: Enable LFN with static working buffer on the BSS. Always NOT reentrant.

/   2: Enable LFN with dynamic working buffer on the STACK.

/   3: Enable LFN with dynamic working buffer on the HEAP.

当选择1时,debug进去进行硬件仿真,设置断点调试,发现系统总是进入

void HardFault_Handler(void)

while (1);

}

然后陷入死循环出不来。

网上搜索资料:

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


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


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


因此,配置为1会发生内存溢出或者堆栈溢出继而使STM32进入硬件错误处理函数。


配置2也出现同样的问题,因此,解决方案是配置#define _USE_LFN 3,然后添加syscall.c来实现对内存的回收。


成功解决此问题。


### HardFault_Handler 函数实现详解 HardFault 是 ARM Cortex-M 系列处理器中最严重的异常之一。当发生不可恢复的错误时,例如非法内存访问、未定义指令执行或其他严重硬件故障,会触发 HardFault 异常[^1]。 #### 处理流程 在进入 `HardFault_Handler` 后,通常需要完成以下几个方面的工作: - **保存现场**:为了后续调试和分析原因,在进入 Handler 之前,系统自动保存了一些上下文信息到栈中。这部分工作由硬件自动完成。 - **获取状态信息**:通过读取特定寄存器(如 SP, LR 和 MSP/PSP),可以了解当前堆栈指针的位置以及返回地址等关键信息[^3]。 - **诊断问题根源**:利用辅助寄存器 HFSR (Hard Fault Status Register), CFSR (Configurable Fault Status Registers) 及其子字段 MMFAR (MemManage Fault Address Register) 或 BFAR (Bus Fault Address Register)[^2] 来判断具体是什么类型的错误引发了此次硬错。 - **采取措施**:根据具体情况决定如何响应此错误——可能是重启设备、记录日志等待人工干预或是尝试自行修复并继续运行。 下面是一个简单的 `HardFault_Handler` 的实现例子: ```c void HardFault_Handler(void) { __asm volatile ( "TST lr, #4\n" "ITE EQ\n" "MRSEQ r0, msp\n" /* 如果是从线程模式下发生的,则使用MSP */ "MRSNE r0, psp\n" /* 若是在处理程序模式下产生的,则采用PSP */ "B hard_fault_handler_c\n" ); } extern void hard_fault_handler_c(unsigned int *hardfault_args); __attribute__((naked)) void hard_fault_handler_c(unsigned int *hardfault_args){ // 获取LR值以区分来自特权级还是用户级调用 unsigned long stacked_r0; unsigned long stacked_r1; unsigned long stacked_r2; unsigned long stacked_r3; unsigned long stacked_r12; unsigned long stacked_lr; unsigned long stacked_pc; unsigned long stacked_psr; stacked_r0 = ((unsigned long)hardfault_args[0]); stacked_r1 = ((unsigned long)hardfault_args[1]); stacked_r2 = ((unsigned long)hardfault_args[2]); stacked_r3 = ((unsigned long)hardfault_args[3]); stacked_r12 = ((unsigned long)hardfault_args[4]); stacked_lr = ((unsigned long)hardfault_args[5]); stacked_pc = ((unsigned long)hardfault_args[6]); stacked_psr = ((unsigned long)hardfault_args[7]); while(1); // 死循环在此处停止以便于观察或进一步操作 } ``` 上述代码片段展示了如何捕获 HardFault 并转交给 C 函数进行更详细的处理。注意这里仅提供了一个基础框架;实际应用中可能还需要加入更多定制化的逻辑来满足项目需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值