[mw_shl_code=c,true]#include "wwdg.h"
#include "led.h"
//计数器的设置值WWDG_CNT
u8 WWDG_CNT=0x7f;
//tr计数器值 wr窗口值 fprer分频系数
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
//使能WWDG时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
//初始化WWDG_CNT
WWDG_CNT=WWDG_CNT&tr;
//设置窗口值和分频数
WWDG_SetWindowValue(wr);
WWDG_SetPrescaler(fprer);
//设置计数器初始值使能看门狗并初始化看门狗
WWDG_Enable(WWDG_CNT);
//开启看门狗中断并清除提前唤醒中断标志位,并初始化看门狗中断
WWDG_ClearFlag();
WWDG_EnableIT();
WWDG_NVIC_Init();
}
//重设置WWDG计数器的值
void WWDG_Set_Counter(u8 cnt)
{
WWDG_Enable(cnt);//使能看门狗 , 设置 counter .
}
//窗口看门狗中断服务程序
void WWDG_NVIC_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
//使能WWDG中断
NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;
//抢占优先级2子优先级3
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
//使能外部中断通道
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
//NVIC初始化
NVIC_Init(&NVIC_InitStructure);
}
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(WWDG_CNT);//重新设置计数器的值,以免计数器的值减小到0x3f,使程序复位
//清除提前唤醒中断标志位
WWDG_ClearFlag();
//LED1状态反转
LED1=!LED1;
}
[/mw_shl_code]
[mw_shl_code=c,true]int main(void)
{
delay_init();
uart_init(9600);
LED_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);
LED0=0;
delay_ms(1000);
while(1)
{
LED0=1;
}
}[/mw_shl_code]
为什么我把
[mw_shl_code=c,true]WWDG_ClearFlag();[/mw_shl_code]
语句和在
[mw_shl_code=c,true]WWDG_EnableIT();[/mw_shl_code]
语句的前后顺序反了一下之后,程序运行的结果是LED0和LED1一直在亮?
[mw_shl_code=c,true]
[/mw_shl_code]
|