STM32F103ZET6之窗口看门狗实验
文章目录
前言
对于STM32的学习可分为3个版本。
1.寄存器版本
2.库函数版本
3.HAL库版本
由于个人原因,选择库函数版本来进行STM32的学习。
提示:软件安装等问题,不进行讲解!!!
一、窗口看门狗相关概述
1.概念
2.原理
二、相关寄存器
1.控制寄存器(WWDG_CR)
2.配置寄存器(WWDG_CFR)
3.状态寄存器(WWDG_SR)
三、操作步骤
1.窗口看门狗超时时间计算
2.操作步骤
四、程序源码
1.wwdg.h
代码如下:
#ifndef __WWDG_H
#define __WWDG_H
#include "sys.h"
void WWDG_Init(u8 tr,u8 wr,u32 fprer );//初始化WWDG
void WWDG_Set_Counter(u8 cnt);//设置WWDG的计数器
void WWDG_NVIC_Init(void);
#endif
2.wwdg.c
代码如下:
#include "wwdg.h"
#include "led.h"
//保存WWDG计数器的设置值,默认为最大.
u8 WWDG_CNT=0x7f;
void WWDG_Init(u8 tr,u8 wr,u32 fprer)//tr:计数器值 wr:窗口值 fprer:分频系数
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);//使能看门狗时
WWDG_CNT=tr&WWDG_CNT;//取tr的0-6位
WWDG_SetPrescaler(fprer);//设置分频系数
WWDG_SetWindowValue(wr);//设置上窗口值
WWDG_Enable(WWDG_CNT);//使能看门狗
WWDG_ClearFlag();//清除提前唤醒中断标志位
WWDG_NVIC_Init();//分组
WWDG_EnableIT();//开启提前唤醒中断
}
void WWDG_NVIC_Init(void)//中断优先级设置
{
NVIC_InitTypeDef NVIC_Initstr;
NVIC_Initstr.NVIC_IRQChannel=WWDG_IRQn;
NVIC_Initstr.NVIC_IRQChannelCmd=ENABLE;
NVIC_Initstr.NVIC_IRQChannelPreemptionPriority=2;
NVIC_Initstr.NVIC_IRQChannelSubPriority=3;
NVIC_Init(&NVIC_Initstr);
}
void WWDG_Set_Counter(u8 cnt)//喂狗
{
WWDG_Enable(cnt);
}
void WWDG_IRQHandler(void)//中断服务函数
{
WWDG_Set_Counter(WWDG_CNT);//喂狗
WWDG_ClearFlag();
LED1=!LED1;
}
3.main.c
代码如下:
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "beep.h"
#include "key.h"
#include "usart.h"
#include "exti.h"
#include "iwdg.h"
#include "wwdg.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init();
LED_Init();
Beep_Init();
KEY_Init();
uart_init(115200);
EXTIX_Init();
LED2=0;
delay_ms(300);
WWDG_Init(0x7F,0x5F,WWDG_Prescaler_8);
while(1)
{
LED2=1;
}
}
五、实验结果
当中断服务函数中,无喂狗操作,则LED1反复翻转。LED2通电后点亮,经过300ms后熄灭,很快便重新点亮,经过300ms后熄灭,反复
当中断服务函数中,有喂狗操作,则LED1反复翻转。LED2通电后点亮,经过300ms后熄灭。
总结
看门狗完结!!!