你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【实战经验】一个 STM32 芯片异常复位之案例分析

[复制链接]
STMCU-管管 发布时间:2019-3-12 11:09
前言# w2 S8 `. Y" {+ k8 @% C2 @
# G! r* m% C. Z9 G; m9 D+ Z
本篇主要是介绍一种处理问题的思路,即当我们在做STM32应用开发过程中,遇到芯片异常复位,或者进入了异常处理时,如何通过集成开发环境,如IAR,KEIL等查看相应的ARM内核寄存器,定位出应用软件产生异常的地方!
$ k! `6 h: V1 A- O4 S

) t) n4 M) ^" O, q) C1 }1 ?问题描述
- l' P9 Z* g8 m& v某STM32用户反馈,当使用STM32L4芯片的时候,程序运行一段时间后,会忽然复位。复位后程序继续运行,但是还会继续复位,原因不详!
6 l5 {. L* t/ q9 V6 z' W1 k

6 }1 _3 H1 R. f. C, x2 R问题分析0 U& S" E7 c' ]% y/ S: h
针对于此类问题,我们可以按照一个统一的思路去处理。分析本案例的大致步骤如下:
* ?5 u8 b9 Y8 A6 }$ `" \5 ~3 D
. f: U# A( C/ Z
1、初步确定复位的原因,是硬件复位,如外部NRST被拉低,还是软件复位,包括软件直接调用复位,或者看门狗复位,还是低功耗模式如standby模式被唤醒时产生中断;
1 {& V' }" H! u2、查看复位状态寄存器了解复位大方向,然后做进一步得拆解分析& D, R2 g4 D" ^7 o- r8 ]
3、目前客户项目的复位原因是因为看门狗复位,即客户使用了IWDG,但由于某种原因没有及时喂狗,导致IWDG超时复位。初步怀疑由于客户软件的问题,程序跑飞,进入异常处理。
" V3 U5 Y% L  F) v/ E7 P" n  E1 ?5 L( q8 K8 P
因为客户的异常处理函数中并没有做任何动作,导致独立看门狗IWDG复位。基于此,我们先关闭IWDG,然后在所有的异常处理中,先加入死循环并打上断点,对异常原因进行捕捉。
8 D" U8 Z0 T- w1 w7 Z9 e6 I
1.png

0 C/ Q! Z4 v0 Q1 N" u8 [! C* T
2.png
- o0 m# V! @# H- X8 Z
4、正如我们所猜测,的确是由于程序跑飞导致。程序停在了void HardFault_Handler(void) 。
1 }9 }. x" \) ]' I! d! {0 G
通过查看 SP 以及回溯栈里面的内容,找到了对应的LR,具体方法如下:
4 X  \" M. Y9 w+ t9 _

! T* d, i6 x% h+ B1 ]8 @/ C
1.png
5 C# ?; D& z; p" }& a3 D5 B2 H
当中断产生时,按照上图所示的顺序进行压栈,同时栈指针SP--,即: R0, R1, R2, R3, R12, LR, PC, xPSR。

, N9 g! g: g$ b1 ^+ E& c$ {8 s" A, i1 M/ H% d
2.png

6 t% s; F" }6 i) V% d) {! V' D* @) f+ c
如上图所示,当产生异常时,如果call stack窗口显示不出来的话,只能根据core的寄存器手动回溯栈,以 找到出错时的指针。根据ARM core的说明,SP+6,即红框的部分,为中断处理后LR和PC,据此可以追溯 函数异常时的位置!
0 e( ]- q5 ?. W1 S4 P
5、根据出错时的PC和LR,发现是浮点运算的函数,初步判断是因为浮点运算导致,比如没有对齐导致的 Hardfault,但实际检查发现,并不是浮点运算的问题!

5 j* I! m/ K/ x
6、问题一时陷入了僵局。但有一点是确定的,是因为栈的区域被异常覆盖或者改写导致产生hard fault,

# `3 `. D% `  i6 Q5 j
7、由于问题可以稳定复现,采取逐个排除法最终发现了问题的所在:

9 ]$ I$ V2 t; |* [, D7 d& Q
当把一个局部数组变量改为全局数组时,问题消失!

; d' r( N8 p  [) r0 O3 V+ P+ v
由于局部数组变量是保存在栈当中,所以怀疑是对这个局部数组变量使用不当导致了栈被覆盖或者改写! 追查这个局部变量数组:
  W$ M* ]8 D# v. U& V. a
............
2 K) Q, o2 t: J1 z* I* N
想了解更多,请下载原文阅读
- @, I0 q$ C8 O) x" o! L  s1 V
) ~! G* `8 ~( y/ m

( G# q/ N8 V0 Y6 u3 E1 s
赞 收藏 1 评论0 发布时间:2019-3-12 11:09

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版