#include "iwdog.h" /* 独立看门狗有一个40KHz的时钟,通过预分频值和重装载值来确定看门狗复位周期 公式: Tout = ((4 × 2^prer) × rlr) / 40; Tout 为复位时间,单位是ms prer 为看门狗时钟预分频值,写入值是 0--7,是分频系数/4的幂数。例如: 4分频的值是0, 64 分频的 写入值是4 rlr 是看门狗的重装载值 */ //------------------------------------------------------------------------------- #define MAX_IWD_MS 6553 #ifdef USE_STDPERIPH_DRIVER #define IWDG_PRE IWDG_Prescaler_4 // 4分频,分频后是0.1ms #endif #ifdef USE_FULL_LL_DRIVER #define IWDG_PRE LL_IWDG_PRESCALER_4 // 4分频,分频后是0.1ms #endif //------------------------------------------------------------------------------- void InitIWDog(u16 ms) { if (ms < MAX_IWD_MS) { ms *= 10; } else { ms = 65535; } #if (USE_IWDOG == 1) #ifdef USE_STDPERIPH_DRIVER IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 取消寄存器写保护 IWDG_SetPrescaler(IWDG_PRE); // 设置独立看门狗的预分频系数 IWDG_SetReload(ms); // 设置独立看门狗的重装载值 IWDG_ReloadCounter(); // 重载计数值, 第一次喂狗 IWDG_Enable(); // 启动看门狗 #endif #ifdef USE_FULL_LL_DRIVER LL_IWDG_EnableWriteAccess(IWDG); // 取消寄存器写保护 LL_IWDG_SetPrescaler(IWDG, IWDG_PRE); // 设置独立看门狗的预分频系数 LL_IWDG_SetWindow(IWDG, ms); // 设置窗口 LL_IWDG_SetReloadCounter(IWDG, ms); // 设置独立看门狗的重装载值 LL_IWDG_ReloadCounter(IWDG); // 重载计数值, 第一次喂狗 LL_IWDG_Enable(IWDG); // 启动看门狗 #endif #endif } void FeedIWDog(void) { #if (USE_IWDOG == 1) #ifdef USE_STDPERIPH_DRIVER IWDG_ReloadCounter(); #endif #ifdef USE_FULL_LL_DRIVER LL_IWDG_ReloadCounter(IWDG); #endif #endif }