0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32芯片异常复位的原因有哪些

STM32单片机 2019-03-08 16:24 次阅读

问题描述

STM32用户反馈,当使用STM32L4芯片的时候,程序运行一段时间后,会忽然复位。复位后程序继续运行,但是还会继续复位,原因不详。

问题解析

初步确定复位的原因,是硬件复位,如外部NRST被拉低,还是软件复位,包括软件直接调用复位,或者看门狗复位,还是低功耗模式如standby模式被唤醒时产生中断。

查看复位状态寄存器了解复位大方向,然后做进一步得拆解分析。

目前客户项目的复位原因是因为看门狗复位,即客户使用了IWDG,但由于某种原因没有及时喂狗,导致IWDG超时复位。初步怀疑由于客户软件的问题,程序跑飞,进入异常处理。

因为客户的异常处理函数中并没有做任何动作,导致独立看门狗IWDG复位。基于此,我们先关闭IWDG,然后在所有的异常处理中,先加入死循环并打上断点,对异常原因进行捕捉。

 STM32芯片异常复位的原因有哪些

 STM32芯片异常复位的原因有哪些

 STM32芯片异常复位的原因有哪些

正如我们所猜测,的确是由于程序跑飞导致。程序停在了voidHardFault_Handler(void)

通过查看SP以及回溯栈里面的内容,找到了对应的LR,具体方法如下:

 STM32芯片异常复位的原因有哪些

当中断产生时,按照上图所示的顺序进行压栈,同时栈指针SP--,即: R0, R1, R2, R3, R12, LR, PC, xPSR。

 STM32芯片异常复位的原因有哪些

如上图所示,当产生异常时,如果call stack窗口显示不出来的话,只能根据core的寄存器手动回溯栈,以找到出错时的指针。根据ARM core的说明,SP+6,即红框的部分,为中断处理后LR和PC,据此可以追溯函数异常时的位置。

根据出错时的PC和LR,发现是浮点运算的函数,初步判断是因为浮点运算导致,比如没有对齐导致的Hardfault,但实际检查发现,并不是浮点运算的问题。

问题一时陷入了僵局。但有一点是确定的,是因为栈的区域被异常覆盖或者改写导致产生hardfault。

由于问题可以稳定复现,采取逐个排除法最终发现了问题的所在:

当把一个局部数组变量改为全局数组时,问题消失!

由于局部数组变量是保存在当中,所以怀疑是对这个局部数组变量使用不当导致了栈被覆盖或者改写。

追查这个局部变量数组:

 STM32芯片异常复位的原因有哪些

 STM32芯片异常复位的原因有哪些

 STM32芯片异常复位的原因有哪些

经检查发现,这个原先是8bit的局部变量的数组,在最后被强制转换成了uint32_t*类型的指针,由于是指针,在对其进行++或--操作时,都是按照4字节宽带操作的,这就相当于扩大了4倍,覆盖了后面的栈的内容,导致了程序跑飞。

小结

当芯片异常复位或者进入异常处理 (如Hard fault, Mem Manage, Bus fault等)时,首先考虑的是,如何快速的复现这个问题,当问题被稳定复现的时候,可以通过调试工具在异常处理的地方打上断点停留,这样就可以获取到栈指针SP,通过SP去看栈里面的内容去回溯栈。当然,如果栈的内容被无端改写时,栈里面的内容,如保存的LR就没有太大的参考意义。不过,可以通过观察栈里面的内容,去估测是哪个模块或者函数异常修改了栈的内容,进而定位最终的问题源。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2239

    文章

    10669

    浏览量

    348683
  • STM32芯片
    +关注

    关注

    0

    文章

    38

    浏览量

    4309

原文标题:经典案例解析 | STM32芯片异常复位

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32单片机的应用笔记 奇怪的NRST 管脚异常复位问题

    异常复位问题的通常解决思路 我们知道, 导致MCU异常复位原因有很多, 比如外部复位电路被干
    的头像 发表于 07-13 18:55 7509次阅读
    <b class='flag-5'>STM32</b>单片机的应用笔记 奇怪的NRST 管脚<b class='flag-5'>异常</b><b class='flag-5'>复位</b>问题

    STM32L476RET6复位电路异常是什么原因

    我用的CPU是STM32L476RET6,复位芯片是CAT811TTBI-GT3,目前电路用jlink不能下载程序,甚至有时候不能发现CPU,而用阻容复位电路是正常的,请问这是什么
    发表于 03-20 06:10

    STM32F407ZG MCU控制器偶尔会出现异常复位,为什么?

    我这边用了STM32F407ZG MCU, 发现控制器偶尔会出现异常复位。 程序使用了独立看门狗,没有使用窗口看门狗。通过监控RCC->CSR, 发现异常
    发表于 04-01 07:13

    分析一个关于STM32 芯片异常复位的经典案例!

    应用软件产生异常的地方!问题描述某STM32用户反馈,当使用STM32L4芯片的时候,程序运行一段时间后,会忽然复位
    发表于 04-07 08:00

    stm32复位电路异常

    自己做了一块板子,工作后发现stm32复位电路工作不正常,正常情况下芯片上的复位端口的电压应该是3.3v,这样才能正常工作,但是我的复位端口
    发表于 05-12 22:32

    STM32F051K8U6芯片复位异常

    STM32F051K8U6芯片复位异常,怀疑芯片内部电源检测(POR/PDR)电路异常,导致
    发表于 12-19 11:41

    导致MCU出现功能严重异常的几个原因分析

    我们在从事MCU应用开发过程中,难免会碰到MCU芯片异常的问题。比如异常复位,表现为复位脚有电平跳变或者干脆处于
    发表于 11-29 16:10 1.1w次阅读

    STM32 Bootloader异常复位如何解决

    客户反馈通过PC软件Flashloader不能够跟STM32 MCU自带Bootloader连接。并且系统运行一段时间后异常复位
    的头像 发表于 03-23 10:26 9006次阅读
    <b class='flag-5'>STM32</b> Bootloader<b class='flag-5'>异常</b><b class='flag-5'>复位</b>如何解决

    STM32引起电源和系统异常复位原因

    关注、星标公众号,不错过精彩内容来源:STM32每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位原因也可能有多种。今天
    发表于 01-05 14:28 4次下载
    <b class='flag-5'>STM32</b>引起电源和系统<b class='flag-5'>异常</b><b class='flag-5'>复位</b>的<b class='flag-5'>原因</b>

    STM32学习笔记 | 引起电源和系统异常复位原因

    关注+星标公众号,不错过精彩内容每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位原因也可能有多种。STM32
    发表于 01-17 12:45 2次下载
    <b class='flag-5'>STM32</b>学习笔记 | 引起电源和系统<b class='flag-5'>异常</b><b class='flag-5'>复位</b>的<b class='flag-5'>原因</b>

    经典案例解析 | STM32芯片异常复位

    问题描述:某STM32用户反馈,当使用STM32L4芯片的时候,程序运行一段时间后,会忽然复位复位后程序继续运行,但是还会继续
    发表于 02-10 11:30 18次下载
    经典案例解析 | <b class='flag-5'>STM32</b><b class='flag-5'>芯片</b><b class='flag-5'>异常</b><b class='flag-5'>复位</b>

    STM32芯片的那些系统级复位功能

    我们知道,STM32芯片里有很多系统级的复位,比方上电复位、欠压复位、看门狗复位、软件
    的头像 发表于 10-19 09:06 4200次阅读

    基于STM32芯片特定外设复位的功能

    我们知道,STM32芯片里有很多系统级的复位,比方上电复位、欠压复位、看门狗复位、软件
    的头像 发表于 06-22 09:08 1336次阅读
    基于<b class='flag-5'>STM32</b><b class='flag-5'>芯片</b>特定外设<b class='flag-5'>复位</b>的功能

    STM32 Bootloader异常复位案例

    电子发烧友网站提供《STM32 Bootloader异常复位案例.pdf》资料免费下载
    发表于 09-25 09:17 3次下载
    <b class='flag-5'>STM32</b> Bootloader<b class='flag-5'>异常</b><b class='flag-5'>复位</b>案例

    单片机异常复位原因 简述单片机如何复位

    单片机异常复位原因 简述单片机如何复位  单片机异常复位是指在正常运行期间,单片机出现了不可恢复
    的头像 发表于 10-17 16:44 2285次阅读