干货:手把手指导单片机复位原因分析
我是轻松学长,一个爱折腾的程序袁,仰望星空、脚踏实地,做一个有趣有料的技术人。
本节解决问题:软件代码识别STM32复位原因,辅助代码调试。
当STM32发生复位时,可能原因有上电复位、掉电复位、看门狗复位、软件复位等多种,那怎么判断STM32复位的原因呢?且看轻松学长慢慢道来。
1、STM32 复位类型
STM32有三种复位:系统复位、电源复位和后备域复位。
1.1 系统复位
关于备份区域的理解可看下图:
有以下事件发生时,会产生一个系统复位:
-
软件复位(SW复位) 低功耗管理复位 NRST引脚上的低电平(外部复位) 窗口看门狗计数终止(WWDG复位) 独立看门狗计数终止(IWDG复位)
看门狗复位和外部复位好理解,那软件复位和低功耗管理复位怎么理解呢,何时会发生复位?
软件复位即通过将Cortex™-M3中断应用和复位控制寄存器中的SYSRESETREQ位置’1’,实现软件复位。STM32官方已经将软件复位过程给封装好了,即 NVIC_SystemReset() 函数,NVIC_SystemReset()函数的内容如下:
使用软件复位NVIC_SystemReset()函数时,需在该函数之前加上__set_FAULTMASK(1)语句,表示关闭所有中断的意思;
因为在《Cortex-M3权威指南》中有这么一句话提醒我们:从 SYSRESETREQ 被置为有效,到复位发生器执行复位令,往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把 FAULTMASK 置位,即关闭所有中断。
低功耗管理复位:在以下两种情况下可产生低功耗管理复位:
-
1.在进入待机模式时产生低功耗管理复位:通过将用户选择字节中的nRST_STDBY位置’1’将使能该复位。这时,即使执行了进入待机模式的过程,系统将被复位而不是进入待机模式。 2.在进入停止模式时产生低功耗管理复位:通过将用户选择字节中的nRST_STOP位置’1’将使能该复位。这时,即使执行了进入停机模式的过程,系统将被复位而不是进入停机模式。
1.2 电源复位
电源复位将复位除了备份区域外的所有寄存器,当发生以下事件之一时,会产生电源复位:
-
上电/掉电复位(POR/PDR复位) 从待机模式中返回
电源复位的复位源将最终作用于RESET引脚,并在复位过程中保持低电平。
芯片内部的复位信号会在NRST引脚上输出,脉冲发生器保证每一个(外部或内部)复位源都能有至少20μs的脉冲延时;当NRST引脚被拉低产生外部复位时,它将产生复位脉冲。
STM32芯片内部的复位电路如下图所示:
1.3 备份域复位
当以下事件发生之一时,会产生备份区域复位,备份区域复位只影响备份区域。
-
软件复位,备份区域复位可由设置备份域控制寄存器 (RCC_BDCR)中的BDRST位产生。 在VDD和VBAT两者掉电的前提下,VDD或VBAT上电将引发备份区域复位。
2、软件判断复位原因
先看一下stm32中文参考手册对RCC_CSR寄存器的描述:
stm32对CSR寄存器各个位的宏封装:
stm32获取复位标志的宏:__HAL_RCC_GET_FLAG(FLAG)
stm32清除复位标志的宏:__HAL_RCC_CLEAR_RESET_FLAGS()
2.1 代码思路
-
定义复位类型枚举
-
获取STM32复位类型
到这里就结束啦,这只是应用在STM32单片机上的复位类型判断思路及案例。其他的单片机一样的思路,也可以实现同样的问题,注意查看其官方手册对相应寄存器的描述即可。
任何芯片的官方手册都是一笔宝藏,待你去挖掘。
