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

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

[复制链接]
STMCU-管管 发布时间:2019-3-12 11:09
前言3 `9 u; w3 W: e' ]8 b* _+ x& m+ M
* q! q6 v4 `, o
本篇主要是介绍一种处理问题的思路,即当我们在做STM32应用开发过程中,遇到芯片异常复位,或者进入了异常处理时,如何通过集成开发环境,如IAR,KEIL等查看相应的ARM内核寄存器,定位出应用软件产生异常的地方!
& `1 h6 B9 O- h
$ H& L/ v* ~% Z9 I
问题描述. _1 a' h  l3 P) ~  |9 t
某STM32用户反馈,当使用STM32L4芯片的时候,程序运行一段时间后,会忽然复位。复位后程序继续运行,但是还会继续复位,原因不详!
, J# `1 P$ `, y$ p7 P- s! c& y% L% D8 |

5 i$ ?( i8 e; ~1 J8 l5 v问题分析
  L1 d$ k0 v4 k5 S2 @8 z% h针对于此类问题,我们可以按照一个统一的思路去处理。分析本案例的大致步骤如下:
: R, ]. A# Z' D3 p
) ^. g7 x( L% L, h
1、初步确定复位的原因,是硬件复位,如外部NRST被拉低,还是软件复位,包括软件直接调用复位,或者看门狗复位,还是低功耗模式如standby模式被唤醒时产生中断;
4 ~# t+ o5 ?1 F4 b1 {+ k3 f2、查看复位状态寄存器了解复位大方向,然后做进一步得拆解分析
  [8 m) |1 }  P2 t3、目前客户项目的复位原因是因为看门狗复位,即客户使用了IWDG,但由于某种原因没有及时喂狗,导致IWDG超时复位。初步怀疑由于客户软件的问题,程序跑飞,进入异常处理。
0 l9 ^: M7 z/ d6 O& T7 H1 ^3 c0 x; M0 f4 s
因为客户的异常处理函数中并没有做任何动作,导致独立看门狗IWDG复位。基于此,我们先关闭IWDG,然后在所有的异常处理中,先加入死循环并打上断点,对异常原因进行捕捉。
; d% {% d/ C/ O+ n' d7 ^5 b
1.png
  C$ @; K4 A  e
2.png

, W% R# n" O/ N. _4 j
4、正如我们所猜测,的确是由于程序跑飞导致。程序停在了void HardFault_Handler(void) 。

( |: R7 ]4 S, g( v1 A$ |
通过查看 SP 以及回溯栈里面的内容,找到了对应的LR,具体方法如下:
& W6 U$ ]. f$ J+ \9 V7 H
) G9 f9 v! \+ a) u; o
1.png
( H- T2 J* r& J
当中断产生时,按照上图所示的顺序进行压栈,同时栈指针SP--,即: R0, R1, R2, R3, R12, LR, PC, xPSR。

8 G2 e3 y" n' K8 s8 _( a! C% F; r- U* V: ^# x
2.png
6 X8 V! r# c2 [) p! k

; z6 q* j9 o% n2 p! I8 z$ G5 s
如上图所示,当产生异常时,如果call stack窗口显示不出来的话,只能根据core的寄存器手动回溯栈,以 找到出错时的指针。根据ARM core的说明,SP+6,即红框的部分,为中断处理后LR和PC,据此可以追溯 函数异常时的位置!
$ x7 L( V) P7 n$ s) \( Z- \: k
5、根据出错时的PC和LR,发现是浮点运算的函数,初步判断是因为浮点运算导致,比如没有对齐导致的 Hardfault,但实际检查发现,并不是浮点运算的问题!
& k; j! G' F5 W, {* |, ~8 I
6、问题一时陷入了僵局。但有一点是确定的,是因为栈的区域被异常覆盖或者改写导致产生hard fault,

8 c( ^2 n# h: J, a$ U  D
7、由于问题可以稳定复现,采取逐个排除法最终发现了问题的所在:

- a( Q! l5 g# |2 X
当把一个局部数组变量改为全局数组时,问题消失!

6 v% Y; s3 b4 x) R0 a( D
由于局部数组变量是保存在栈当中,所以怀疑是对这个局部数组变量使用不当导致了栈被覆盖或者改写! 追查这个局部变量数组:
6 w& e4 J" g( x, E/ Q. `
............
2 g* ?3 C9 i$ |( O! |# S( r
想了解更多,请下载原文阅读
% x$ h% g2 s- O" G3 b

; W2 w) O8 r7 X3 C/ a2 I/ P# s; ?* N/ X, ^, w/ T8 H5 i3 G% T
收藏 1 评论0 发布时间:2019-3-12 11:09

举报

0个回答

所属标签

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