N76E003配置看门狗watchdog

说明

本例子只做软件异常时重置系统用,不需要用作定时器或唤醒用,所以不用打开watchdog中断。需要注意的是:如果上次启动开启过watchdog reset,想要关闭,下次启动必须清除CONFIG4内的WDT配置,否则watchdog还是启动的。

主要代码只是在CONFIG4寄存器对看门狗定时器WDT做使能关闭的配置([7:4],0xF0关闭重置只做定时器,0x50和其他任意值开启重置,但0x50在空闲或掉电模式下停止运行),由于是页擦除,所以先保存CONFIG0到CONFIG4的值再写入。
在这里插入图片描述

在操作前要执行TA时效访问保护。
在这里插入图片描述

参考代码

#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h"

#define EN_WATCHDOG

#define CRLF "\r\n"

#define     CFG_READ            0xC0
#define     CFG_ERASE           0xE2
#define     CFG_BYTE_PROGRAM    0xE1

int is_watchdog_reset_enabled(void)
{
	UINT8 cf4;

	set_IAPEN;
	IAPAL = 0x04;
	IAPAH = 0x00;
	IAPCN = CFG_READ;
	set_IAPGO;                                  //get CONFIG4 data
	cf4 = IAPFD;
	clr_IAPEN;

	//printf("watchdog: cf4=0x%bX"CRLF, cf4);

	if ((cf4 & 0xF0) == 0xF0)
	{
		return 0;
	}
	else if ((cf4 & 0xF0) == 0x50)
	{
		return 1;	// watchdog reset enabled, but disabled in idle and power down mode
	}
	else
	{
		return 2;	// watchdog reset enabled, but enabled in idle and power down mode
	}
}

#ifdef EN_WATCHDOG
#define FEED_DOG()  set_WDCLR

/***********************************************************************
	WDT CONFIG enable 
	warning : this macro is only when ICP not enable CONFIG WDT function
	copy this marco code to you code to enable WDT reset.
************************************************************************/
void Enable_WDT_Reset_Config(void)
{
	set_IAPEN;
    IAPAL = 0x04;
    IAPAH = 0x00;
    IAPFD = 0x5F; //0x0F;		// CONFIG4
    IAPCN = CFG_BYTE_PROGRAM;
    set_CFUEN;
    set_IAPGO;                                  //trigger IAP
		while((CHPCON&SET_BIT6)==SET_BIT6);          //check IAPFF (CHPCON.6)
    clr_CFUEN;
    clr_IAPEN;
}
#else
/***********************************************************************
	WDT CONFIG disable 
	warning : this macro is for CONFIG already enable WDT Reset to disable.
	Since erase CONFIG is full page 
	step 1. storage CONFIG value in RAM
	step 2. modify RAM CONFIG4 WDT value to disable 
	step 3. erase CONFIG page
	step 4. re writer CONFIG.
************************************************************************/
void Disable_WDT_Reset_Config(void)
{
	UINT8 cf0,cf1,cf2,cf3,cf4;

	set_IAPEN;
	IAPAL = 0x00;
	IAPAH = 0x00;
	IAPCN = CFG_READ;
	set_IAPGO;                                  //Storage CONFIG0 data
	cf0 = IAPFD;
	IAPAL = 0x01;
	set_IAPGO;                                  //Storage CONFIG1 data
	cf1 = IAPFD;
	IAPAL = 0x02;
	set_IAPGO;                                  //Storage CONFIG2 data
	cf2 = IAPFD;
	IAPAL = 0x03;
	set_IAPGO;                                  //Storage CONFIG3 data
	cf3 = IAPFD;
	IAPAL = 0x04;
	set_IAPGO;                                  //Storage CONFIG4 data
	cf4 = IAPFD;
	cf4 |= 0xF0;								//Moidfy Storage CONFIG4 data disable WDT reset

	set_CFUEN;	
	IAPCN = CFG_ERASE;							//Erase CONFIG all
	IAPAH = 0x00;
	IAPAL = 0x00;
	IAPFD = 0xFF;
	set_IAPGO;

	IAPCN = CFG_BYTE_PROGRAM;					//Write CONFIG
	IAPFD = cf0;
	set_IAPGO;
	IAPAL = 0x01;
	IAPFD = cf1;
	set_IAPGO;
	IAPAL = 0x02;
	IAPFD = cf2;
	set_IAPGO;
	IAPAL = 0x03;
	IAPFD = cf3;
	set_IAPGO;
	IAPAL = 0x04;
	IAPFD = cf4;
	set_IAPGO;

	clr_CFUEN;
	clr_IAPEN;
}
#endif /* EN_WATCHDOG */

void init_watchdog(void)
{
	printf("watchdog: WDCON=0x%bX"CRLF, WDCON);
	if (WDCON & SET_BIT3) // WDTRF
	{
		printf("WARNING: Last time, the system was reset by the watchdog!"CRLF);
		clr_WDTRF;
	}

	//----------------------------------------------------------------------------------------------
	// WDT Init !!! ENABLE CONFIG WDT FIRST !!!
	// Warning:
	// Always check CONFIG WDT enable first, CONFIG not enable, SFR can't enable WDT reset
	// Please call Enable_WDT_Reset_Config() function to enable CONFIG WDT reset
	//----------------------------------------------------------------------------------------------

	if (is_watchdog_reset_enabled())
	{
#ifndef EN_WATCHDOG
		Disable_WDT_Reset_Config(); 					//Software disable WDT reset CONFIG setting
		return;
#endif
	}
	else
	{
#ifdef EN_WATCHDOG
		Enable_WDT_Reset_Config();						//Software enable WDT reset CONFIG setting
#endif
	}

#ifdef EN_WATCHDOG
	TA=0xAA;TA=0x55;WDCON|=0x07;						//Setting WDT prescale 
	set_WDCLR;											//Clear WDT timer
	while((WDCON|~SET_BIT6)==0xFF); 				//confirm WDT clear is ok before into power down mode
	//		EA = 1;
	set_WDTR;											//WDT run
#endif

}

void main(void)
{
	init_watchdog();

	while(1)
	{
		#ifdef EN_WATCHDOG
		FEED_DOG();
		#endif

		printf("main: do something.."CRLF);
	}
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值