IWDG
IWDG由LSI驱动,就算外部高速时钟失效也能正常工作,用于程序以外,需要一个独立,对时间精度要求不太高的场合。
IWDG主要性能
自由运行的递减计数器,看门狗激活以后,计数到0时产生复位
IWDG功能描述
IWDG_KR中写入OXCCCC后,看门狗启动,从OXFFF减到0时产生复位,写入OXAAAA进行重新加载。
- 硬件看门狗,如果有硬件看门狗功能,上电复位以后,看门狗自动运行。
- 寄存器的保护:重载寄存器的修改必须按照一个流程才可以进行设置。
库函数
void IWDG_Enable (void)
// 使能
FlagStatus IWDG_GetFlagStatus (uint16_t IWDG_FLAG)
// 重载值和预分频设置是否完成
void IWDG_ReloadCounter (void)
void IWDG_SetPrescaler (uint8_t IWDG_Prescaler)
void IWDG_SetReload (uint16_t Reload)
void IWDG_WriteAccessCmd (uint16_t IWDG_WriteAccess)
设置流程
通常设置一个看门狗的流程如下:
//设置看门狗的参数开关
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
//设置分频
IWDG_SetPrescaler(IWDG_Prescaler_32);
//设置重载值
IWDG_SetReload(LsiFreq/128);
//打开计数
IWDG_ReloadCounter();
//使能看门狗,
IWDG_Enable();
窗口看门狗WWDG
WDG1.png如上图,我们可以递减计数器,同时设置W[6..0]位,WWDG由PCLK1分频后进行驱动,如果T减少到W时,可以进行刷新一次,如果不刷新,到T减小到3F时将产生一个复位,同时T6位置1,相当于重新开始计数。
那如果处于睡眠模式,时钟都没有了,该这么操作?我们在EWI中设置了一个中断,如果进入了睡眠模式,则自动喂狗,防止产生复位。
所以用到的函数都很简单,如下:
void WWDG_ClearFlag (void) //清唤醒的FLAG
void WWDG_DeInit (void) //
void WWDG_Enable (uint8_t Counter) 使能,并设置W
void WWDG_EnableIT (void) //使能中断
FlagStatus WWDG_GetFlagStatus (void) //FLAG状态,有无中断
void WWDG_SetCounter (uint8_t Counter) //设置T值
void WWDG_SetPrescaler (uint32_t WWDG_Prescaler) //分频
void WWDG_SetWindowValue (uint8_t WindowValue) //设置W值
WWDG的配置如下:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
WWDG_SetPrescaler(WWDG_Prescaler_8);
WWDG_SetWindowValue(80);
WWDG_Enable(127);
// ...
//然后在一段程序以后,及时喂狗
WWDG_SetCounter(127);
网友评论