觉得用处不是很大,简略写了。
窗口看门狗本质是一个7位递减的计数器。只是它的下限是0X40(无法修改),上线可以通过我们自己配置(但是要保证大于下限。),当计数器的值高于上限和低于下限的时候被刷新的话,就会产生一次复位信号。
作用和独立看门狗类似。
刷新的时候可以使用提前唤醒中断来喂狗,否则要计算超时时间(一般不用)。有闲心再来放上相关图片。
创建wwdg文件夹,添加wwdg的文件,添加编译路径。
wwdg.h
#ifndef _WWDG_H
#define _WWDG_H
#include "system.h"
void WWDG_Init(void );
#endif
wwdg.c
#include "wwdg.h"
#include "led.h"
#include "stdio.h"
void WWDG_Init(void )
{
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
WWDG_SetWindowValue(0x5f); //设立上窗口值
WWDG_SetPrescaler(WWDG_Prescaler_8); //设置分频系数
//设置优先级
NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
WWDG_Enable(0x7f); //使能计数器的同时给计数器赋初值
WWDG_ClearFlag(); //排除其他可疑原因
WWDG_EnableIT(); //开启窗口看门狗的中断
}
//使用中断喂狗
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(0x7f);
WWDG_ClearFlag();
led2=!led2;
}
main.c
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "pwm.h"
#include "Usart.h"
#include "key.h"
#include "wwdg.h"
//时间:2020-1-17
//制作者:SaBo
//适用:STM32F103ZET6 (普中科技 PZ6800L)
/*********************************************
程序写好后,下载到开发板上,打开我们的串口调试助手,
设置波特率为9600,数据位8位,停止位1位
led2会不断地闪烁
led1的闪烁表明我们的程序是否正常在进行。(检测作用)
*********************************************/
int main()
{
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();
USART1_Init(9600);
led1=0;
delay_ms(500);
WWDG_Init();
while(1)
{
led1=1;
}
}