//窗口看门狗初始化程序
void WWDG_Init(uint8_t ztr,uint8_t zwr,uint32_t zfprer)
{
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE); //使能窗口看门狗时钟
WWDG_CNT=ztr&WWDG_CNT; //初始化WWDG_CNT.
WWDG_SetPrescaler(zfprer); //设置分频值
WWDG_SetWindowValue(zwr); //设置窗口值
//WWDG_SetCounter(WWDG_CNT);//设置计数值
WWDG_Enable(WWDG_CNT); //开启看门狗,
WWDG_ClearFlag();//清除提前唤醒中断标志位
WWDG_EnableIT();//开启提前唤醒中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//嵌套优先级分组为2,
NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn; //窗口看门狗中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; //抢占优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级为3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能窗口看门狗
NVIC_Init(&NVIC_InitStructure);
}
/*****************************************************************************/
//窗口看门狗中断服务程序
void WWDG_IRQHandler(void)
{
// WWDG_SetCounter(WWDG_CNT); //一般不在这个中断里喂狗
WWDG_ClearFlag();//清除提前唤醒中断标志位
//执行一些系统在复位前要做的一些操作,比如保存重要数据等
}
/*****************************************************************************/
//窗口看门狗喂狗操作,即如何喂狗
void SetWatchDog(void)
{
zwr=WWDG->CFR&0X5F;//窗口值
ztr=WWDG->CR&0X7F;//计数值
if((0x40<ztr)&&(ztr<zwr))//计数器值ztr必须小于窗口值zwr时才可喂狗,在之前喂狗则太 早,会产生看门狗复位
{//这一地方刚开始错写成if(0x40<ztr<zwr),结果老是提前喂狗导致复位
WWDG_SetCounter(WWDG_CNT);//喂狗
printf("正在喂狗\n");
}
}