原创 avr 看门狗

2011-3-30 16:10 1703 4 4 分类: MCU/ 嵌入式

MCU 控制和状态寄存器-MCUCSR        

       MCU 控制和状态寄存器提供了有关引起 MCU 复位的复位源的信息。 

                             Bit         7     6      5      4      3     2      1      0

                                        JTD   ISC2    –     JTRF WDRF   BORF EXTRF PORF MCUCSR

                             读 / 写      R/W    R/W    R     R/W    R/W   R/W    R/W    R/W

                             初始值         0     0      0              参见各个位的说明

                            * Bit 4 – JTRF: JTAG 复位标志

                            通过 JTAG 指令 AVR_RESET 可以使 JTAG 复位寄存器置位,并引发 MCU 复位,并使 
                            JTRF 置位。上电复位将使其清零,也可以通过写 ”0” 来清除。

                           * Bit 3 – WDRF: 看门狗复位标志

                            看门狗复位发生时置位。上电复位将使其清零,也可以通过写 ”0” 来清除。

                            * Bit 2 – BORF: 掉电检测复位标志

                            掉电检测复位发生时置位。上电复位将使其清零,也可以通过写 ”0” 来清除。

                            * Bit 1 – EXTRF: 外部复位标志

                            外部复位发生时置位。上电复位将使其清零,也可以通过写 ”0” 来清除。

                            * Bit 0 – PORF: 上电复位标志

                            上电复位发生时置位。只能通过写 ”0” 来清除。

                            为了使用这些复位标志来识别复位条件,用户应该尽早读取此寄存器的数据,然后将其复 
                            位。如果在其他复位发生之前将此寄存器复位,则后续复位源可以通过检查复位标志来了 
                            解。


看门狗定时器控制寄存器- 
WDTCR                     

Bit        7        6     5       4           3         2         1         0

           –      –     –   WDTOE WDE   WDP2 WDP1 WDP0

* Bits 7..5 – Res: 保留位

                              ATmega16 保留位,读操作返回值为零。

                              * Bit 4 – WDTOE: 看门狗修改使能

                              清零 WDE 时必须置位 WDTOE ,否则不能禁止看门狗。一旦置位,硬件将在紧接的4 个 
                              时钟周期之后将其清零。请参考有关 WDE 的说明来禁止看门狗。

                              * Bit 3 – WDE: 使能看门狗

                              WDE 为 "1“ 时,看门狗使能,否则看门狗将被禁止。只有在WDTOE 为 "1“ 时WDE 才能清 
                              零。以下为关闭看门狗的步骤:

                              1. 在同一个指令内对 WDTOE 和 WDE 写 "1“ ,即使WDE 已经为 "1“

                              2. 在紧接的 4 个时钟周期之内对 WDE 写 "0”

                              * Bits 2..0 – WDP2, WDP1, WDP0: 看门狗定时器预分频器 2, 1 和 0

                              WDP2、 WDP1 和 WDP0 决定看门狗定时器的预分频器,如 Table 17 所示。

                              Table 17. 看门狗定时器预分频器选项

                                                                          VCC = 3.0V 时典型   VCC = 5.0V 时典型 
                               WDP2    WDP1   WDP0      看门狗振荡器周期             的溢出周期           的溢出周期

                                 0       0      0         16K (16,384)        17.1 ms          16.3 ms

                                 0       0      1         32K (32,768)        34.3 ms          32.5 ms

                                 0       1      0         64K (65,536)        68.5 ms          65 ms

                                 0       1      1        128K (131,072)        0.14 s          0.13 s

                                 1       0      0        256K (262,144)        0.27 s          0.26 s

                                 1       0      1        512K (524,288)        0.55 s          0.52 s

                                 1       1      0      1,024K (1,048,576)      1.1 s            1.0 s

                                 1       1      1      2,048K (2,097,152)      2.2 s            2.1 s

#include<iom16v.h>
#include<macros.h>
///#pragma interrupt_handler WDT_over:iv_RESET 
unsigned char f_WDT=0;
void WDT_OFF(void)
{
/* WDT复位*/
_WDR();

/*修改看门狗使能时必须先要同时 置位WDTOE 和 WDE,然后对写0禁用看门狗*/
WDTCR |= (1<<WDTOE) | (1<<WDE);
/* WDT */
WDTCR = 0x00;
}
void WDT_ON(unsigned char t)
{//在5v的电源下,t为0-8时,看门狗定时器的溢出时间分别16.3ms,32.5ms,65ms,0.13s,0.26s,0.52s,1s,2.1s。
//*修改看门狗使能时必须先要同时 置位WDTOE 和 WDE
WDTCR |= (1<<WDTOE) | (1<<WDE);
//WDTCR =1<<WDE;//看门狗使能。
WDTCR=t|(1<<WDTOE);//(t在0-8之间也就是0x00到0x07)    1<<WDTOE;是禁止修改看门狗使能,
}
void WDT_over(void)
{f_WDT++;
MCUCSR&=~(1<<WDRF);//清零看门狗
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条