WDT
Watch Dog Timer即看门狗定时器,其主要作用是当发生软件故障时可产生复位信号使SOC复位,其本质是一个计数器
工作原理
CPU正常工作时,需要定时往看门狗计数器里刷新一个比较大的值,来保证看门狗计数器中的值不会减到0。CPU一旦遇到错误后,就没办法刷新看门狗计数器的值,减到0之后,就会向CPU发送复位信号,让CPU复位。
二、Exynos_4412下的WDT控制器
看门狗计时器使用的原始时钟是100MHz的PCLK,接着提供了两个预分频器,一级分频器能存储0-255,所以可以降低1-256倍,通过WTCON[15:8]来设置,二级分频器可以在一级分频器的基础上再进行固定倍数降低,通过WTCON[4:3]来设置。WTCNT会按照这个频率往下减,减到0后,会对外发送信号,由WTCON[2]和WTCON[0]来决定发送的是中断信号还是复位信号。
周期的计算公式:1/(PCLK/(一级分频器+1)/二级分频器)
周期是频率的倒数
三、WDT寄存器详解
WTCON:控制看门狗定时器的功能
WTCNT: 存储递减寄存器中的值
WTDAT和WTCLRINT用于中断,本次实验主要使用复位功能,暂时用不上。
四、WDT编程先新建一个工程文件
interface.c
#include"exynos_4412.h"void Delay(unsigned int Time) { while(Time--); } int main() { WDT.WTCON = WDT.WTCON | (0xFF << 8); WDT.WTCON = WDT.WTCON | (0x3 << 3); /*WTCON递减频率 = PLCK(100000000)/(0xFF + 1)/128 * = 3052 */ WDT.WTCON = WDT.WTCON & (~(1 << 2)); WDT.WTCON = WDT.WTCON | 1; WDT.WTCNT = (3052 * 5); WDT.WTCON = WDT.WTCON | (1 << 5); while(1) { printf("WDT.WTCNT = %d\n", WDT.WTCNT); Delay(100000); } return 0; }#include"exynos_4412.h"void Delay(unsigned int Time) { while(Time--); } int main() { WDT.WTCON = WDT.WTCON | (0xFF << 8); WDT.WTCON = WDT.WTCON | (0x3 << 3); /*WTCON递减频率 = PLCK(100000000)/(0xFF + 1)/128 * = 3052 */ WDT.WTCON = WDT.WTCON & (~(1 << 2)); WDT.WTCON = WDT.WTCON | 1; WDT.WTCNT = (3052 * 5); WDT.WTCON = WDT.WTCON | (1 << 5); while(1) { printf("WDT.WTCNT = %d\n", WDT.WTCNT); WDT.WTCNT = 3052; Delay(100000); } return 0; }
此时只有程序出错,导致不能喂狗,才会复位。