STM32复位原因排查

STM32在系统复位之后, RCC_CSR 寄存器查询复位的原因。这是该寄存器非常重要的一个用途,尤其在调试系统异常复位或重启时格外有用。


✅ 查询复位原因的方法

RCC_CSR 中的以下 标志位 会在复位发生后被硬件自动置位,指示具体是哪种复位源导致了这次复位:

位名位号说明
LPWRRSTFBit 31低功耗复位标志(低功耗模式退出)
WWDGRSTFBit 30窗口看门狗触发复位
IWDGRSTFBit 29独立看门狗触发复位
SFTRSTFBit 28软件触发复位(例如使用 NVIC_SystemReset()
PORRSTFBit 27电源上电复位
PINRSTFBit 26外部复位引脚(NRST)复位
OBLRSTFBit 25选项字节加载复位
FWRSTFBit 24内部防火墙复位(若支持)
RSTFBit 23任意复位标志(为1时表示至少发生过一次复位)

这些标志是互斥或共存的。例如,如果系统同时由软件和看门狗复位,两个标志都可能为1。


✅ 清除复位标志的方法

在确认完复位原因之后,应当手动清除这些标志位,以免干扰后续的判断。清除方式如下:

// 清除所有复位标志
RCC->CSR |= RCC_CSR_RMVF;

其中,RMVF(位0)是“Remove reset flag”标志,它会清除上面提到的所有复位标志位(写1清除)。


✅ 使用示例代码

#include "stm32g0xx.h"

void check_reset_reason(void) {
    uint32_t reset_flags = RCC->CSR;

    if (reset_flags & RCC_CSR_IWDGRSTF) {
        // 独立看门狗触发的复位
    } else if (reset_flags & RCC_CSR_WWDGRSTF) {
        // 窗口看门狗触发的复位
    } else if (reset_flags & RCC_CSR_SFTRSTF) {
        // 软件复位
    } else if (reset_flags & RCC_CSR_PORRSTF) {
        // 上电或低电压复位
    } else if (reset_flags & RCC_CSR_PINRSTF) {
        // 外部复位引脚触发
    }

    // 清除复位标志,避免后续判断错误
    RCC->CSR |= RCC_CSR_RMVF;
}


🔧 注意事项

  • 复位标志位只在复位后有效,如系统正常运行时不会变动。
  • 一旦你清除这些位,下一次必须等新的复位发生后才能重新读取正确的原因。
  • 若需要长期记录复位来源,可将其读出后存入 RAM 或 RTC 备份寄存器中。

✅ 小结

特性是否支持
查询复位原因RCC_CSR 提供多个复位源标志
清除复位状态✅ 写 RCC_CSR_RMVF = 1 清除所有标志
多种复位共存检测✅ 支持多个复位标志共存

如果你在做可靠性检测、错误恢复或电源管理,使用 RCC_CSR 是识别复位来源的关键手段。需要定期在系统启动时检查并清除。
如有侵权,联系删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Flocx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值