看门狗定时器由独立的128 kHz片内振荡器驱动。通过设置看门狗定时器的预分频器可以调节看门狗复位的时间间隔,如 P44Table26 所示。看门狗复位指令 WDR 用来复位看门狗定时器。此外,禁止看门狗定时器或发生复位时它也被复位。复位时间有 10 个选项。如果没有及时复位定时器,一旦时间超过复位周期, ATmega168 就复位,并执行复位向量指向的程序。具体的看门狗复位时序在 P44Table26 有说明。
看门狗定时器还可用来产生中断。这在使用看门狗将系统从掉电状态唤醒是非常有用的。
为了防止无意之间禁止看门狗定时器或改变了复位时间,熔丝位 WDTON 为此提供了 2个不同的保护级别,如 Table 24.所示。请参见P47”改变看门狗定时器配置的时间序列” 。
看门狗定时器控制寄存器-WDTCSR
· Bits 7 – WDIF: 看门狗超时中断标志
当看门狗定时器超时且定时器作为中断使用时,该位置位。执行相应的中断处理程序时 WDIF 由硬件清零。也可通过对标志位写 "1” 对 WDIF 清零。当 SREG 寄存器中的 I 位与 WDIE 也置位时, MCU 执行看门狗超时中断。
· Bit 6 – WDIE: 看门狗超时中断使能
WDIE置"1”时WDE被清零,状态寄存器中的I位置位,看门狗超时中断使能。当看门狗定时器出现超时时执行相应的中断程序。
如果 WDE置位,当超时出现时, WDIE 由硬件自动清零。 这对使用中断时保证看门狗复 位的安全性非常有效。在 WDIE 位被清零后,下一个超时将引发系统复位。为避免看门狗 复位,在每次中断后必须对 WDIE置位。
· Bit 4 – WDCE: 看门狗修改使能
清零 WDE时必须置位 WDCE,否则不能禁止看门狗。一旦置位,硬件将在紧接的 4 个时 钟周期之后将其清零。请参考有关 WDE 的说明来禁止看门狗。修改预分频器也必须置位 WDCE,如 P47“改变看门狗定时器配置的时间序列”所示。
· Bit 3 – WDE: 使能看门狗
WDE为“1” 时,看门狗使能,否则看门狗将被禁止。只有在WDCE为“1”时WDE 才能清零。以下为关闭看门狗的步骤:
1. 在同一个指令内对WDCE 和WDE 写"1",即使WDE 已经为"1"。
2. 在紧接的4 个时钟周期之内对WDE 写"0"。这会禁用看门狗。
工作于安全级别 2 时,即使使用了上述的算法,也无法禁止看门狗定时器。参见 P47“改变看门狗定时器配置的时间序列”所示。
工作于安全级别 1 时, WDE 被 MCUSR 的 WDRF 功能所替换 ,请参见 P41”MCU 状态寄存器 – MCUSR” 中关于 WDRF 的说明。这意味着当 WDRF 置位时 WDE 同时置位。为清零 WDE,在使用上述过程禁用看门狗之前必须清零 WDRF。这一特性保证在出现故障时有多重复位,且在故障解决后可以安全地启动。
Note: 如果在应用中不需要使用看门狗定时器,则在器件初始化时应运行看门狗禁用程序。如果 看门狗被意外使能,如程序跑飞或出现 BOD,器件将会复位,且在结束复位时 WDRF 标 志位置位。这将自动激活看门狗,引发新的看门狗复位。为避免出现这种状况,在初始化 过程中应用程序应将 WDRF 标志位与 WDE控制位清零 。
· Bits 5,2..0 – WDP3..0:看门狗定时器预分频器 3, 2, 1, 与 0
当看门狗定时器使能时, WDP3..0 决定看门狗定时器的预分频器,如 Table26 所示。
下面的例子分别用汇编和 C 实现了关闭 WDT 的操作。在此假定中断处于用户控制之下 ( 比如已经禁止了x全局中断 ) ,因而在执行下面程序时中断不会发生。
汇编代码例程
WDT_off:
; MCUSR中的WDRF 清零
ldi r16, ( 0<< WDRF )
out MCUSR, r16 ; 置位WDCE 与 WDE
ldi r16, (1<< WDCE )|( 1<< WDE ) ; 关闭WDT
ldi r16, (0<< WDE )
out WDTCSR, r16
ret
C 代码例程
void WDT_off(void)
{
/*MCUSR 中的 WDRF清零*/
MCUSR = 0x00
/* 置位WDCE 与 WDE */
WDTCSR = (1<< WDCE) | (1<< WDE);
/* 关闭WDT */
WDTCSR = 0x00;
}