ARM接口技术——WDT看门狗

WDT简介

Watch Dot Timer即看门狗定时器,其主要作用是当发生软件故障时可产生复位信号使SOC复位,其本质是一个计数器。

 

 

工作原理是WDT会自减,减到0的时候发送复位中断信号。

启动了WDT后,正常程序要定时“喂狗”,即给WDT写一个大的值,防止WDT减到0。

WDT实验

Exynos4412WDT简介:

 

 

他有两种工作模式,第一种是产生一个定时器中断,第二种就是正常的产生复位信号。

原理图:

 

 

1. WTCNT(Down Counter)减到0会发送两种信号,一种是中断,另一种是给复位信号生成器发送信号,再产生复位信号。要配置WTCON[2]和WTCON[0]配置成中断或复位信号。

 

2. WTCNT的递减频率使用了一个时钟源PCLK,决定了WTCNT如何频率去递减。

PCLK经过两级的分频之后,才发送给WTCNT,分频配置分别在WTCON[15:8]和WTCON[4:3]。

 

 

 

WDT寄存器配置

WDT寄存器摘要:

 

 

有4个寄存器,我们使用的是复位功能,WTDAT和WTCLRINT用于配置中断相关的配置,不使用它。

WTCON:

 

 

首先使能WDT设置WTCON[5]设为1,设为复位功能WTCON[0]设为1,还有两级分频随便设个数字,其它的不管。

WTCNT:

 

 

测试是否会复位的时候,我们直接不管这个寄存器,让它复位;

测试喂狗,让WDT不产生复位的时候,直接对WTCNT不断写满值,WTCNT = ~0。

测试代码

产生复位测试

#include "exynos_4412.h"


WDT_Reset_Init()
{
    /* 00000000 00000000 00000000 00000000 */
    /* 00000000 00000000 11111111 00101001 设为该值*/
    WDT.WTCON = WDT.WTCON & ~0xFF3D | 0xF29;
}

WDT_Feed()
{
    WDT.WTCNT = ~0;
}

int main()
{
    printf("reset\n");
    WDT_Reset_Init();
    while(1)
    {
        //WDT_Feed();
        printf("not feed dog\n"); /* 重定向到UART的printf */
    }
    return 0;
}

 

让程序喂狗,不产生复位#include "exynos_4412.h"

 

#include "exynos_4412.h"

WDT_Reset_Init()
{
    /* 00000000 00000000 00000000 00000000 */
    /* 00000000 00000000 11111111 00101001 设为该值*/
    WDT.WTCON = WDT.WTCON & ~0xFF3D | 0xF29;
}

WDT_Feed()
{
    WDT.WTCNT = ~0;
}

int main()
{
    printf("reset\n");
    WDT_Reset_Init();
    while(1)
    {
        WDT_Feed();
        printf("feed dog\n"); /* 重定向到UART的printf */
    }
    return 0;
}

实验现象

不喂狗

 

 程序执行一段时间后,自动复位了。而下载的程序是下载到内存,掉电丢失,所以复位后没有程序执行。


 

喂狗

 

 程序不断的执行。


 

END

 

posted @ 2022-04-25 16:11  zj城城城城  阅读(1573)  评论(0)    收藏  举报