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
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号