一、主函数:
int main(void)
{
#ifdef DEBUG
debug();
#endif
//配置系统时钟
RCC_Configuration();
GPIO_Configuration();
EXTI_Configuration();
NVIC_Configuration();
if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) != RESET)
{
GPIO_WriteBit(GPIOB,GPIO_Pin_15,Bit_SET);
/*可以清除的复位标志位有: RCC_FLAG_PINRST, RCC_FLAG_PORRST, RCC_FLAG_SFTRST,
RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST */
RCC_ClearFlag();
}
else
{
GPIO_WriteBit(GPIOB,GPIO_Pin_15,Bit_RESET);
}
WWDG_Configuration();
/* Infinite loop */
while (1);
}
二、窗口看门狗初始化函数
void WWDG_Configuration(void)
{
/* 开启窗口看门狗时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
// /* Deinitialize the WWDG registers将外设 WWDG寄存器重设为缺省值 */
// 从其底层函数可以看出,初始化关闭窗口看门狗时钟
// WWDG_DeInit();
/* Set WWDG prescaler to 8 设置 WWDG 预分频值 即PCLK1/4096/8=1098.6 */
WWDG_SetPrescaler(WWDG_Prescaler_8);
/* Set WWDG window value to 0x41指定的窗口值,该参数取值必须在 0x40 与 0x7F之间。 */
WWDG_SetWindowValue(0x41);
/* Enable WWDG and set counter value to 0x7F 使能窗口看门狗,并把看门狗计数器的值设为0x7f*/
WWDG_Enable(0x7f);
/* Clear EWI flag 清除早期唤醒中断标志位 */
WWDG_ClearFlag();
/* Enable WWDG Early wakeup interrupt 使能 WWDG 早期唤醒中断(EWI) */
WWDG_EnableIT();
}
三、中断处理函数
void WWDG_IRQHandler(void)
{
/* Set WWDG counter value to 0x70 设置计数器值为0x7f*/
WWDG_SetCounter(0x7f);
/* Clear EWI flag清除早期唤醒中断标志位 */
WWDG_ClearFlag();
/*闪烁PB14*/
GPIO_WriteBit(GPIOB,GPIO_Pin_14,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_14)));
}
四、外中断设置函数等省略
五、问题及解决
1.遇到问题为 当复位后存在标志位使PB15点亮,点亮后清除标志位但标志位一直存在2. 为什么开启窗口看门狗时钟,再关闭时看门狗还正常运行
即先写:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
后写:
WWDG_DeInit();(其底层函数为
RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, DISABLE);)
解决:把
WWDG_Enable(0x7f);
WWDG_ClearFlag();
WWDG_EnableIT();顺序写反了。
但不知其顺序对函数有什么影响,还望高手指点!
可发送至741060785@qq.com 溢寒
|