【实验五】窗口看门狗实验

一、实验目的

1)了解STM32窗口看门狗;

2)了解STM32窗口看门狗与独立看门狗的异同;

3)会使用窗口看门狗;

4)利用STM32窗口看门狗的中断功能来喂狗。


二、STM32 窗口看门狗简介

窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看

门狗电路在达到预置的时间周期时,会产生一个MCU复位。在递减计数器达到窗口寄存器数值之前,如果7位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个MCU

复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。

简而言之,窗口看门狗有两个门限就上窗口和下窗口;下窗口值是固定的0x40;而上窗口由我们自己设置;当看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都

会产生复位。

涉及的寄存器有:控制寄存器(WWDG_CR)、配置寄存器(WWDG_CFR)、状态寄存器(WWDG_SR)。

配置步骤:

1) 使能 WWDG 时钟
2) 设置窗口值和分频数
3) 开启 WWDG 中断并分组
4) 设置计数器初始值并使能看门狗
5) 编写中断服务函数


独立看门狗与窗口看门狗的异同:相同的地方就是二者在一定情况下都会产生MCU复位;而IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立

工作,并且对时间精度要求较低的场合。 WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。


三、硬件设计

LED灯、窗口看门狗。


四、软件设计

void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{ 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);  //   WWDG时钟使能

	WWDG_CNT=tr&WWDG_CNT;   //初始化WWDG_CNT.   
	WWDG_SetPrescaler(fprer);////设置IWDG预分频值

	WWDG_SetWindowValue(wr);//设置窗口值

	WWDG_Enable(WWDG_CNT);	 //使能看门狗 ,	设置 counter .                  

	WWDG_ClearFlag();//清除提前唤醒中断标志位 

	WWDG_NVIC_Init();//初始化窗口看门狗 NVIC

	WWDG_EnableIT(); //开启窗口看门狗中断
} 
//重设置WWDG计数器的值
void WWDG_Set_Counter(u8 cnt)
{
    WWDG_Enable(cnt);//使能看门狗 ,	设置 counter .	 
}
//窗口看门狗中断服务程序
void WWDG_NVIC_Init()
{
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;    //WWDG中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;   //抢占2,子优先级3,组2	
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;	 //抢占2,子优先级3,组2	
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 
	NVIC_Init(&NVIC_InitStructure);//NVIC初始化
}

void WWDG_IRQHandler(void)
	{

	WWDG_SetCounter(WWDG_CNT);	  //当禁掉此句后,窗口看门狗将产生复位

	WWDG_ClearFlag();	  //清除提前唤醒中断标志位

	LED1=!LED1;		 //LED状态翻转
	}


五、实验结果

成功!

你可能感兴趣的:(处理器【STM32】)