1、看门狗定时器框图
2、绑定寄存器地址和访问寄存器设置
// 寄存器绑定地址
#define WTCON (0xE2700000)
#define WTDAT (0xE2700004)
#define WTCNT (0xE2700008)
#define WTCLRINT (0xE270_000C)
// 操作寄存器
#define rWTCON (*(volatile unsigned int *)WTCON)
#define rWTDAT (*(volatile unsigned int *)WTDAT)
#define rWTCNT (*(volatile unsigned int *)WTCNT)
#define rWTCLRINT (*(volatile unsigned int *)WTCLRINT)
3、初始化WDT使之可以产生中断
// 初始化WDT使之可以产生中断
void wdt_init_interrupt(void)
{
// 第一步,设置好预分频器和分频器,得到时钟周期是128us
// 预分频器
rWTCON &= ~(0xff<<8);
rWTCON |= (65<<8); // 1MHz
// 时钟选择
rWTCON &= ~(0x3<<3);
rWTCON |= (3<<3); // 1/128 MHz, T = 128us
// 第二步,设置中断和复位信号的使能或禁止
// 打开关门狗中断功能
rWTCON |= (1<<2); // enable wdt interrupt
// 关闭看门狗复位功能
rWTCON |= (1<<0); // disable wdt reset
// 第三步,设置定时时间
// WDT定时计数个数,最终定时时间为这里的值×时钟周期
rWTDAT = 10000;
// 这个可以不写,但是现象不一样
// 其实WTDAT中的值不会自动刷到WTCNT中去,如果不显式设置WTCON中的值,它的值就是
// 默认值,然后以这个默认值开始计数,所以这个时间比较久。如果我们自己显式的
// 设置了WTCNT和WTDAT一样的值,则第一次的定时值就和后面的一样了。
rWTCNT = 10000;
// 第四步,先把所有寄存器都设置好之后,再去开看门狗
rWTCON |= ~(1<<5); // enable wdt
}
4、看门狗寄存器说明