初级会员

- 积分
- 64
- 金钱
- 64
- 注册时间
- 2015-8-28
- 在线时间
- 108 小时
|
void WWDG_NVIC_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void wwdg_init(UINT8 tr, UINT8 wr, UINT32 fprer)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG时钟使能
WWDG_CNT = tr & WWDG_CNT; // 初始化WWDG_CNT
/* 看门狗节拍=(48MHz(PCLK1)/4096)/8 = 1464Hz */
/* 也就是说1秒钟计数器减1464下 */
/* 周期 T=1/1464 s = 0.68ms */
WWDG_SetPrescaler(fprer); // 设置IWDG预分频值
/* 窗口值用wr , 就是说计数器满是0x7F, 在减到wr之前喂狗了就算喂早了--会复位 */
/* wr值一定要大于0x40, 否则窗口值就不存在了, 因为计数器从 0x40减到0x3F会产生看门狗复位 */
WWDG_SetWindowValue(wr); // 设置窗口值
/* 看门狗使能, 并初始化定时器为0x7F 计数器减到0x3F时(T6位清零), 则产生一个复位*/
WWDG_Enable(WWDG_CNT); // 使能看门狗, 设置 counter
WWDG_ClearFlag(); // 清除提前唤醒中断标志位
WWDG_NVIC_Init(); // 初始化窗口看门狗 NVIC
/* 使能EW interrupt 这个在计数器减到0x40的时候产生一个"死前"中断,
* 当然也可以在这个中断里赶紧喂狗, 省得狗咬你(复位) */
WWDG_EnableIT(); // 开启窗口看门狗中断
}
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(0x7F);
WWDG_ClearFlag();
}
开启WWDG后,程序中不进行喂狗操作,在中断函数里面加一个断点。调试发现,cpu直接复位了,没有进入这个中断函数啊。
看手册,当计数值达到0x40时,会进入这个WEI中断啊。
芯片是f030r8t6,请大神指点下啊,谢谢
|
|