在运用中,我们常常会利用看门狗防护系统跑飞问题,在正常情形下,一样平常设置几秒钟的喂狗韶光。
但有时候,系统在未检测到事宜时,每每想休眠的周期加大,比如20-30的周期。虽然说也可通过数周期办法来实现,但有时项目中就须要极低的功耗,大周期的喂狗韶光也是必需的。

但在正常运行时又不得不缩短喂狗周期,防止系统去世机后反应韶光太慢。这就不得不想要可灵巧设置看门狗周期了。
目前在利用stmL1系列中,标准库下对看门狗的利用案例都无法可灵巧设置看门狗周期,第二次配置无效,除非先重启单片机,在重启后利用其余的参数配置看门狗周期,但这样的操为难刁难系统的利用来说很不友好,重启后所有外设都须要重新配置,而且还可能不能担保之前的状态。
这一想法也是好永劫光实现不了,后来在对RTC灵巧配置周期的运用时来了灵感,利用此类似方法可以对看门狗灵巧配置生效。如下代码参考:
WDG_Config(false);//5sRCC->CSR |= RCC_CSR_RTCRST;RCC->CSR &= ~RCC_CSR_RTCRST;RTC_WakeUpCmd(DISABLE);//wakeup关闭RCC_RTCCLKCmd(DISABLE);//时钟得关闭WDG_Config(true);//约26s旁边void WDG_Config(uint8 maxPeriodEnable){uint16 period;uint8 prescaler;if(maxPeriodEnable) { period = xx0 prescaler = pp0 }else { period = xx1; prescaler = pp1; }if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET){ RCC_ClearFlag(); }RCC_LSICmd(ENABLE); //这里启用LSIwhile(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==RESET); IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable) ;while (IWDG->SR & 0x01);IWDG_SetPrescaler(prescaler);while (IWDG->SR & 0x02);IWDG_SetReload(period);IWDG_ReloadCounter();IWDG_Enable();}
在上述代码中,
RCC->CSR |= RCC_CSR_RTCRST;RCC->CSR &= ~RCC_CSR_RTCRST;RTC_WakeUpCmd(DISABLE);//wakeup关闭RCC_RTCCLKCmd(DISABLE); //时钟得关闭
这几行代码才真正对看门狗的灵巧配置起浸染,这也是我考试测验很多配置才试验成功得出来的。









