// 复位控制寄存器地址
#define RESET_CTRL_ADDR ((volatile uint32_t *)0x5000000C)
// 复位源位定义(需根据芯片手册补充,这里是典型示例)
#define RESET_CTRL_POR_BIT (1 << 0) // 芯片上电POR复位
#define RESET_CTRL_EXT_BIT (1 << 1) // 外部IO Reset复位
#define RESET_CTRL_IWDG_BIT (1 << 2) // IWDG复位
#define RESET_CTRL_SW_BIT (1 << 3) // 软件调试复位
// 复位原因枚举
typedef enum {
RESET_REASON_UNKNOWN = 0,
RESET_REASON_POWER, // 芯片上电POR复位
RESET_REASON_EXT, // 外部IO Reset复位
RESET_REASON_WDG, // IWDG复位
RESET_REASON_SW // 软件调试复位
} Reset_Reason_t;
/**
-
@brief 读取复位原因(基于 0x5000_000C 寄存器)
-
@return 复位原因枚举
*/
Reset_Reason_t reset_reason_get(void)
{
Reset_Reason_t reason = RESET_REASON_UNKNOWN;
uint32_t reg_val = *RESET_CTRL_ADDR;// 按优先级判断(POR > 外部IO > IWDG > 软件)
if (reg_val & RESET_CTRL_POR_BIT) {
reason = RESET_REASON_POWER;
} else if (reg_val & RESET_CTRL_EXT_BIT) {
reason = RESET_REASON_EXT;
} else if (reg_val & RESET_CTRL_IWDG_BIT) {
reason = RESET_REASON_WDG;
} else if (reg_val & RESET_CTRL_SW_BIT) {
reason = RESET_REASON_SW;
}// 清除复位状态位(通常写1清除,以手册为准)
*RESET_CTRL_ADDR = reg_val;return reason;
}
/**
- @brief 打印复位原因(适配你的日志系统)
*/
void reset_reason_print(void)
{
Reset_Reason_t reason = reset_reason_get();
switch (reason) {
case RESET_REASON_POWER:
log_printf("RESET", FILE, LINE, "复位原因:芯片上电POR复位");
break;
case RESET_REASON_EXT:
log_printf("RESET", FILE, LINE, "复位原因:外部IO Reset复位");
break;
case RESET_REASON_WDG:
log_printf("RESET", FILE, LINE, "复位原因:IWDG复位(看门狗超时)");
break;
case RESET_REASON_SW:
log_printf("RESET", FILE, LINE, "复位原因:软件调试复位(主动触发)");
break;
default:
log_printf("RESET", FILE, LINE, "复位原因:未知(请核对寄存器位定义)");
break;
}
}