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 是识别复位来源的关键手段。需要定期在系统启动时检查并清除。
如有侵权,联系删除

### STM32复位方法及常见问题解决方案 #### 主动触发硬件复位 STM32可以通过外部按键或者内部逻辑主动拉低NRST引脚至少两个机器周期来实现硬件复位。这种方式是最可靠的复位手段之一,适用于大多数应用场景[^1]。 #### 软件复位机制 对于软件复位而言,在某些情况下可能更倾向于使用特定API函数而非硬重启设备。例如调用`NVIC_SystemReset()`可发起一次系统级别的重置过程而不必依赖物理按钮操作;此外还有针对不同外设模块提供的专用复位接口如IWDG(独立看门狗)、WWDG(窗口看门狗)等定时器超时引发的自动恢复动作也能达到类似效果。 #### 解决需手动复位的问题 当遇到Keil5环境下编译后的程序上传至目标板卡之后总是提示需要人为干预完成初始化的情况,则很可能是由于IDE设置不当所引起的。具体表现为未正确指定启动选项或是加载地址错误等问题。此时建议检查项目属性中的Flash工具配置项,并确保选择了合适的算法文件用于下载固件镜像数据到芯片闪存区域中去[^2]。 #### 异常复位分析与处理 如果发现应用程序运行期间频繁遭遇意外终止并伴随有异常复位现象发生的话,那么很有可能是因为遇到了非法访问内存空间之类的严重故障而导致处理器进入到了HardFault状态之中。这时可以借助于观察堆栈指针(SP)指向位置处存储的数据结构来进行初步诊断工作——特别是关注返回地址(Return Address)字段指示的位置是否合理以及特权级标志位(Privileged bit within PSR register)的状态变化趋势等方面的信息以便进一步缩小排查范围直至最终定位根本原因所在之处[^4]。 ```cpp // 示例:利用内置库函数执行软复位 #include "stm32f1xx_hal.h" void performSoftwareReset(void){ HAL_NVIC_SystemReset(); // 触发系统级别复位 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Flocx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值