STM32在系统复位之后, RCC_CSR
寄存器查询复位的原因。这是该寄存器非常重要的一个用途,尤其在调试系统异常复位或重启时格外有用。
✅ 查询复位原因的方法
RCC_CSR
中的以下 标志位 会在复位发生后被硬件自动置位,指示具体是哪种复位源导致了这次复位:
位名 | 位号 | 说明 |
---|---|---|
LPWRRSTF | Bit 31 | 低功耗复位标志(低功耗模式退出) |
WWDGRSTF | Bit 30 | 窗口看门狗触发复位 |
IWDGRSTF | Bit 29 | 独立看门狗触发复位 |
SFTRSTF | Bit 28 | 软件触发复位(例如使用 NVIC_SystemReset() ) |
PORRSTF | Bit 27 | 电源上电复位 |
PINRSTF | Bit 26 | 外部复位引脚(NRST)复位 |
OBLRSTF | Bit 25 | 选项字节加载复位 |
FWRSTF | Bit 24 | 内部防火墙复位(若支持) |
RSTF | Bit 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
是识别复位来源的关键手段。需要定期在系统启动时检查并清除。
如有侵权,联系删除