重工电子论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 8330|回复: 4
打印 上一主题 下一主题

[经验] STC系列单片机 看门狗一旦启动,就无法关闭

[复制链接]

287

主题

668

帖子

5642

积分

学生管理组

Rank: 8Rank: 8

积分
5642
跳转到指定楼层
楼主
发表于 2016-1-21 16:16:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
由于做个设备 ,要添加看门狗做个保险,最后测试发现看门狗一旦开启,就无法关闭,除非断电。

以下是我设置的程序功能:

程序开始的时候 让LED3常亮3秒,然后熄灭,表明程序初始化完成,进入while循环,之后LED3不会再亮。
程序初始化时候,开始定期器1,让其每秒钟改变LED2的状态,也就是1秒钟亮一下,1秒钟灭一下,表明程序正常在跑。
然后利用按键K1来控制看门狗,K1按下1次,LED1会亮,同时初始化看门狗和把开启看门狗标志置1。再按下一次LED1灭,把看门狗标志置0。
在定时器中断里面,只要看门狗标志为1,则每秒钟都喂狗一次。
把看门狗设置为256分频,也就是大概5秒钟的喂狗周期,过了这个时间没喂狗的话,系统就会重启。

下面是我的测试方法和显现:
给单片机上电,LED3开始亮3秒,然后熄灭,
然后只有LED2开始正常闪烁。
按下按键K1,LED1亮起,表明开启看门狗。此时LED2也正常闪烁。
再次按下K1,LED1熄灭,表明看门狗标志位置0,定时器中断里面不会再喂狗。
此时LED2再闪烁几次后,由于没有喂狗,LED3常亮3秒然后熄灭,表明系统重启了,LED2再闪烁几秒,LED3由常亮3秒后熄灭,表明系统又重启,LED2再闪烁几秒,如此循环。

问题的关键是我在程序的开头,就定义了这样一句:“WDT_CONTR = 0x07;                //把看门狗寄存器设置为关闭状态” ,视图把看门狗关闭,但是结果并没有什么用。最后总结出,看门狗一旦开启,就无法关闭,如果没在规定的时间内喂狗,那么就会无限重启。

以下是程序代码

[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
#include<intrins.h>	
#include"STC12C5AXX.h"

#define TM_BASE 100
sbit K1=P2^0;
sbit K2=P2^1;
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
unsigned char T_BASE=100;	//1s基准
unsigned char WDT_TAG=0;

void Delay10ms( );   //延时10ms
void Timer0Init(void);		//10毫秒@12.000MHz	    
void WDTInit(void);	//看门狗初始化
void WDTFeed(void);	//喂狗函数




/*******************************************************************************
* 函 数 名         : main
* 函数功能		   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{
	unsigned int i,j;
	EA=1;
	i=0;
	j=0;
	WDT_TAG=0;
	LED1=0;
	LED2=0;
	WDT_CONTR = 0x07;		//把看门狗寄存器设置为关闭状态

	/////////////////
	//让LED3亮3秒,表示程序开始启动
	LED3=1;
	for(i=0;i<300;i++)
	{
		Delay10ms();

	}
	LED3=0;
	i=0;
	////////////

	LED3=0;
	K1=1;	//把按键的电平先拉高,之后再去判断是否按下
	Timer0Init();	
	while(1)
	{	 
		if(K1==0)		//检测按键K1是否按下
		{		
			Delay10ms();	//消除抖动
			Delay10ms();	//消除抖动
			Delay10ms();	//消除抖动
			if(K1==0)
			{
				if(LED1==0)
				{
					LED1=1;	
					WDTInit();		//开启看门狗
					WDT_TAG=1;		//看门狗标志置1,表示在定时器里面开始喂狗				
				}
				else
				{
					LED1=0;
					WDT_TAG=0;		//看门狗标志置0,表示在定时器里面不喂狗			
				}
				while((i<50)&&(K1==0))	 //检测按键是否松开
				{
					Delay10ms();
					i++;
				}
				i=0;
			}
		}		





	}				
}

void Delay10ms()		//@12.000MHz   延时10ms
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 117;
	j = 183;
	do
	{
		while (--j);
	} while (--i);
}									   



void Timer0Init(void)		//10毫秒@12.000MHz	  	定时器0初始化
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0xF0;		//设置定时初值
	TH0 = 0xD8;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
}



void tm0_isr() interrupt 1 using 1			//定时器0中断
{
   	TL0 = 0xF0;		//设置定时初值
	TH0 = 0xD8;		//设置定时初值

	T_BASE--;
	if(T_BASE==0)			   	//到1秒后才执行以下操作
	{
		T_BASE=TM_BASE;
		LED2=!LED2;	
		if(1==WDT_TAG) 		//看门狗标志为1则喂狗
		{
			WDTFeed();	 //喂狗
		}
	}	


}


void WDTInit(void)
{
WDT_CONTR = 0x37;//使能看门狗,预分频256	 理论上喂狗周期为5秒钟以内
}
	
void WDTFeed(void)
{
WDT_CONTR = 0x37;//喂狗
}


以下是程序文件,在KEIL 4下面编译通过。
看门狗测试.rar (26.96 KB, 下载次数: 2)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

16

主题

75

帖子

863

积分

版主

Rank: 7Rank: 7Rank: 7

积分
863
QQ
沙发
发表于 2016-1-21 17:26:16 | 只看该作者
本帖最后由 程浥 于 2016-1-21 17:43 编辑



先放这里

你按键改变的是喂狗和不喂狗,而不是打开和关闭看门狗。

在喂狗标志打开的同时,每次都重新初始化了看门狗 (打开了看门狗,EN_WDT);在喂狗标志关闭时,什么都没干。

然而你的结论是 看门狗一旦开启就无法关闭。  
回复 支持 反对

使用道具 举报

287

主题

668

帖子

5642

积分

学生管理组

Rank: 8Rank: 8

积分
5642
板凳
 楼主| 发表于 2016-1-22 10:04:00 | 只看该作者
程浥 发表于 2016-1-21 17:26
先放这里

你按键改变的是喂狗和不喂狗,而不是打开和关闭看门狗。

我程序开始的时候  都执行了1楼代码中 第36行的WDT_CONTR = 0x07;  
关了看门狗使能的
回复 支持 反对

使用道具 举报

16

主题

75

帖子

863

积分

版主

Rank: 7Rank: 7Rank: 7

积分
863
QQ
地板
发表于 2016-1-22 11:02:39 | 只看该作者
本帖最后由 程浥 于 2016-1-22 11:03 编辑
李维强-15级 发表于 2016-1-22 10:04
我程序开始的时候  都执行了1楼代码中 第36行的WDT_CONTR = 0x07;  
关了看门狗使能的


意思是你没有进行按键操作,也关闭不了看门狗?  
回复 支持 反对

使用道具 举报

287

主题

668

帖子

5642

积分

学生管理组

Rank: 8Rank: 8

积分
5642
5#
 楼主| 发表于 2016-1-22 11:31:02 | 只看该作者
程浥 发表于 2016-1-22 11:02
意思是你没有进行按键操作,也关闭不了看门狗?

意思是   即使给看门狗那个寄存器的使能位置0,也不能关闭看门狗
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|cqutlab ( 渝ICP备15004556号

GMT+8, 2024-5-6 18:56 , Processed in 0.181546 second(s), 33 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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