STM32通过rt_hw_hard_fault_exception中的LR寄存器追溯程序问题

1. 问题现象

程序运行导致rt_hw_hard_fault_exception

如图

显示错误相关代码

c 复制代码
struct exception_stack_frame
{
    uint32_t r0;
    uint32_t r1;
    uint32_t r2;
    uint32_t r3;
    uint32_t r12;	
    uint32_t lr;	 // 链接寄存器 (LR)
    uint32_t pc;	// 程序计数器 (PC)
    uint32_t psr;	// 程序状态寄存器 (PSR)
};

void rt_hw_hard_fault_exception(struct exception_stack_frame *contex)
{
	Fm24cl64bInit();
//	static struct exception_stack_frame test;
	static CoreRegister_Type s_error_save;
//	test = *contex;   
	s_error_save.r0 = contex->r0;
	s_error_save.r1 = contex->r1;
	s_error_save.r2 = contex->r2;
	s_error_save.r3 = contex->r3;
	s_error_save.r12 = contex->r12;
	s_error_save.lr = contex->lr;
	s_error_save.pc = contex->pc;
	s_error_save.psr = contex->psr;
	uint8_t save_res = WriteCoreRegisterToEeprom(&s_error_save);
	
	lcd_Init();
	lcd_Init_PowerOn();
	lcd_Init_BackLight(1);
	lcd_BufferClear();
    lcd_BufferPrint(0, 0, 16, "R0:0x%08X  R1:0x%08X", s_error_save.r0, s_error_save.r1);
    lcd_BufferPrint(0, 2, 16, "R2:0x%08X  R3:0x%08X", s_error_save.r2, s_error_save.r3);
    lcd_BufferPrint(0, 4, 16, "R12:0x%08X LR:0x%08X", s_error_save.r12, s_error_save.lr);
    lcd_BufferPrint(0, 6, 16, "PC:0x%08X PSR:0x%08X", s_error_save.pc, s_error_save.psr);
	lcd_BufferPrint(0, 8, 16, "save_res:%d", save_res);
	lcd_BufferPrint(0, 10, 16, "Dst:%d 1st:%d 2st:%d", msg.MsgDstId, msg.FirstSubId, msg.SecondSubId);
	
	lcd_ScreenRefresh();
	
	while(1);
}

2. 问题分析

在ARM Cortex-M架构中,LR (Link Register, R14) 的值在HardFault或其他异常发生时,对追溯问题根源非常关键。

LR---保存函数返回地址

3. 问题追溯

1. 定位触发HardFault的代码位置

通过 LR:0x08009B47 找到对应的代码位置

使用调试器(如ST-Link + IDE)直接跳转到该地址。

​​

2. 分析LR地址附近的代码

常见触发HardFault的操作:

  • 访问非法地址(野指针、数组越界)。
  • 未对齐的内存访问(如对非4字节对齐地址执行LDR)。
  • 堆栈溢出(检查线程栈大小是否足够)。
  • 错误的函数指针调用(如跳转到无效地址)

这里的LPTIM1_IRQ_callback是个空指针,最终导致硬件错误。

相关推荐
2601_962071574 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww89491114 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
智购科技自动贩卖机7 小时前
自动售货机嵌入式状态机设计实战:从45个事件源到层次型状态机的工程重构
大数据·人工智能·stm32·物联网·重构·硬件架构
长江后浪博客7 小时前
ESP32-SOLO-1 在 ESP-IDF v5.5 下启动不断重启问题分析与解决
单片机·嵌入式硬件·嵌入式·esp32·freertos·esp-idf
zww89491117 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
单片机仿真设计8 小时前
【proteus仿真】基于 STM32 单片机智能仓库设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
星游路8 小时前
单片机·电子时钟
单片机·嵌入式硬件
黑马程序员毕设8 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳8 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
白山编程大哥9 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法