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
浙公网安备 33010602011771号