OpenEdv-开源电子网

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

关于窗口看门狗实验的一个问题

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2011-7-23
在线时间
0 小时
发表于 2011-8-7 14:09:11 | 显示全部楼层 |阅读模式
 
想请教一个关于窗口看门狗实验的问题:例程里面的中断函数是这样的,
,程序烧进去之后,显示正常,DS1会快速闪烁,可是为什么把led1=led1;这句加到 WWDG->SR=0X00;前面后,DS1就不闪了,我用软件仿真了一下,DS1的翻转周期有60ms,应该可以看到闪烁的,然后在中断里面加了printf函数,串口显示一直有进入中断,所以我很纳闷,既然能进入中断,且相隔时间也不算短,为什么看不到闪烁呢?更奇怪的是:只要在led1=led1;之前再加一个1us的延时函数,灯就又可以闪了。。。不知道什么原因,请高手指点!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-8-7 16:29:14 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2011-7-23
在线时间
0 小时
 楼主| 发表于 2011-8-7 17:38:36 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
QQ截图看不到??
那直接发程序吧。。。
//窗口看门狗中断服务程序
void WWDG_IRQHandler(void) 
{     
u8 wr,tr;   
  wr=WWDG->CFR&0X7F;
tr=WWDG->CR&0X7F; 
if(tr<wr)WWDG_Set_Counter(WWDG_CNT);//只有当计数器的值,小于窗口寄存器的值才能写CR!!        
WWDG->SR=0X00;//清除提前唤醒中断标志位
LED1=!LED1;

}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-8-7 17:52:21 | 显示全部楼层
这是新版的代码.你试试.
此代码不需要判断if(tr<wr)这句了.

#include "wdg.h"
#include "led.h"
//////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//看门狗 驱动代码    
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2011/6/1
//版本:V1.1
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////    
     

//初始化独立看门狗
//prer:分频数:0~7(只有低3位有效!)
//分频因子=4*2^prer.但最大值只能是256!
//rlr:重装载寄存器值:低11位有效.
//时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms).
void IWDG_Init(u8 prer,u16 rlr) 
{
IWDG->KR=0X5555;//使能对IWDG->R和IWDG->RLR的写     
   IWDG->R=prer;  //设置分频系数   
   IWDG->RLR=rlr;  //从加载寄存器 IWDG->RLR  
IWDG->KR=0XAAAA;//reload    
   IWDG->KR=0XCCCC;//使能看门狗
}
//喂独立看门狗
void IWDG_Feed(void)
{
IWDG->KR=0XAAAA;//reload    
}
//保存WWDG计数器的设置值,默认为最大.
u8 WWDG_CNT=0x7f;
//初始化窗口看门狗
//tr:T[6:0],用于存储计数器的值
//wr:W[6:0],用于存储窗口值
//fprer:窗口看门狗的实际设置
//低2位有效.Fwwdg=PCLK1/4096/2^fprer.
void WWDG_Init(u8 tr,u8 wr,u8 fprer)
{   
RCC->APB1ENR|=1<<11; //使能wwdg时钟
WWDG_CNT=tr&WWDG_CNT;   //初始化WWDG_CNT.    
WWDG->CFR|=fprer<<7;    //PCLK1/4096再除2^fprer
WWDG->CFR&=0XFF80;     
WWDG->CFR|=wr;     //设定窗口值     
WWDG->CR|=WWDG_CNT; //设定计数器值
WWDG->CR|=1<<7;  //开启看门狗     
MY_NVIC_Init(2,3,WWDG_IRQChannel,2);//抢占2,子优先级3,组2    
WWDG->SR=0X00; //清除提前唤醒中断标志位
WWDG->CFR|=1<<9;        //使能提前唤醒中断
}
//重设置WWDG计数器的值
void WWDG_Set_Counter(u8 cnt)
{
WWDG->CR =(cnt&0x7F);//重设置7位计数器
}
//窗口看门狗中断服务程序
void WWDG_IRQHandler(void)
{     
WWDG_Set_Counter(WWDG_CNT);//只有当计数器的值,小于窗口寄存器的值才能写CR!!        
WWDG->SR=0X00;//清除提前唤醒中断标志位
LED1=!LED1;
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2011-7-23
在线时间
0 小时
 楼主| 发表于 2011-8-7 21:11:37 | 显示全部楼层
原子大哥,WWDG_Init函数中为什么要清除提前唤醒中断标志位呢??WWDG->SR寄存器的复位值本来就是0啊,似乎没有必要再清零了吧?可是不加那一句的话,主函数在运行到WWDG_Init(0X7F,0X5F,3);这一句时便会复位,无法继续下去,你当初写的时候为什么会加上去呢?另外,在WWDG_IRQHandler函数里,若把 LED1=!LED1;放在WWDG->SR=0X00;之前,DS0会闪烁,DS1则不亮,说明程序在复位,可是之前已经喂狗了啊,为什么还会复位呢??个人觉得WWDG->SR=0X00;好像有玄机,请原子大哥指教。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-8-7 21:16:46 | 显示全部楼层
不清除不是老在中端?
SR的产生终端的时候,不是0的.
你试试我上面的代码,把LED1=!LED1放在SR=0X00之前试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2011-8-26
在线时间
0 小时
发表于 2011-8-31 17:09:14 | 显示全部楼层
WWDG_Init函数中为什么要清除提前唤醒中断标志位呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-8-31 22:27:19 | 显示全部楼层
和硬件有关,硬件设计上是这样的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2012-6-9
在线时间
0 小时
发表于 2013-8-4 15:05:56 | 显示全部楼层
rlr的最大值为多少,是2的11次方吗?
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2014-7-29
在线时间
0 小时
发表于 2014-7-29 20:33:51 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
原子大哥    我注释掉WWDG_Set_Counter(WWDG_CNT)这个后,, 为什么只是红灯一直闪  而黄灯不闪啊   ,我认为黄灯也应该闪啊  求指教啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-29 20:38:58 | 显示全部楼层
注释掉后就一直复位了,复位就只剩下红灯闪了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2014-7-29
在线时间
0 小时
发表于 2014-7-29 21:39:25 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
我理解它是一直在复位  但是复位前它的T【6:0】=0X40时候就会进入中断 ,只是中断没有喂狗 所以才复位,只要进入了中断的话LED1 不就应该闪一下吗 ,,  我哪里理解错了吗?  求大大指教,非常感谢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-30 00:17:11 | 显示全部楼层
回复【12楼】longjia:
---------------------------------
 你没喂狗,直接就复位了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 15:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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