一、窗口看门狗的三个寄存器:控制寄存器(WWDG_CR)、配置寄存器(WWDG_CFR)、状态寄存器(WWDG_SR)
二、喂狗步骤:
1)使能 WWDG 时钟
WWDG 不同于 IWDG,IWDG 有自己独立的 40Khz 时钟,不存在使能问题。而 WWDG使用的是 PCLK1 的时钟,需要先使能时钟。
2)设置 WWDG_CFR 和 WWDG_CR 两个寄存器
在时钟使能完后,我们设置 WWDG 的 CFR 和 CR 两个寄存器,对 WWDG 进行配置。包括使能窗口看门狗、开启中断、设置计数器的初始值、设置窗口值并设置分频数 WDGTB 等。
3)开启 WWDG 中断并分组在设置完了 WWDG 后,需要配置该中断的分组及使能。这点通过我们之前所编写的MY_NVIC_Init 函数实现就可以了。
4)编写中断服务函数
在最后,还是要编写窗口看门狗的中断服务函数,通过该函数来喂狗,喂狗要快,否则当窗口看门狗计数器值减到 0X3F 的时候,就会引起软复位了。在中断服务函数里面也要将状态寄存器的 EWIF 位清空。
三、代码
wdg.c
//保存 WWDG 计数器的设置值,默认为最大. u8 WWDG_CNT=0x7f; //初始化窗口看门狗 //tr :T[6:0],计数器值 //wr :W[6:0],窗口值 //fprer:分频系数(WDGTB),仅最低 2 位有效 //Fwwdg=PCLK1/(4096*2^fprer). void WWDG_Init(u8 tr,u8 wr,u8 fprer) { RCC->APB1ENR|=1<<11; //使能 wwdg 时钟 WWDG_CNT=tr&WWDG_CNT; //初始化 WWDG_CNT. WWDG->CFR|=fprer<<7; //PCLK1/4096 再除 2^fprer WWDG->CFR&=0XFF80; WWDG->CFR|=wr; //设定窗口值 WWDG->CR|=WWDG_CNT; //设定计数器值 WWDG->CR|=1<<7; //开启看门狗 MY_NVIC_Init(2,3,WWDG_IRQn,2);//抢占 2,子优先级 3,组 2 WWDG->SR=0X00; //清除提前唤醒中断标志位 WWDG->CFR|=1<<9; //使能提前唤醒中断 } //重设置 WWDG 计数器的值 void WWDG_Set_Counter(u8 cnt) { WWDG->CR =(cnt&0x7F);//重设置 7 位计数器 } //窗口看门狗中断服务程序 void WWDG_IRQHandler(void) { WWDG_Set_Counter(WWDG_CNT);//重设窗口看门狗的值! WWDG->SR=0X00;//清除提前唤醒中断标志位 LED1=!LED1; }
主函数
int main(void) { Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 uart_init(72,9600); //串口初始化 LED_Init(); //初始化与 LED 连接的硬件接口 LED0=0; delay_ms(300); WWDG_Init(0X7F,0X5F,3);//计数器值为 7f,窗口寄存器为 5f,分频数为 8 while(1) { LED0=1; } }