|
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler 函数里的死循环while(1)中。/ G4 t+ \$ S Z( q$ f- l0 T P$ M 这说明 STM32 出现了硬件错误。
STM32出现硬件错误可能有以下原因:$ q! Z: K: x$ J V 1.数组越界操作; 2.内存溢出,访问越界; 3.堆栈溢出,程序跑飞; 4.中断处理错误; 遇到这种情况,可以通过以下2种方式来定位到出错代码段。/ [: l& l% A* x0 |- l* i/ y$ d % C, B D5 d: U/ E* l, L$ A1 P# _ Z 方法1:9 H; T. E8 P4 c) C; v6 t( }6 j- { 在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击STOP停止仿真。0 l+ C1 ^6 a" N& q) r4 i# ?, R
; ~3 B6 S6 O8 B8 Z2 ` 在Keil菜单栏点击View——Registers Window,在寄存器查看窗口查找R14(LR)的值。 + n- t( @) o) W% s# C% f 如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值;如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值; 我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。9 y. O7 f4 `& g5 z% q
, x3 X% @- j, w4 g 在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”; # o' T! [# T2 M+ n9 p0 J0 h3 h 在“Address”地址栏中输入MSP的值:0x20001288,然后在对应的行里找到地址。 5 [5 l0 P/ h, S3 F7 N" D( R" n9 J 地址一般以 0x08 开头的32位数。本例中,地址为0x08003CB9。6 q) @4 m% }7 ]. t8 @) E 0 z6 C8 B0 Z' K1 J- Y
在Keil菜单栏点击View——Disassembly Window,在Disassembly窗口中右击,在下拉菜单中选择Show Disassemblyat Address...。 9 c1 a! F8 J# ]) a5 |5 T" m 在弹出框Show Code atAdress的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。5 z- d1 Q9 n6 H* ~, w' k+ C , C% x: i- t7 W, E 仔细查看附近区域的相关代码来排查错误具体原因。
方法2: 在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。1 W% m2 N; u/ N: N1 S " |) J5 ~9 F+ N% ]7 j7 [6 D/ Z
7 D% r: I# Z% d% {7 {+ C 在Keil菜单栏点击View——Call Stack Window弹出Call Stack + Locals对话框。3 ]# g" b0 a- H 3 n8 Q. ]4 F, d Y5 W1 d 然后在对话框中右键选择Show Caller Code,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。2 [- ?$ ~! R1 }- Y+ n3 c! A/ D & e! A# G" E v6 l* D* d) x 1 O; O( Y/ A9 [. H% p: A2 @8 V 转载自:STM32嵌入式开发 如有侵权请联系删除 1 g5 Q+ C# E. y |
《MCUBoot课程》学习笔记+从信任链原理到量产实践
使用STM32 MCU和MPU连接PDM数字麦克风
好用软件推荐-TouchGFX Designer
HRTIM 指南
全新OpenSTLinux 6.1版本发布
兔哥的ST67——【000】ST67模组订购
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
刘氓兔的64位入门挑战【1】——MP257芯片下单和硬件准备
刘氓兔的64位入门挑战【0】——MP257选型
基于STM3的开发环境搭建经验分享
微信公众号
手机版
好资料~~,学习啦