STM32进入HardFault中断,急求解决

JACKY88888889 2020-04-14 05:13:45


大家好,现在开发的stm32的板子遇到点问题,急需帮助,希望懂的大牛指点下,谢谢!现象是stm32一上电运行就进异常中断,根本进不了c语言的main函数。根据SP的地址,然后结合堆栈里面的值依次为R0~R3、R12、LR、PC、XPRS的理论(看网上的帖子得知),得到地址0x0800018c是PC将要执行的下一条指令地址. Fault Reports的诸多选项里没看到有被置1的位。
...全文
1334 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 3 楼 hufuju_com 的回复:
Error: L6218E: Undefined symbol _vsnprintf (referred from communal.o)
这个说没有定义符号_vsnprintf。估计是有些头文件没有包含进来,#include "**.h"
这个函数是c99才支持的,在选项里勾选c99模式就行了,还包含什么文件
JACKY88888889 2020-04-17
  • 打赏
  • 举报
回复
谢谢worldy,马上去试下,分给你了
worldy 2020-04-17
  • 打赏
  • 举报
回复
1、首先更改startup.s的启动文件,把里面的HardFault_Handler代码段换成下面的代码: HardFault_Handler\ PROC IMPORT hard_fault_handler_c TST LR, #4 ITE EQ MRSEQ R0, MSP MRSNE R0, PSP B hard_fault_handler_c ENDP 2、然后把hard_fault_handler_c函数放在c文件的代码中。代码如下: void hard_fault_handler_c(unsigned int * hardfault_args) { static unsigned int stacked_r0; static unsigned int stacked_r1; static unsigned int stacked_r2; static unsigned int stacked_r3; static unsigned int stacked_r12; static unsigned int stacked_lr; static unsigned int stacked_pc; static unsigned int stacked_psr; static unsigned int SHCSR; static unsigned char MFSR; static unsigned char BFSR; static unsigned short int UFSR; static unsigned int HFSR; static unsigned int DFSR; static unsigned int MMAR; static unsigned int BFAR; 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]); /*异常中断发生时,这个异常模式特定的物理R14,即lr被设置成该异常模式将要返回的地址*/ stacked_lr = ((unsigned long) hardfault_args[5]); stacked_pc = ((unsigned long) hardfault_args[6]); stacked_psr = ((unsigned long) hardfault_args[7]); SHCSR = (*((volatile unsigned long *)(0xE000ED24))); //系统Handler控制及状态寄存器 MFSR = (*((volatile unsigned char *)(0xE000ED28))); //存储器管理fault状态寄存器 BFSR = (*((volatile unsigned char *)(0xE000ED29))); //总线fault状态寄存器 UFSR = (*((volatile unsigned short int *)(0xE000ED2A)));//用法fault状态寄存器 HFSR = (*((volatile unsigned long *)(0xE000ED2C))); //硬fault状态寄存器 DFSR = (*((volatile unsigned long *)(0xE000ED30))); //调试fault状态寄存器 MMAR = (*((volatile unsigned long *)(0xE000ED34))); //存储管理地址寄存器 BFAR = (*((volatile unsigned long *)(0xE000ED38))); //总线fault地址寄存器 while (1); } 3、执行程序后,若发生内核错误,则程序会运行到最后的while(1)处。此时观察相应的堆栈和故障寄存器值, stacked_lr即为故障发生时进入故障中断前pc的值,在MDK软件调试状态下,假如stacked_lr的值为0x1A002D08,在左下方的命令窗口输入“pc = 0x1A002D08”,回车,即可定位发生错误的代码位置。
JACKY88888889 2020-04-17
  • 打赏
  • 举报
回复
worldy你好,有空帮忙看下,谢谢!
JACKY88888889 2020-04-17
  • 打赏
  • 举报
回复
@worldy,按照你的方法,已经定位到这个位置,帮忙看下这种情况如何处理?谢谢
worldy 2020-04-16
  • 打赏
  • 举报
回复
选项的debug标签下,运行到main的选项取消,然后,就可以在xxx.s 开始运行
hufuju_com 2020-04-16
  • 打赏
  • 举报
回复
Error: L6218E: Undefined symbol _vsnprintf (referred from communal.o)
这个说没有定义符号_vsnprintf。估计是有些头文件没有包含进来,#include "**.h"
JACKY88888889 2020-04-16
  • 打赏
  • 举报
回复
谢谢worldy ,run to main 已经取消了,现在运行到bx r0 后再执行就进HardFault_Handler
worldy 2020-04-16
  • 打赏
  • 举报
回复
不是告诉你了,选项的debug标签下,运行到main的选项取消;该选项如果打钩,debug系统会控制运行到main才断点,但是,如果初始化存在死循环,那么,那么就运行部到main,看起来就像死了一样;注意,stm32程序,在main之前还有好多代码
JACKY88888889 2020-04-16
  • 打赏
  • 举报
回复
现在主要是想知道为什么进不了主函数,在初始化代码段就死机了的原因?
hufuju_com 2020-04-15
  • 打赏
  • 举报
回复
你这个现象是没有进入__main(); 在Options for target的 target设置里面吧“Use Micro LIB”打勾选中就可以了,试试看。
JACKY88888889 2020-04-15
  • 打赏
  • 举报
回复
谢谢hufuju_com,Use Micro LIB勾选以后,编译报错了,.\Objects\TypeAChargStation.axf: Error: L6218E: Undefined symbol _vsnprintf (referred from communal.o).

27,521

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧