CH585/4和CH592/1是支持独立看门狗功能的;

独立看门狗的时钟是LSI,所以在初始化时不要关闭LSI的电源,在CLK_OSC32K配置为0使用外部LSE时会将LSI电源关闭,若使用独立看门狗需将此段程序屏蔽:

sys_safe_access_enable();

R8_CK32K_CONFIG &= ~RB_CLK_INT32K_PON;

sys_safe_access_disable();

void HAL_TimeInit(void)
{
    bleClockConfig_t conf;
#if(CLK_OSC32K)
    sys_safe_access_enable();
    R8_CK32K_CONFIG &= ~(RB_CLK_OSC32K_XT | RB_CLK_XT32K_PON);
    sys_safe_access_disable();
    sys_safe_access_enable();
    R8_CK32K_CONFIG |= RB_CLK_INT32K_PON;
    sys_safe_access_disable();
    LSECFG_Current(LSE_RCur_100);
    Lib_Calibration_LSI();
#else
    //sys_safe_access_enable();
    //R8_CK32K_CONFIG &= ~RB_CLK_INT32K_PON;
    //sys_safe_access_disable();
    sys_safe_access_enable();
    R8_CK32K_CONFIG |= RB_CLK_OSC32K_XT | RB_CLK_XT32K_PON;
    sys_safe_access_disable();
#endif
    RTC_InitTime(2020, 1, 1, 0, 0, 0); //RTC时钟初始化当前时间

    tmos_memset( &conf, 0, sizeof(bleClockConfig_t) );
    conf.ClockAccuracy = CLK_OSC32K ? 1000 : 50;
    conf.ClockFrequency = CAB_LSIFQ;
    conf.ClockMaxCount = RTC_MAX_COUNT;
    conf.getClockValue = SYS_GetClockValue;
    TMOS_TimerInit( &conf );

}

 一.下方为CH585手册独立看门狗寄存器描述:

ScreenShot_2026-05-07_150847_765

二.软件参考

1.独立看门狗初始化

// 定义喂狗宏:向 IWDG_KR 寄存器写入 0xAAAA,用于定时喂狗,防止系统复位
// 注意:必须在看门狗超时前定期调用这个宏,否则芯片会自动重启
#define  FEED_IWDG()   {R32_IWDG_KR=0xAAAA;}      //需要定时调用喂狗

/*********************************************************
* 函数名:IWDG_Enable
* 功能  :初始化并使能独立看门狗(IWDG)
* 参数  :无
* 返回值:无
*********************************************************/
void IWDG_Enable()
{
    R32_IWDG_KR=0x5555;  // 向看门狗密钥寄存器写入 0x5555,解除 IWDG 寄存器写保护
                         // 只有解锁后,才能修改分频值、重载值等配置
    
    R32_IWDG_CFG |= (7<<12);  // 设置看门狗时钟预分频器:分频系数 512
                              // 7 对应 512 分频,IWDG 时钟源 32KHz → 分频后 62.5Hz
    
    R32_IWDG_CFG &=0xFFFFF000; // 清空 CFG 寄存器低 12 位(重载值位)
                               // 为下一步设置重载值做准备
    
    R32_IWDG_CFG |=0xFFF;      // 设置看门狗重载值为 0xFFF(十进制 4095)
                               // 超时时间 = 4095 / 62.5 ≈ 65.5 秒
    
    R32_IWDG_KR=0xCCCC;  // 向看门狗密钥寄存器写入 0xCCCC,正式启动看门狗
                         // 启动后必须定期喂狗,否则超时自动复位芯片
}

/*********************************************************
* 函数名:main
* 功能  :程序主入口,初始化看门狗并循环喂狗
*********************************************************/
void main()
{
    ...  //时钟主频初始化等

    IWDG_Enable(); // 调用函数,初始化并启动独立看门狗
    
    // 打印当前看门狗配置寄存器的值,方便调试查看配置是否正确
    PRINT("R32_IWDG_CFG = %x\r\n", R32_IWDG_CFG);
    
    while(1){  // 死循环,程序主逻辑
        FEED_IWDG(); // 循环喂狗,不断刷新看门狗计数器
                     // 保证芯片不会因看门狗超时而复位
    }
}
posted on 2026-05-07 15:28  WCH蓝牙应用分享  阅读(121)  评论(0)    收藏  举报