导航

    Freqchip开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 最新
    1. 主页
    2. ding56239
    D
    • 继续与 ding56239 聊天
    • 开始与 ding56239 的新会话
    • 举报资料
    • 资料
    • 关注
    • 粉丝
    • 屏蔽
    • 主题
    • 帖子
    • 最佳
    • 群组

    ding56239

    @ding56239

    0
    声望
    1
    帖子
    80
    资料浏览
    0
    粉丝
    0
    关注
    注册时间 最后登录

    ding56239 关注

    ding56239 发布的帖子

    • 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;
        }
        }
      发布在 FR800x
      D
      ding56239