FR8008GP重启判断是否正确



  • // 复位控制寄存器地址
    #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;
      }
      }