在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler 函数里的死循环while(1)中。2 e. W: w- i5 `4 h) s3 G 这说明 STM32 出现了硬件错误。 $ Z W* W: o. ~% r9 R STM32出现硬件错误可能有以下原因: 1.数组越界操作; 2.内存溢出,访问越界; 3.堆栈溢出,程序跑飞; 4.中断处理错误;% w5 g* K6 t4 `& N( y9 `0 V 遇到这种情况,可以通过以下2种方式来定位到出错代码段。 方法1:' T2 c7 c5 [- K% _6 A3 \2 i 在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击STOP停止仿真。 ) m3 ^( s4 D. E% H ! @, W4 L& o; T- c5 l8 ]: N 在Keil菜单栏点击View——Registers Window,在寄存器查看窗口查找R14(LR)的值。# e* V; W+ t* u% o 如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值;如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值; + \1 z! {9 i: y8 }% v& s+ ?( L 我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。 / X, M3 D1 Z0 P) o 8 E4 |9 V2 J+ W8 _! {/ ~ 在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”; $ Q$ e; r- i" P 在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。 ) i8 g% z, v4 f5 W. {, ? 地址一般以 0x08 开头的32位数。本例中,地址为0x08003CB9。 在Keil菜单栏点击View——Disassembly Window,在Disassembly窗口中右击,在下拉菜单中选择Show Disassemblyat Address...。 & n& v/ H' ?0 u 在弹出框Show Code atAdress的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。: T. f5 J9 L" N7 P6 F 7 g+ r7 e% h- c) q( h, N/ b9 W 仔细查看附近区域的相关代码来排查错误具体原因。% c$ N! W* Z0 {/ S5 P. v- \. o 9 r+ o3 |1 p3 a% w0 r' Z 方法2:5 `6 r- u, F$ a( }0 T 在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。" o) K: \+ G% n1 s d7 Y7 e* C 3 e* y' p$ a1 c6 r3 c3 Y2 R 在Keil菜单栏点击View——Call Stack Window弹出Call Stack + Locals对话框。 然后在对话框中右键选择Show Caller Code,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。 + m- E* K' t1 R8 m. B ( M& q& D9 G, i. ]% S. j 转载自:STM32嵌入式开发1 y" i% o$ k2 `8 Z! j 如有侵权请联系删除 |
刘氓兔的64位入门挑战【1】——MP257芯片下单和硬件准备
刘氓兔的64位入门挑战【0】——MP257选型
HRTIM 指南
基于STM3的开发环境搭建经验分享
NUCLEO-U545RE-Q评测(2)运行环境建立
NUCLEO-U545RE-Q评测 (3)驱动OLED
NUCLEO-U545RE-Q评测 (6)FFT
NUCLEO-U545RE-Q评测 (5)DAC_DMA
NUCLEO-U545RE-Q评测 (4)ADC_DMA_转换
基于STM32 TrustZone 开发HardFault调试与处理
好资料~~,学习啦