【WCH蓝牙系列芯片】-基于CH592开发板—复位状态寄存器(R8_RESET_STATUS)读取

-------------------------------------------------------------------------------------------------------------------------------------

  在CH592芯片手册中可以看到有一个复位状态寄存器(R8_RESET_STATUS),这个 8 位寄存器记录了系统的复位状态和 FlashROM 的保护状态。可以看到低3位的数据对应着最近一次的复位状态。

  比如低 3 位等于 001,说明是 上电复位,即芯片刚通电。

  如果低 3 位等于 000,说明是 软件复位,通常是代码中调用了复位函数触发的。

  如果是其他复位原因(如看门狗复位、外部引脚手动复位等),则再次打印数值。这样就可以程序运行中意外出现复位情况,便与分析复位原因,追查问题现象。

image-20251121165058240

image-20251121165115792

  以蓝牙从机为例,在蓝牙从机中模拟各种的复位状态,然后再将复位寄存器的值,放在蓝牙广播中,这样便于在不方便接串口打印看日志的情况下,通过手机扫描蓝牙广播包的方式,来排查复位状态的原因。

void Print_Reset_Status_Binary(void)
{
    uint8_t status = R8_RESET_STATUS;
    PRINT("================ RESET STATUS REPORT ================\n");
    //打印原始 Hex 值
    PRINT("R8_RESET_STATUS (Hex): 0x%02x\n", status);
    // 打印二进制字符串 (从 Bit 7 到 Bit 0)
    PRINT("R8_RESET_STATUS (Bin): ");
    for(int i = 7; i >= 0; i--)
    {
        if(status & (1 << i)) {
            PRINT("1");
        } else {
            PRINT("0");
        }
        // 加个空格区分高低半字节
        if(i == 3) PRINT(" ");
    }
    PRINT("\n");
    PRINT("---------------- Detail Parsing ---------------------\n");
    // 解析 Bit 2-0: 复位标志 (最重要的部分)
    uint8_t rst_flag = status & RB_RESET_FLAG;
    PRINT("[Bit 2:0] Reset Source : %d%d%d (Bin) -> ",
          (rst_flag & 0x04) >> 2, (rst_flag & 0x02) >> 1, (rst_flag & 0x01));
    switch(rst_flag)
    {
        case 0x00: // 000
            PRINT("Software Reset (SR)\n");
            break;
        case 0x01: // 001
            PRINT("Power On Reset (RPOR)\n");
            break;
        case 0x02: // 010
            PRINT("WatchDog Timeout (WTR)\n");
            break;
        case 0x03: // 011
            PRINT("Manual Reset Pin (MR)\n");
            break;
        case 0x05: // 101
            PRINT("Wakeup from Shutdown (GRWSM)\n");
            break;
        default:
            // 100, 110, 111 属于唤醒复位
            if(rst_flag & 0x04) {
                PRINT("Wakeup Reset (LRW)\n");
            } else {
                PRINT("Unknown\n");
            }
            break;
    }
    PRINT("=====================================================\n");
}

  这段程序读取了芯片内部的 复位状态寄存器 (R8_RESET_STATUS),并通过掩码操作判断具体的复位原因,首先将寄存器的值保存到变量 status 中,并以十六进制(Hex)格式打印出来和二进制格式进行打印。通过status & RB_RESET_FLAG屏蔽高 5 位(Bit 7-3),只保留低 3 位(Bit 2-0)。根据数据手册,这低 3 位决定了具体的复位原因, 判断具体的复位源。

image-20251121172245199

image-20251121172401195

  在程序中,添加独立看门狗的程序,测试开启独立看门狗的功能,在主程序中不喂狗的情况下,程序复位,查看复位状态寄存器的值。

image-20251121174447413

image-20251121174536383

image-20251121173243169

  在一些特俗使用场合下,设备无法直接接触,可将这个复位状态寄存器 (R8_RESET_STATUS)值作为一个自定义的广播数数据,放在广播包中进行更新广播。这样可以通过手机APP直接观察复位状态寄存器值,判断复位原因。以看门狗复位为例,做个测试。

image-20251124134509595

image-20251124134524626

image-20251124134556628

 

 

 

posted on 2025-11-24 13:56  凡仕  阅读(37)  评论(0)    收藏  举报