我自己使用的是独立看门狗由内部专门的 32Khz 低速时钟(LSI)驱动。主要自己查手册看LSI是多少就是多少。
LL库中的配置:
void MX_IWDG_Init(void)
{
/* Enable APB0 indipendent Watchdog peripherals clock */
LL_APB0_EnableClock(LL_APB0_PERIPH_WDG);
/* Force WDG peripheral reset */
LL_APB0_ForceReset(LL_APB0_PERIPH_WDG);
LL_APB0_ReleaseReset(LL_APB0_PERIPH_WDG);
/* Check if WDG Reset Release flag interrupt occurred or not */
while(LL_RCC_IsActiveFlag_WDGRSTREL() == 0)
{
}
LL_IWDG_Enable(IWDG);
LL_IWDG_EnableWriteAccess(IWDG);
LL_IWDG_SetPrescaler(IWDG, LL_IWDG_PRESCALER_16);
LL_IWDG_SetWindow(IWDG, 0xFFF);
LL_IWDG_SetReloadCounter(IWDG, 0xFFF);
while (LL_IWDG_IsReady(IWDG) != 1)
{
}
LL_IWDG_ReloadCounter(IWDG);
}
void Iwdg_FeedDog(void)
{
LL_IWDG_ReloadCounter(IWDG);
}
看门狗有俩个时间,一个喂狗时间,和一个超时时间
喂狗时间就是看把函数void Iwdg_FeedDog(void)放在某个一段时间执行一次的位置,比如放在500MS执行一次的位置,,这个由自己判断
超时时间:
Tout = (( 4 × 2 ^ prer ) × rlr ) / 32Khz;
其中 Tout 为看门狗溢出时间(单位为 s);
prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7;但其实不用管前面,直接算整体:(4×2^prer)整体为实际预分频值,预分频值可取值为4/8/16/32/64/128/256。
比如我选的LL_IWDG_PRESCALER_16,就是16分频,直接(4×2^prer) = 16;
rlr 为看门狗的重装载值(IWDG_RLR 的值);
我选的rlr = 0xFFF,就是4095;
所以最后算(16 * (4095 + 1))/32 = 2.084;
就约为2秒,超时时间为2秒,也就是2秒内没喂狗就进行复位操作。