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手册独立看门狗寄存器描述:

二.软件参考
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(); // 循环喂狗,不断刷新看门狗计数器
// 保证芯片不会因看门狗超时而复位
}
}
浙公网安备 33010602011771号