结构框图
先看一下wdt的结构框图
从上面的图中粗略可以看出 :
PCLK_PSYS经过两级分频后生成看门狗的时钟周期
定时的时间写入到WTDAT寄存器中,WTCNT中自动会递减1,定时时间到了,也就是WTCNT减到0的时候,会产生中断信号或者是复位信号,
具体要产生那种信号 这是需要对WTCON寄存器的某位进行设置的,
软件是怎么样来操纵硬件的,就是对它的寄存器进行位操作(控制寄存器、数据寄存器、状态寄存器)
模式 : 整体读出 ---- 修改对应的位 ---- 写入
看到了 C语言的位运算在嵌入式中是非常重要的了吧,比如需要操纵LCD、I2C总线....就是操作LCD控制器、IIC控制器...,就是对这些控制器的寄存器进行位操作,
那么你现在知道“喂狗”是怎么一回事了把,就是再WTCNT减到0之前,对WTDAT寄存器中写值即可
那么 什么是PCLK_PSYS ,为什么要分频,分频是一个什么概念,下面详细说 分频与倍频
PCLK_PSYS
先看一幅图:
例子可能不是太恰当,帮助你理解 :
发电厂发出的原始几十V的电流 经过变压器 升压到几千伏进行传输,这么高的电流显然不能被直接使用,需要再经过变压器降压到220V、380V 到家庭电器、工业设备使用 ,而我们使用的手机则又需要进一步的通过充电器降压到5V的电才能给手机设备使用。
设计思路:
外部晶振 + 内部时钟发生器 产生的时钟频率太低,外设需要一定的时钟频率才能工作,且各自需要的时钟频率不同,所以 就先倍频后形成一个高频的,然后各个外设再根据自己的需要来通过分频器进行分频得到自己的时钟频率,由上面的图可以知道 我们是可以通过编程来定制外设的时钟来源、分频系数,从而形成最后自己使用的时钟频率的。分频、倍频的背面就是一堆在工作的复杂电路,暂不研究。
寄存器
1 : WTCON
操作WTCON可以使能/禁止看门狗定时器、选择时钟的来源、使能/禁止中断等
2 : WTDAT
WTDAT中的值 会自动的加载到 WTCNT中。原文是:the value of WTDAT is automatically reloaded into WTCNT
3:WTCNT
这里要注意一点,要先设置好定时的时长,然后再enable wdt
4 : WTCLRINT
清中断,写入任何值均可清除中断,读这个register 是不允许的。
所以,操作关门狗的步骤就有了
1 : 设置预分频器和分频器的值,目的是获取时钟周期
2 : 使能或禁止中断和复位信号
3 : 写入定时时长
4 : 使能看门狗
定时器
usb主机控制器(XHCI)驱动中使用到了定时器,请见我以前博文的浅析,这里主要说的是裸机
http://blog.csdn.net/leesagacious/article/details/51254112
U-Boot中对wdt的操作
先看一幅图 (这里和wdt没有关系,既然我画都画好了,大家看看也好吧,哦哦)
下面是 u-boot 中 start.S中的源码
reset:
@;mrs r0,cpsr
@;bic r0,r0,#0x1f
@;orr r0,r0,#0xd3
@;msr cpsr,r0
/*
设置CPU禁止 IRQ、FIQ,ARM状态 、SVC模式
msr : move to state register from register
*/
msr cpsr_c,#0xd3
/*
这是 再U-Boot 第一阶段 check reset status之后 就关闭了看门狗
Disable Watchdog
关闭看门狗
ELFIN_WATCHDOG_BASE : WTCON的地址
*/
ldr r0, =ELFIN_WATCHDOG_BASE /* 0xE2700000 */
mov r1, #0
str r1, [r0]
将 0 写入到了 WTCON中 diable watch dog timer,看门狗被压在五指山下 想复位、胡闹 是不可能了,哈哈!