1. 首先晓得看门狗的基本知识
看门狗是带复位功能的定时器,用于在系统跑飞时复位系统。
接下来按照上次的知识对看门狗进行推导
看门狗的关键词是 定时器 复位
定时器 关键是 时间段 中断
时间段 关键的是 时钟周期 计数值
时间周期 关键是 时钟源 分频
至此,我们就晓得处理看门狗定时器的基本思路,
即设置 时钟源 和 分频 和 计数值 完成 基本初始化,
这里,只是用中断功能,所以还需要设置使用中断,禁止复位。
2. 有了基本思路,下面来看数据手册(由于看门狗是SoC内部的,原理图上没有)
找到最关键的图
可以看出符合上面猜想的思路,
即 时钟源 为 PCLK, 分频 两次, 得到时钟周期
WTDAT 设置 计数值
WTCON[2] ,WTCON[0],设置是否产生 中断 或 复位
3. 既然思路清晰了,下面开始编程
#define WTCON (0xE2700000) #define WTDAT (0xE2700004) #define WTCNT (0xE2700008) #define WTCLRINT (0xE270000C) #define rWTCON (*(volatile unsigned int *)WTCON) #define rWTDAT (*(volatile unsigned int *)WTDAT) #define rWTCNT (*(volatile unsigned int *)WTCNT) #define rWTCLRINT (*(volatile unsigned int *)WTCLRINT) #include "stdio.h" void intc_clearvectaddr(void); void wdt_init() { // 设置时钟周期 rWTCON &= ~((0xFF << 8) | (3 << 3)); rWTCON |= (65 << 8) | (3 << 3); // 设置计数值 rWTDAT = 1000; rWTCNT = 1000; // 关闭复位,开启中断 rWTCON |= 1 << 2; rWTCON &= ~(1 << 0); // 开启看门狗 rWTCON |= 1 << 5; } static int i = 0; void isr_wdt() { printf("----isr_wdt %d----\n", i++); rWTCLRINT = 1; intc_clearvectaddr(); }