看门狗功能是基于一个8位的递增计数器,计数时钟周期为131072/Fsys。当开启了看门狗超时复位功能后,一旦此计数器溢出会复位整个系统。
CH579例程中主频都是32M,看门狗超时复位最长时间为 131072/32000000*255=1.04448s。
CH573 CH582 CH592例程中主频都是60M,看门狗超时复位最长时间为 131072/60000000*255=0.557056s。
看门狗有两种使用方法:
一、看门狗复位:
void main() { WWDG_SetCounter(0);//喂狗 WWDG_ClearFlag(); WWDG_ResetCfg(ENABLE);//使能看门狗复位 while(1) { WWDG_SetCounter(0);//喂狗
DelayMs(1000);//可修改延时测试看门狗复位
}
}
二、看门狗中断:
void main() { WWDG_SetCounter(0);//喂狗 WWDG_ITCfg(ENABLE);//使用看门狗中断 PFIC_EnableIRQ(WDOG_BAT_IRQn);//中断服务使能 while(1) { WWDG_SetCounter(0);//喂狗 DelayMs(1000);//可加大延时测试看门狗溢出 } } CH573 CH582 CH592中断服务函数写法: __INTERRUPT//中断函数 __HIGH_CODE void WDOG_BAT_IRQHandler(void) { WWDG_SetCounter(0);//喂狗 SYS_ResetExecute();//可在此处调用软件复位实现复位 } CH579中断服务函数写法: void WDT_IRQHandler(void) { WWDG_SetCounter(0);//喂狗 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...
标签:CH579,CH592,WDOG,例程,void,看门狗,sys,复位,WWDG From: https://www.cnblogs.com/risc5-ble/p/17853714.html