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,为什么都贴出来了。
我们知道窗口看门狗必须在计数器的值在一个范围内才可以喂狗,其中下窗口的值是
固定的 0X40,上窗口的值可以改变,具体的由配置寄存器 CFR 的位 6:0 W[6:0]设置。其值
必须大于 0X40,如果小于或者等于 0X40 就是失去了窗口的价值,而且也不能大于计数器
的值,所以必须得小于 0X7F。那窗口值具体要设置成多大?这个得根据我们需要监控的程
序的运行时间来决定。如果我们要监控的程序段 A 运行的时间为 Ta,当执行完这段程序之
后就要进行喂狗,如果在窗口时间内没有喂狗的话,那程序就肯定是出问题了。一般计数
器的值 TR 设置成最大 0X7F,窗口值为 WR,计数器减一个数的时间为 T,那么时间:
(TR-WR)*T 应该稍微大于 Ta 即可,这样就能做到刚执行完程序段 A 之后喂狗,起到监控
的作用,这样也就可以算出 WR 的值是多少
谢谢哈
一周热门 更多>