C8051F340延长喂狗间隔

C8051F340晶振12M,按照官方DataSheet中所讲使用PCA计时器,最大间隔为65.5ms,对于某些系统而言过于短暂。

但是没关系,PCA给我们提供了多个时钟源模式,只要配合定时器0就可以轻松的延长喂狗间隔。

首先设置PCA定时器

 1 //-----------------------------------------------------------------------------
 2 // PCA_Init
 3 //-----------------------------------------------------------------------------
 4 // This routine initializes the PCA to use the TR0 overflow
 5 // as its clock source.  It also sets the offset value by writing to PCA0CPL2.
 6 //-----------------------------------------------------------------------------
 7 void PCA_Init (void)
 8 {
 9    PCA0CN     =  0x40;                // PCA counter enable
10    PCA0MD    &= ~0x40 ;               // Watchdog timer disabled-clearing bit 6
11    // PCA0MD    &=  0xF1;                // timebase selected - System clock / 12
12    PCA0MD    |=  0x04;                // use TR0 overflow as clock source
13    PCA0MD    |=  0x80;
14    PCA0CPL4   =  0xFF;                // Offset value
15 }

然后设置Timer0

 1 //-----------------------------------------------------------------------------
 2 // Timer0 Interrupt Init
 3 // 定时器0,溢出作为PCA0时钟
 4 // 使用系统时钟为定时器时钟
 5 // 8位重载计数器,TH0 = 0x10,时间为240(0xF0)/12=20us
 6 //-----------------------------------------------------------------------------
 7 void Timer0_Init (void)
 8 {
 9    EA  = 0;                // 关总中断
10    ET0 = 0;                // 关定时器0中断
11    CKCON &= 0XF8;          // 定时器0使用系统时钟为定时器时钟
12    CKCON |= 0x04;
13    TMOD  &= 0XF1;
14    TMOD  |= 0X02;          // GATE0=0;C/T0=0(T0);02->8 bits reload
15    TH0 = TIMER0_RELOAD;
16    TL0 = TH0;
17    // ET0 = 1;
18    TR0 = 1;                // Timer0 ON
19 }

最后设置WDT

 1 //-----------------------------------------------------------------------------
 2 // 看门狗配置
 3 //-----------------------------------------------------------------------------
 4 void WatchDog_Config (void)
 5 {
 6    PCA0MD  &= ~0x40;                   // WDTE = 0 (clear watchdog timer enable)
 7    PCA0L    = PCA0_L;                  // Set lower byte of PCA counter to 0  
 8    PCA0H    = 0x00;                    // Set higher byte of PCA counter to 0
 9    PCA0CPL4 = PCA0_RELOAD_L;           // Write offset for the WDT 
10    PCA0CPH4 = PCA0_RELOAD_H;
11    PCA0MD  |= 0x40;                    // Enable the WDT
12 }

其中宏是这么定义的

 1 // Timer0
 2 #define TIMER0_RELOAD 0x38       // Reload value for Timer0(200us)
 3 #define TIMER0_RELOAD_100us 0x9C // 100us
 4 // PCA(50,000)
 5 // Offset = ( 256 x PCA0CPL4 ) + 256 - PCA0L
 6 //        = ( 256 x 195(0xC3)) + 256 - 176(B0) = 50,000
 7 // Time   = Offset * 20 us
 8 //        = 1s ( PCA uses T0 overflow(20us) as its clock source)
 9 #ifdef PCA_50000
10 #define PCA0_RELOAD_L   0xC3;
11 #define PCA0_RELOAD_H   0x01;
12 #define PCA0_L          0xB0;
13 #else
14 // PCA(10,000)
15 // Offset = ( 256 x PCA0CPL4 ) + 256 - PCA0L
16 //        = ( 256 x 39(0x27)) + 256 - 240 = 10,000
17 // Time   = Offset * 200 us
18 //        = 200ms ( PCA uses T0 overflow(20us) as its clock source)
19 #define PCA0_RELOAD_L   0x27;
20 #define PCA0_RELOAD_H   0x01;
21 #define PCA0_L          0xF0;
22 #endif


 

posted on 2013-05-20 10:33  于丹三  阅读(740)  评论(0)    收藏  举报

导航