初学者学习总结,如有错误,请大神指正
一、STM32 窗口看门狗
1.1 窗口看门狗简介(WWDG)
窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。
除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置 的时间周期时,会产生一个MCU复位。
在递减计数器达到窗口寄存器数值之前,如果7位的递减 计数器数值(在控制寄存器中)被刷新, 那么也将产生一个MCU复位。
因此递减计数器需要在一个有限的时间窗口中被刷新。
1.2 特性
可编程的自由运行递减计数器
条件复位 ─ 当递减计数器的值小于0x40,(若看门狗被启动)则产生复位。 ─ 当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位。见0。
如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可 以被用于重装载计数器以避免WWDG复位。
1.3 库函数
1)WWDG 时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
2)设置窗口值和分频数
3)开启 WWDG 中断并分组
4)设置计数器初始值并使能看门狗
1.4 中断函数
写窗口看门狗的中断服务函数,通过该函数来喂狗,喂狗要快,否则当 窗口看门狗计数器值减到 0X3F 的时候,就会引起软复位了。在中断服务函数里面也要将状态 寄存器的 EWIF 位清空。
1.5 步骤
1)WWDG 时钟使能
2)设置窗口值和分频值
3)开启 WWDG 中断并分组
4)设置计数器初始值并使能看门狗
5)编写中断函数
二、硬件连接
1) 指示灯 DS0 和 DS1
2) 窗口看门狗(stm32内部资源)
三、程序设计
1)wwdg.c
#include "wwdg.h"
#include "led.h"
u8 WWDG_CNT=0x7f;
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG时钟使能
WWDG_SetPrescaler(fprer);设置IWDG预分频值
WWDG_SetWindowValue(wr);//设置窗口值
WWDG_Enable(tr); //使能看门狗 , 设置 counter .
WWDG_ClearFlag();
WWDG_NVIC_Init();//初始化窗口看门狗 NVIC
WWDG_EnableIT(); //开启窗口看门狗中断
}
//重设置WWDG计数器的值
void WWDG_Set_Counter(u8 cnt)
{
WWDG_Enable(cnt);
}
//窗口看门狗中断服务程序
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)
{
// Update WWDG counter
WWDG_SetCounter(0x7F); //当禁掉此句后,窗口看门狗将产生复位
// Clear EWI flag */
WWDG_ClearFlag(); //清除提前唤醒中断标志位
// Toggle GPIO_Led pin 7 */
LED1=!LED1;
}
2)mian.c
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "wwdg.h"
int main(void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
uart_init(9600);
LED_Init();
LED0=0;
delay_ms(300);
WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);
while(1)
{
LED0=1;
}
}