打印
[应用方案]

N76E003配置看门狗watchdog

[复制链接]
1815|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
磨砂|  楼主 | 2021-7-2 15:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
说明
本例子只做软件异常时重置系统用,不需要用作定时器或唤醒用,所以不用打开watchdog中断。需要注意的是:如果上次启动开启过watchdog reset,想要关闭,下次启动必须清除CONFIG4内的WDT配置,否则watchdog还是启动的。

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


在操作前要执行TA时效访问保护。



使用特权

评论回复
沙发
磨砂|  楼主 | 2021-7-2 15:25 | 只看该作者
参考代码


#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


使用特权

评论回复
板凳
磨砂|  楼主 | 2021-7-2 15:25 | 只看该作者
/***********************************************************************
        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;
}


使用特权

评论回复
地板
磨砂|  楼主 | 2021-7-2 15:26 | 只看该作者
#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 */



使用特权

评论回复
5
磨砂|  楼主 | 2021-7-2 15:28 | 只看该作者
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

}


使用特权

评论回复
6
磨砂|  楼主 | 2021-7-2 15:29 | 只看该作者

void main(void)
{
        init_watchdog();

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

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



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

3886

帖子

2

粉丝