OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2673|回复: 6

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

[复制链接]

14

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2018-7-9
在线时间
56 小时
发表于 2018-9-6 10:58:22 | 显示全部楼层 |阅读模式
1金钱
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;
        }
       
       
        }
       



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-9-7 02:11:13 | 显示全部楼层
下载我们例程测试,不要修改
回复

使用道具 举报

14

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2018-7-9
在线时间
56 小时
 楼主| 发表于 2018-9-7 08:23:53 | 显示全部楼层
我下载你们例程试了,和我的现象一样,都是红灯一直亮,怎么回事啊?原子哥
回复

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
发表于 2018-10-25 11:33:18 | 显示全部楼层
克里斯丁 发表于 2018-9-7 08:23
我下载你们例程试了,和我的现象一样,都是红灯一直亮,怎么回事啊?原子哥

你这是跑IWDG还是WWDG,为什么都贴出来了。
回复

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
发表于 2018-10-25 11:39:45 | 显示全部楼层
克里斯丁 发表于 2018-9-7 08:23
我下载你们例程试了,和我的现象一样,都是红灯一直亮,怎么回事啊?原子哥

好像窗口看门狗计数器w[6:0],最大只能127(0x7F)啊,你写的0x8F超过了。
回复

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
发表于 2018-10-25 11:57:28 | 显示全部楼层
克里斯丁 发表于 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 的值是多少
回复

使用道具 举报

14

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2018-7-9
在线时间
56 小时
 楼主| 发表于 2018-10-27 07:56:03 | 显示全部楼层
satine 发表于 2018-10-25 11:57
我们知道窗口看门狗必须在计数器的值在一个范围内才可以喂狗,其中下窗口的值是
固定的 0X40,上窗口的 ...

谢谢哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 10:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表