前注:本文章主要讲解【固件库(标准库)】
内容为 'Jojo'编写,日常学习总结,内容如有不足、不妥之处请私信告知,谢谢!
硬件原理
配置步骤
1.打开WWDG时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
2.设置预分频器的值
WWDG_SetPrescaler(fprer);
3.设置上窗口的值
WWDG_SetWindowValue(wr);
4.设置递减计数器的值
WWDG_SetCounter(tr);
5.使能并设置递减计数器的值
WWDG_Enable(0x7F);
6.清楚提前唤醒中断标志位
WWDG_ClearFlag();
7.中断配置
void Wwdg_NVIC_Init(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=WWDG_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=3;
NVIC_Init(&NVIC_InitStruct);
}
8.开启WWDG中断(提前唤醒中断)
WWDG_EnableIT();
9.编写中断服务函数
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(0x7f);//喂狗
//清楚提前唤醒中断标志位
WWDG_ClearFlag();
LED0=!LED0;
}
喂狗所用的函数
WWDG_SetCounter(0x7f);
文件
main.c
iwdg.c
#include "iwdg.h"
#include "led.h"
void Iwdg_Init(u8 per,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(per);
IWDG_SetReload(rlr);
IWDG_ReloadCounter();
IWDG_Enable();
}
void Wwdg_Init(u8 tr,u8 wr,u32 fprer)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
//设置预分频器的值
WWDG_SetPrescaler(fprer);
//设置上窗口的值
WWDG_SetWindowValue(wr);
//设置递减计数器的值
WWDG_SetCounter(tr);
//使能并设置递减计数器的值
WWDG_Enable(0x7F);
//清楚提前唤醒中断标志位
WWDG_ClearFlag();
//中断配置
Wwdg_NVIC_Init();
//开启WWDG中断(提前唤醒中断)
WWDG_EnableIT();
}
void Wwdg_NVIC_Init(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=WWDG_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=3;
NVIC_Init(&NVIC_InitStruct);
}
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(0x7f);//喂狗
//清楚提前唤醒中断标志位
WWDG_ClearFlag();
LED0=!LED0;
}
iwdg.h
#ifndef __IWDG_H
#define __IWDG_H
#include "sys.h"
void Iwdg_Init(u8 per,u16 rlr);
void Wwdg_Init(u8 tr,u8 wr,u32 fprer);
void Wwdg_NVIC_Init(void);
#endif