看门狗功能是基于一个8位的递增计数器,计数时钟周期为131072/Fsys。当开启了看门狗超时复位功能后,一旦此计数器溢出会复位整个系统。
CH579例程中主频都是32M,看门狗超时复位最长时间为 131072/32000000*255=1.04448s。
CH573 CH582 CH592例程中主频都是60M,看门狗超时复位最长时间为 131072/60000000*255=0.557056s。
最近一次复位状态:
000:软件复位 SR(RB_WDOG_RST_EN=0
时软件复位可产生此状态,否则可复位
但不产生此状态);
001:上电复位 RPOR;
010:看门狗超时复位 WTR;
011:外部手动复位 MR;
101:从下电模式唤醒时的复位 GRWSM;
100/110/111:唤醒复位 LRW,且此前的
上一次复位分别是 SR/WTR/MR。
看门狗有两种使用方法:
一、看门狗复位:
CH573 CH582 CH592示例:
void main() { SetSysClock(CLK_SOURCE_PLL_60MHz);//设置主频为60M DebugInit();//串口打印初始化 PRINT("R8_RESET_STATUS =%02x\n",R8_RESET_STATUS&0x07);//打印复位状态寄存器,显示复位原因 WWDG_SetCounter(0);//喂狗 WWDG_ClearFlag();//清除中断标志 WWDG_ResetCfg(ENABLE);//使能看门狗复位 while(1) { WWDG_SetCounter(0);//喂狗 DelayMs(1000);//可修改延时测试看门狗复位 PRINT("WDOG TEST\n");//串口打印数据方便观察 } }
CH579示例:
void main() { DebugInit();//串口打印初始化 PRINT("R8_RESET_STATUS =%02x\n",R8_RESET_STATUS&0x07);//打印复位状态寄存器,显示复位原因 WWDG_SetCounter(0);//喂狗 WWDG_ClearFlag();//清除中断标志 WWDG_ResetCfg(ENABLE);//使能看门狗复位 while(1) { WWDG_SetCounter(0);//喂狗 DelayMs(1500);//可修改延时测试看门狗复位 PRINT("WDOG TEST\n");//串口打印数据方便观察 } }
二、看门狗中断:
CH573 CH582 CH592示例:
void main() { SetSysClock(CLK_SOURCE_PLL_60MHz);//设置主频为60M DebugInit();//串口打印初始化 PRINT("R8_RESET_STATUS =%02x\n",R8_RESET_STATUS&0x07);//打印复位状态寄存器,显示复位原因 WWDG_SetCounter(0);//喂狗 WWDG_ITCfg(ENABLE);//使用看门狗中断 PFIC_EnableIRQ(WDOG_BAT_IRQn);//中断服务使能 while(1) { WWDG_SetCounter(0);//喂狗 DelayMs(1000);//可加大延时测试看门狗溢出 } } __attribute__((interrupt("WCH-Interrupt-fast"))) __attribute__((section(".highcode"))) void WDOG_BAT_IRQHandler(void) { WWDG_SetCounter(0);//喂狗 PRINT("WDOG_BAT_IRQHandler\n");//串口打印数据方便观察 SYS_ResetExecute();//可在此处调用软件复位实现复位 }
CH579示例:
void main() { DebugInit();//串口打印初始化 PRINT("R8_RESET_STATUS =%02x\n",R8_RESET_STATUS&0x07);//打印复位状态寄存器,显示复位原因 WWDG_SetCounter(0);//喂狗 WWDG_ITCfg(ENABLE);//使用看门狗中断 NVIC_EnableIRQ(WDOG_BAT_IRQn);//中断服务使能 while(1) { WWDG_SetCounter(0);//喂狗 DelayMs(1500);//可加大延时测试看门狗溢出 } } void WDT_IRQHandler(void) { WWDG_SetCounter(0);//喂狗 PRINT("WDT_IRQHandler\n");//串口打印数据方便观察 SYS_ResetExecute();//可在此处调用软件复位实现复位 }
看门狗的库函数文件目录:StdPeriphDriver/CH57x_sys.c或StdPeriphDriver/CH58x_sys.c或StdPeriphDriver/CH59x_sys.c
下面是看门狗库函数介绍:
1.看门狗中断使能
/********************************************************************* * @fn WWDG_ITCfg * * @brief 看门狗定时器溢出中断使能 * * @param s - 溢出是否中断 * * @return none */ void WWDG_ITCfg(FunctionalState s) { uint8_t ctrl = R8_RST_WDOG_CTRL; if(s == DISABLE) { ctrl &= ~RB_WDOG_INT_EN; } else { ctrl |= RB_WDOG_INT_EN; } sys_safe_access_enable(); R8_RST_WDOG_CTRL = ctrl; sys_safe_access_disable(); }
2.开门狗复位使能
/********************************************************************* * @fn WWDG_ResetCfg * * @brief 看门狗定时器复位功能 * * @param s - 溢出是否复位 * * @return none */ void WWDG_ResetCfg(FunctionalState s) { uint8_t ctrl = R8_RST_WDOG_CTRL; if(s == DISABLE) { ctrl &= ~RB_WDOG_RST_EN; } else { ctrl |= RB_WDOG_RST_EN; } sys_safe_access_enable(); R8_RST_WDOG_CTRL = ctrl; sys_safe_access_disable(); }
3.看门狗清除中断
/********************************************************************* * @fn WWDG_ClearFlag * * @brief 清除看门狗中断标志,重新加载计数值也可清除 * * @param none * * @return none */ void WWDG_ClearFlag(void) { sys_safe_access_enable(); R8_RST_WDOG_CTRL |= RB_WDOG_INT_FLAG; sys_safe_access_disable(); }
4.看门狗喂狗
/** * @brief 加载看门狗计数初值,递增型 * * @param c - 看门狗计数初值 */ #define WWDG_SetCounter(c) (R8_WDOG_COUNT = c)
5.看门狗中断服务函数
__INTERRUPT __HIGH_CODE void WDOG_BAT_IRQHandler(void) { WWDG_SetCounter(0); }
END...