首页 > 技术文章 > 窗口看门狗WWDG实验

youwei666 2019-11-29 13:17 原文

一、窗口看门狗的三个寄存器:控制寄存器(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;
}
}

推荐阅读