不明白的地方:为什么将 “使能看门狗” 放在整个WWDG初始化的最后,系统就会不断进行复位,而进不去中断?怎么也想不明白。。。而且库函数操作的手册上的步骤也是这个顺序。。。
[mw_shl_code=c,true]寄存器:[/mw_shl_code]
[mw_shl_code=c,true]void WWDG_Init(u8 tr, u8 wr, u8 fprer)
{
RCC->APB1ENR |= 1 << 11; /* 使能复用功能时钟 */
WWDG_CNT = tr & WWDG_CNT; /* 初始化WWDG_CNT计数器值 */
WWDG->CFR |= fprer << 7; /* 设置窗口看门狗WWDG的预分频值 */
WWDG->CFR &= 0XFF80; /* 清空窗口值W[6:0] */
WWDG->CFR |= wr; /* 设置窗口看门狗WWDG的窗口上限 */
WWDG->CR |= WWDG_CNT; /* 设置CNT计数器值 */
/* 抢占优先级为2,子优先级为3,NVIC的中断分组为2 */
MY_NVIC_Init(2, 3, WWDG_IRQn, 2);
WWDG->SR = 0X00; /* 清除提前唤醒中断标志位EWIF */
WWDG->CFR |= 1 << 9; /* 开启窗口看门狗WWDG中断 */
WWDG->CR |= 1 << 7; /* 使能看门狗 */
} [/mw_shl_code]
[mw_shl_code=c,true]库函数:[/mw_shl_code]
[mw_shl_code=c,true]void WWDG_Init(u8 tr, u8 wr, u32 fprer)
{
/* 使能复用功能时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
WWDG_CNT = tr & WWDG_CNT; /* 初始化WWDG_CNT计数器值 */
WWDG_SetPrescaler(fprer); /* 设置窗口看门狗WWDG的预分频值 */
WWDG_SetWindowValue(wr); /* 设置窗口看门狗WWDG的窗口上限 */
WWDG_ClearFlag(); /* 清除提前唤醒中断标志位EWIF */
WWDG_NVIC_Init(); /* 窗口看门狗WWDG的NVIC中断配置 */
WWDG_EnableIT(); /* 开启窗口看门狗WWDG中断 */
WWDG_Enable(WWDG_CNT); /* 使能看门狗,并设置CNT计数器初始值 */
}
[/mw_shl_code]
|