一.打印复位状态寄存器:R8_RESET_STATUS

该寄存器的低三位对应以下复位原因:

最近一次复位状态:

000:软件复位 SR(RB_WDOG_RST_EN=0 时软件复位可产生此状态,否则可复位 但不产生此状态);

001:上电复位 RPOR;

010:看门狗超时复位 WTR;

011:外部手动复位 MR;

101:从下电模式唤醒时的复位 GRWSM; 100/110/111:唤醒复位 LRW,且此前的 上一次复位分别是 SR/WTR/MR。  

void print_reset_reason(void) {
    uint8_t rst = R8_RESET_STATUS & 0x07;  // 仅取低3位复位标识
    PRINT("R8_RESET_STATUS=0x%x\n", R8_RESET_STATUS);
    PRINT("Reset Reason: ");
    switch (rst) {
        case 0x00: PRINT("Software Reset (SR)\n"); break;
        case 0x01: PRINT("Power-On Reset (RPOR)\n"); break;
        case 0x02: PRINT("Watchdog Reset (WTR)\n"); break;
        case 0x03: PRINT("Manual Reset (MR)\n"); break;
        case 0x04: PRINT("Wake-Up Reset (LRW, prev: SR)\n"); break;
        case 0x05: PRINT("Power-Down Wake-Up (GRWSM)\n"); break;
        case 0x06: PRINT("Wake-Up Reset (LRW, prev: WTR)\n"); break;
        case 0x07: PRINT("Wake-Up Reset (LRW, prev: MR)\n"); break;
        default:   PRINT("Unknown (0x%x)\n", rst); break;
    }
}

void main(void) {
    // 系统初始化(时钟、串口等,按硬件需求添加)
    print_reset_reason();  // 打印复位原因
    while (1) {
        // 业务逻辑
        // ...
    }

二.添加打印查看Hardfault

__attribute__((section(".highcode")))             //put in ram
__attribute__((interrupt("WCH-Interrupt-fast")))  //disable soft push/pull
void HardFault_Handler(void) {
    uint32_t v_mepc,v_mcause,v_mtval;
    PRINT("hardfault\n"); 
    v_mepc=__get_MEPC();
    v_mcause=__get_MCAUSE();
    v_mtval=__get_MTVAL(); 
    PRINT("mepc:%08x\n",v_mepc);
    PRINT("mcause:%08x\n",v_mcause);
    PRINT("mtval:%08x\n",v_mtval);
    while(1);
}

mepc可以在list文件中查看,

mause:

InterruptException CodeDescription
1 0 User software interrupt
1 1 Supervisor software interrupt
1 2 Hypervisor software interrupt
1 3 Machine software interrupt
1 4 User timer interrupt
1 5 Supervisor timer interrupt
1 6 Hypervisor timer interrupt
1 7 Machine timer interrupt
1 8 User external interrupt
1 9 Supervisor external interrupt
1 10 Hypervisor external interrupt
1 11 Machine external interrupt
1 ≥12 Reserved
0 0 Instruction address misaligned
0 1 Instruction access fault
0 2 Illegal instruction
0 3 Breakpoint
0 4 Load address misaligned
0 5 Load access fault
0 6 Store/AMO address misaligned
0 7 Store/AMO access fault
0 8 Environment call from U-mode
0 9 Environment call from S-mode
0 10 Environment call from H-mode
0 11 Environment call from M-mode
0 ≥12 Reserved
posted on 2025-12-03 16:14  WCH蓝牙应用分享  阅读(0)  评论(0)    收藏  举报