良许Linux教程网 干货合集 STM32学习笔记 | 引起电源和系统异常复位的原因

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

每个处理器都具备复位功能,不同处理器的复位类型和引起复位的原因可能有所不同。

在STM32中,复位功能非常强大,可以通过软件、硬件和一些事件触发系统复位,并且可以通过复位状态标志分析复位的原因。这部分功能位于STM32的RCC(Reset and Clock Control)模块中。

STM32 复位介绍

针对STM32来说,一般可以将复位分为三种类型:系统复位、电源复位和备份域复位。本文结合STM32F4系列描述了系统复位和电源复位的相关内容。

1. 系统复位

除了RCC的复位标志和备份域中的寄存器外,系统复位会将其它全部寄存器都复位为复位值。

产生系统复位事件:

  • NRST 引脚低电平
  • 窗口看门狗计数结束
  • 独立看门狗计数结束
  • 软件复位
  • 低功耗管理复位

2. 电源复位

除备份域内的寄存器以外,电源复位会将其它全部寄存器设置为复位值。

产生电源复位条件:

  • 上电/掉电复位或欠压复位
  • 在退出待机模式时

注:备份域具有特定的复位,其复位仅作用于备份域本身(本文暂不讲述备份域复位)。

3. 复位电路简图

image-20231128222548033
image-20231128222548033

由上图可以看出来,NRST引脚、看门狗等各种事件最终都能引起系统复位。

STM32 内核和系统复位

上一章节站在STM32整体层面讲述了产生复位的多种事件,本章节进一步描述STM32的内核和系统复位。

STM32由内核(如:Cortex-M4)和各种片内外设(如UART)资源组成,其中软件复位可指定是内核复位还是系统复位。

image-20231128222554648
image-20231128222554648

(图片来源网络)

1. 内核复位

在Cortex-M内核文档中大概有这样的描述:通过设置 NVIC 中应用程序中断与复位控制寄存器(AIRCR)的VECTRESET 位,可只复位处理器内核而不复位其它片上设施。

也就是说,这样操作只复位Cortex-M内核,不会复位UART这些片内外设。

内核复位函数(参考内核代码修改而来):

void NVIC_CoreReset(void)
{
  __DSB();
  SCB->AIRCR  = ((0x5FA AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
                 SCB_AIRCR_VECTRESET_Msk);       //置位 VECTRESET
  __DSB();
  while(1) { __NOP(); }
}

2. 系统复位

软件复位中的系统复位操作的寄存器位(SYSRESETREQ)不同,复位的对象为整个芯片(除后备区域)。

系统复位函数:

void NVIC_SysReset(void)
{
  __DSB();
  SCB->AIRCR  = ((0x5FA AIRCR & SCB_AIRCR_PRIGROUP_Msk) | 
                 SCB_AIRCR_SYSRESETREQ_Msk);     //置位 SYSRESETREQ
  __DSB();
  while(1) { __NOP(); }
}

STM32 复位来源

为了方便软件工程师调试和查找(复位)问题,STM32设计有个状态寄存器保存了各种复位来源的状态。

如下图所示(具体请查阅参考手册):

image-20231128222620580
image-20231128222620580

STM32 引起异常复位的原因

上面讲述了引起复位的事件有多种,本章节将结合实际应用,描述常见引起复位的原因及解决办法。

原因一:NRST引脚电平被拉低引起复位

有些特殊环境,特别是大型工厂,外界或内部会使电源产生干扰信号,使STM32的NRST引脚电平被拉低,从而导致系统复位。

分析原因:NRST引脚电平拉低20us就会引起系统复位,电源上一个纹波,或者外部静电都会引起电源被拉低20us。

解决办法:电源滤波、使用隔离电源、添加屏蔽措施等。

***原因二:*欠压引起复位

有些产品在设计之初没有综合计算负载(与STM32同电源),因负载过大,使其欠压,从而导致复位。

分析原因:STM32除了上电和掉电复位之外,绝大部分STM32还有一个欠压复位,当电源电压 (VDD) 降至所选 VBOR 阈值以下时,芯片将复位。

解决办法:选择负载更大的电源、通过软件配置合理的欠压值VBOR。

***原因三:数字、模拟电源地压差引起*复位

有工程师将VSS 和 VSSA之间使用一个几欧,甚至几十欧的电阻连接,有时候(有大电流经过地线)就会因为电源地的压差导致芯片(电源)复位。

分析原因:我们比较关注 VDD 和 VDDA 的关系,但忽略了 VSSA 和 VSS 压差需要小于 50mV这一点(具体可以看数据手册)。如果有大电流的情况,则会引起电源地存在压差。

解决办法:尽量使用完全连接地的方式处理,比如0欧电阻,或者隔离电源。

***原因四:看门狗超时喂狗引起*复位

有不少工程师设计低功耗产品时,使用了看门狗,但是他们往往忘记了芯片睡眠模式不能停止喂狗,从而导致看门狗复位。

分析原因:STM32进入睡眠之后,看门狗依然继续在工作,如果不及时喂狗,芯片会产生看门狗复位。

解决办法:进入睡眠之前设置更长的喂狗时间,同时不定期唤醒芯片进行喂狗。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部