void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG时钟使能
WWDG_CNT=tr&WWDG_CNT; //初始化WWDG_CNT.
WWDG_SetPrescaler(fprer);////设置IWDG预分频值
WWDG_SetWindowValue(wr);//设置窗口值
WWDG_Enable(WWDG_CNT); //使能看门狗 , 设置 counter . //第一句
WWDG_ClearFlag();//清除提前唤醒中断标志位 //第二句
WWDG_NVIC_Init();//初始化窗口看门狗 NVIC
WWDG_EnableIT(); //开启窗口看门狗中断 //第三句 问题1:这3句话位置调换调试结果就不正常,第2句话很关键,不能去掉和随意放置
}
//重设置WWDG计数器的值
void WWDG_Set_Counter(u8 cnt)
{
WWDG_Enable(cnt);//使能看门狗 , 设置 counter .
}
//窗口看门狗中断服务程序
void WWDG_NVIC_Init()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //WWDG中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占2,子优先级3,组2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //抢占2,子优先级3,组2
NVIC_Init(&NVIC_InitStructure);//NVIC初始化 //问题2:这里为什么缺省“NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;”这句话也可以?
}
问题3:
void WWDG_Configuration(void)
{
WWDG_SetPrescaler(WWDG_Prescaler_8); // 8M/4096/8=244Hz,4ms递减一个数值。
WWDG_SetWindowValue(0x5f); //7f-40=3f=63,,63*4=252ms,1s内复位四次。
WWDG_Enable(0x7f);
WWDG_ClearFlag(); 这句话为什么要加,
WWDG_EnableIT();
}
这是其他帖子分析的,为什么PCLK1是8M,不应该是36MHz吗?如果是36MHz,每秒钟闪烁就不是5次左右了?
问题4:使能调试挂起看门狗,该如何操作?
原子大哥辛苦了,致敬!
|