GNU ARM汇编-(8)s3c2440的watchdog

GNU ARM汇编--(八)s3c2440的watchdog

        从单片机起,watchdog就是必不可少的.在各种应用环境中,程序很可能跑飞或死掉,这时候就需要通过watchdog来保证整个系统重新恢复到正常状态.

        照旧,给出s3c2440的datasheet说明:

概述:
    watchdog timer用于由于噪声或者系统错误引起的程序跑飞了的情况下恢复处理器的正常操作.它可以被用作一个可以请求中断服务的普通16bit的内部定时器.watchdog timer产生128 PCLK的重启信号.
特点:
    有中断请求的普通内部定时器模式
    当定时器计数为0(超时)时,产生内部的长达128PCLK周期的重启信号


watchdog timer的操作:
    F18-1显示watchdog timer的功能框图.watchdog timer只使用PCLK作为它的时钟源.PCLK先由一个8bit的prescaler进行分频,接下来还会再次分频.

GNU ARM汇编-(8)s3c2440的watchdog
    Prescaler的值和分频因子由watchdog timer控制寄存器(WTCON)决定.有效的预分频值的范围是(0--2^8-1),因为是8bit的分频器.分频因子可选为16,32,64,128.


WTDAT&WTCNT
    一旦watchdog timer启用了,watchdog timer数据寄存器(WTDAT)的值不会自动的重新加载到计数寄存器(WTCNT).所以,在watchdog timer启动前一定要向watchdog timer的计数寄存器(WTCNT)中写入一个初始值.


watchdog timer special registers
WTCON
    WTCON允许user打开或关闭watchdog timer,从4个不同的源中选择时钟信号,开关中断以及开关watchdog timer的输出.watchdog timer用来s3c2440启动后的重启,如果不想处理器重启,watchdog timer要被禁用.在loader开始时,watchdog timer又没初始化的时候,应该将watchdog timer禁用.
    如果user想使用watchdog timer提供的正常定时器功能,那就打开中断,关闭watchdog timer.
Register   Address     R/W               Description            Reset Value
WTCON      0x53000000  R/W    Watchdog timer control register      0x8021
                                    Bit                  Descrition                        Initial State
Prescaler value         [15:8]     预分频的值(0--255)                        0x80
Watchdog timer           [5]        watchdog timer的开关位                1(开)
Clock select               [4:3]      时钟分频因子 00:16 01:32               00
                              10:64 11:128
Interrupt generation     [2]       中断的开关位                                     0
Reset enable/diaable   [0]       输出重启信号的开关                         1


WTDAT
    WTDAT用来指定超时的期限.在最开始的操作中WTDAT的值不会自动的加载到计数器中.使用初始值0x8000就可以驱动第一次超时.以后的话,WTDAT的值就会自动重加载到WTCNT中.
Register         Address       R/W            Description                        Reset Value
WTDAT        0x53000004  R/W    Watchdog timer data register        0x8000
                                    Bit                Description                 Initial State
Count reload value    [15:0]         重加载的计数值                 0x8000


WTCNT
    WTCNT包含正常操作下watchdog timer的当前计数值.值得注意的是,在watchdog timer最初被启用的时候,WTDAT的内容不会自动的加载到WTCNT中,所以WTCNT一定要给一个初始值.
Register     Address     R/W            Description                                   Reset Value
WTCNT        0x53000008  R/W    Watchdog timer count register          0x8000
                                 Bit                Description               Initial State
Count value          [15:0]           定时器的当前计数值        0x8000


        我们先将watchdog的输出重启信号的开关关掉,将中断打开,把watchdog timer当一个普通的定时器来用.设计如下:


        程序实现的是:一个正常的流水灯,定时器每隔2s触发一次中断,中断处理中点亮第四个LED.

        稍微该一下上面的代码:

.equ    int_gen,    0     @关中断
.equ    reset_enable,   1  @打开重启信号

打开重启信号,则可以看到每隔2s系统就重启一次.

如果在循环中加入:

ldr r0, =WTCNT     @喂狗
ldr r1, =Count
str r1, [r0]

那么,这又是一个标准的流水灯了.而且是有watchdog保护的流水灯了.