关注+星标公众号,不错过精彩内容
每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位的原因也可能有多种。
STM32的复位功能非常强大,可通过软件、硬件和一些事件触发系统复位,而且通过其复位状态标志可分析复位原因。该部分位于STM32的RCC(Reset and Clock Control)模块。
嵌入式专栏
1
STM32 复位介绍
对于STM32来说,复位通常分为三种类型:系统复位、电源复位和备份域复位。本文结合STM32F4描述系统和电源复位的内容。
1. 系统复位
除了RCC的复位标志和备份域中的寄存器外,系统复位会将其它全部寄存器都复位为复位值。
产生系统复位事件:
NRST 引脚低电平
窗口看门狗计数结束
独立看门狗计数结束
软件复位
低功耗管理复位
2. 电源复位
除备份域内的寄存器以外,电源复位会将其它全部寄存器设置为复位值。
产生电源复位条件:
注:备份域具有特定的复位,其复位仅作用于备份域本身(本文暂不讲述备份域复位)。
3. 复位电路简图
由上图可以看出来,NRST引脚、看门狗等各种事件最终都能引起系统复位。
嵌入式专栏
2
STM32 内核和系统复位
上一章节站在STM32整体层面讲述了产生复位的多种事件,本章节进一步描述STM32的内核和系统复位。
STM32由内核(如:Cortex-M4)和各种片内外设(如UART)资源组成,其中软件复位可指定是内核复位还是系统复位。
(图片来源网络)
1. 内核复位
在Cortex-M内核文档中大概有这样的描述:通过设置 NVIC 中应用程序中断与复位控制寄存器(AIRCR)的VECTRESET 位,可只复位处理器内核而不复位其它片上设施。
也就是说,这样操作只复位Cortex-M内核,不会复位UART这些片内外设。
内核复位函数(参考内核代码修改而来):
void NVIC_CoreReset(void)
{__DSB();SCB->AIRCR &#61; ((0x5FA <AIRCR & SCB_AIRCR_PRIGROUP_Msk) |SCB_AIRCR_VECTRESET_Msk); //置位 VECTRESET__DSB();while(1) { __NOP(); }
}
2. 系统复位
软件复位中的系统复位操作的寄存器位&#xff08;SYSRESETREQ&#xff09;不同&#xff0c;复位的对象为整个芯片&#xff08;除后备区域&#xff09;。
系统复位函数&#xff1a;
void NVIC_SysReset(void)
{__DSB();SCB->AIRCR &#61; ((0x5FA <AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR_SYSRESETREQ_Msk); //置位 SYSRESETREQ__DSB();while(1) { __NOP(); }
}
嵌入式专栏
3
STM32 复位来源
为了方便软件工程师调试和查找&#xff08;复位&#xff09;问题&#xff0c;STM32设计有个状态寄存器保存了各种复位来源的状态。
如下图所示&#xff08;具体请查阅参考手册&#xff09;&#xff1a;
嵌入式专栏
4
STM32 引起异常复位的原因
上面讲述了引起复位的事件有多种&#xff0c;本章节将结合实际应用&#xff0c;描述常见引起复位的原因及解决办法。
原因一&#xff1a;NRST引脚电平被拉低引起复位
有些特殊环境&#xff0c;特别是大型工厂&#xff0c;外界或内部会使电源产生干扰信号&#xff0c;使STM32的NRST引脚电平被拉低&#xff0c;从而导致系统复位。
分析原因&#xff1a;NRST引脚电平拉低20us就会引起系统复位&#xff0c;电源上一个纹波&#xff0c;或者外部静电都会引起电源被拉低20us。
解决办法&#xff1a;电源滤波、使用隔离电源、添加屏蔽措施等。
原因二&#xff1a;欠压引起复位
有些产品在设计之初没有综合计算负载&#xff08;与STM32同电源&#xff09;&#xff0c;因负载过大&#xff0c;使其欠压&#xff0c;从而导致复位。
分析原因&#xff1a;STM32除了上电和掉电复位之外&#xff0c;绝大部分STM32还有一个欠压复位&#xff0c;当电源电压 (VDD) 降至所选 VBOR 阈值以下时&#xff0c;芯片将复位。
解决办法&#xff1a;选择负载更大的电源、通过软件配置合理的欠压值VBOR。
原因三&#xff1a;数字、模拟电源地压差引起复位
有工程师将VSS 和 VSSA之间使用一个几欧&#xff0c;甚至几十欧的电阻连接&#xff0c;有时候&#xff08;有大电流经过地线&#xff09;就会因为电源地的压差导致芯片&#xff08;电源&#xff09;复位。
分析原因&#xff1a;我们比较关注 VDD 和 VDDA 的关系&#xff0c;但忽略了 VSSA 和 VSS 压差需要小于 50mV这一点&#xff08;具体可以看数据手册&#xff09;。如果有大电流的情况&#xff0c;则会引起电源地存在压差。
解决办法&#xff1a;尽量使用完全连接地的方式处理&#xff0c;比如0欧电阻&#xff0c;或者隔离电源。
原因四&#xff1a;看门狗超时喂狗引起复位
有不少工程师设计低功耗产品时&#xff0c;使用了看门狗&#xff0c;但是他们往往忘记了芯片睡眠模式不能停止喂狗&#xff0c;从而导致看门狗复位。
分析原因&#xff1a;STM32进入睡眠之后&#xff0c;看门狗依然继续在工作&#xff0c;如果不及时喂狗&#xff0c;芯片会产生看门狗复位。
解决办法&#xff1a;进入睡眠之前设置更长的喂狗时间&#xff0c;同时不定期唤醒芯片进行喂狗。
复盘一下
▼复位通常分为&#xff1a;系统复位、电源复位和备份域复位&#xff1b;
▼STM32软件复位分&#xff1a;内核和系统复位&#xff1b;
▼STM32复位来源&#xff1a;状态寄存器保存复位来源状态&#xff1b;
▼常见复位问题&#xff1a;NRST被拉低、欠压、压差、看门狗超时喂狗等&#xff1b;
------------ END ------------
后台回复『STM32』『STM32学习笔记』相关文章。
欢迎关注我的公众号&#xff0c;回复“加群”按规则加入技术交流群&#xff0c;回复“1024”查看更多内容。
欢迎关注我的视频号&#xff1a;
点击“阅读原文”查看更多分享。