wwdg.c
#include "wwdg.h"
#include "led.h"
void IWDG_Init(u8 prer,u16 rlr) //初始化独立看门狗函数
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器写保护,使能对寄存器IWDG_PR IWDG_RLR的写操作
IWDG_SetPrescaler(prer); //设置预分频系数为4,预分频值为64
IWDG_SetReload(rlr); //设置重装载值
IWDG_ReloadCounter(); //进行计数器重装载
IWDG_Enable(); //使能IWDG
}
void IWDG_Feed(void) //设置喂狗函数
{
IWDG_ReloadCounter(); //计数器重装载值
}
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; //初始化WWDG_CNT
WWDG_SetPrescaler(fprer); //设置预分频系数
WWDG_SetWindowValue(wr); //设置窗口值
WWDG_Enable(WWDG_CNT); //使能看门狗,设置计数器counter
WWDG_ClearFlag(); //清楚提前中断服务标志位
WWDG_NVIC_Init(); //初始化窗口看门狗中断
WWDG_EnableIT(); //开启提前唤醒中断分组
}
void WWDG_Set_Counter(u8 cnt) //重设置wwdg 计数器值
{
WWDG_Enable(cnt); //使能看门狗 设置计数器
}
void WWDG_NVIC_Init()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn; //设置中断通道为窗口看门狗通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //设置抢占优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2; //设置响应优先级为2
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure); //初始化中断服务函数
}
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(WWDG_CNT); //喂狗,禁掉词句 窗口看门狗函数将复位
WWDG_ClearFlag(); //清除提前唤醒中断标志位
LED1=!LED1;
}
main
#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 2个抢占优先级 2个响应优先级
uart_init(115200); //设置串口波特率为115200
LED_Init(); //初筛华led
LED0=0;
delay_ms(800);
WWDG_Init(0x8f,0x5f,WWDG_Prescaler_8); // 设置窗口就看门狗的计数器值为7f 窗口值为5f 分频系数为8
while(1)
{
LED0=1;
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
你这是跑IWDG还是WWDG,为什么都贴出来了。
一周热门 更多>