窗口看门狗红灯一直亮,没有闪烁,谁给帮忙看看怎么回事

2019-07-21 08:41发布

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;
        }
       
       
        }
       



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
正点原子
1楼-- · 2019-07-21 09:34
下载我们例程测试,不要修改
克里斯丁
2楼-- · 2019-07-21 10:11
我下载你们例程试了,和我的现象一样,都是红灯一直亮,怎么回事啊?原子哥
satine
3楼-- · 2019-07-21 15:24
克里斯丁 发表于 2018-9-7 08:23
我下载你们例程试了,和我的现象一样,都是红灯一直亮,怎么回事啊?原子哥

你这是跑IWDG还是WWDG,为什么都贴出来了。
satine
4楼-- · 2019-07-21 16:34
 精彩回答 2  元偷偷看……
satine
5楼-- · 2019-07-21 19:06
克里斯丁 发表于 2018-9-7 08:23
我下载你们例程试了,和我的现象一样,都是红灯一直亮,怎么回事啊?原子哥

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

谢谢哈

一周热门 更多>