大家好,又见面了,我是你们的朋友全栈君。
周立功的《深入浅出ARM7》上_看门狗
1.看门狗概述
看门狗(WD,Watchdog)包括一个4分频的预分频器和一个32位计数器。时钟通过预分频器输入定时器。定时器递减计数。定时器递减的最小值为0xFF。如果设置一个小于0xFF的值,系统会将0xFF装入计数器。因此最小看门狗间隔为(tplck*256*4) ,最大间隔为(tplck*232*4)的倍数。看门狗的用途是使微控制器在进入错误状态后的一定时间内复位。当看门狗使能时,如果用户程序没有在周期时间内喂狗(重装),看门狗会产生一个系统复位。
特点:
如果没有周期性重装,则产生片内复位;
调试模式;
由软件使能,但要求禁止硬件复位或看门狗复位/中断;
错误/不完整的喂狗时序会导致复位/中断(如果使能);
指示看门狗复位的标志;
带内部预分频的可编程32位定时器
可选择tpclk*4倍数的时间周期:从(tpclk*256*4)到(tplck*232*4)
2.看门狗功能结构图
3.看门狗寄存器描述
看门狗包含4个寄存器,如下表所示:
3.1 看门狗模式寄存器–Watchdog Mode Register(WDMOD-0xE0000000)
WDMOD寄存器通过WDEN和RESET的组合来控制看门狗的操作。如下表所示:
看门狗模式寄存器
3.2 看门狗定时器常数寄存器–Watchdog Timer Constant Register(WDTC-0xE0000004)
WDTC寄存器决定看门狗超时值。当喂狗时序产生时,WDTC的内容重新装入看门狗定时器。它是一个32位寄存器,低8位在复位时设置为1。写入一个小于0xFF的值会使0xFF的值会使0xFF装入WDTC,因此超时的最小时间间隔为tpclk*256*4。
3.3 看门狗喂狗寄存器–Watchdog Feed Register(WDFEED-0xE0000008)
向该寄存器写入0xAA,然后写入0x55会使WDTC的值重新装入看门狗定时器。如果看门狗通过WDMOD寄存器使能,该操作还将启动看门狗运行。置位WDMOD中的WDEN位不足以使能看门狗。在看门狗能够产生中断/复位之前,必须完成一次
有效的喂狗时序。否则,看门狗将忽略喂狗错误。向WDFEED寄存器写入0xAA的下一个操作应当是向WDFEED寄存器写入0x55,除非看门狗被触发。在一个喂狗时序中,一次对看门狗定时器寄存器不正确的访问之后第二个plck周期将产生中断/复
位。
如果应用程序开启了其它中断,为了保证喂狗操作的原子性,在喂狗之前要关闭中断,喂狗之后再开中断。
看门狗喂狗寄存器
3.4 看门狗定时器值存储器–Watchdog Timer Value Register(WDTV -0xE000000C)
WDTV寄存器用于读取看门狗定时器的当前值。
4. 基本操作,看门狗应当根据下面的方法来使用:
–在WDTC寄存器中设置看门狗定时器的固定装载值;
–在WDMOD寄存器中设置模式;
–通过向WDFEED寄存器写入0xAA和0x55启动看门狗;
–在看门狗向下溢出之前应当再次喂狗以防止复位/中断。
当看门狗计数器向下溢出时,程序计数器将从0x00000000开始,和外部复位一样。可以检查看门狗超时标志(WDTOF)来确定看门狗是否产生复位条件。WETOF标志必须由软件清零。
4.1 使用示例
步骤1.设置看门狗模式
WDMOD=0x03;//设置看门狗模式;中断且复位
4.2 设置看门狗定时常数
WDTC=0xff0000;//设置看门狗定时器参数
4.3 喂狗操作
WDFEED=0xaa; //注意:第一次喂狗启动看门狗
WDFEED=0x55;
4.4 喂狗之前关中断
IRQDisable();或者FIQDisbale();//喂狗之前关中断
WDFEED=0xaa;
WDFEED=0x55;
IRQEnable();或者FIQEnable();//喂狗之后开中断。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/154924.html原文链接:https://javaforall.cn