独立看门狗(IWDG)由低速时钟(LSI)驱动,即使注视中发声故障它依然有效。当看门狗被激活后,则在计数器计数至0x0000时产生复位。
本例程首先控制LED快速闪动,然后启动IWDG,在while循环中执行喂狗操作,并控制LED慢速闪动。
如果将喂狗操作屏蔽,则可以看到LED慢闪一下之后,马上进入快闪状态。实际上是由于没有喂狗操作,系统被复位了。
设置IWDG主要有两个参数:预分频器和计数器。
IWDG参数设置
void Write_Iwdg_ON(u16 IWDG_Prescaler, u16 Reload)
{
RCC_LSICmd(ENABLE); //enable LSI
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
PVU_CheckStatus(); //get IWDG status
IWDG_WriteAccessCmd(0x5555);
IWDG_SetPrescaler(IWDG_Prescaler);
RVU_CheckStatus(); //get IWDG status
IWDG_WriteAccessCmd(0x5555);
IWDG_SetReload(Reload & 0xfff);
IWDG_ReloadCounter(); //load and enable IWDG
IWDG_Enable();
}
下表是用户手册关于预分频器和计数器的关系:
IWDG设置
主程序执行流程
int main(void)
{
u32 ulA = 0;
SystemInit();
RCC_ConfigInit();
GPIO_ConfigInit();
while(1) {
ulA++;
delayus(50);
SetPB0Low();
delayus(50);
SetPB0High();
if(ulA == 10) {
ulA = 0;
break;
}
}
Write_Iwdg_ON(IWDG_Prescaler_256, 0xff);
while(1) {
#if 1
Write_Iwdg_RL(); //reload IWDG counter;
#endif
ulA++;
delayus(10);
if(ulA == 50) {
SetPB0Low();
} else if(ulA == 100) {
SetPB0High();
ulA = 0;
}
}
}
通过打开或关闭Write_Iwdg_RL()
进行实验。
网友评论