|
1、STC15W4K32S4系列单片机的看门狗一旦开启,CPU必须在看门狗计数器没有溢出前喂狗,否则计数器一旦溢出,则系统重启。
2、STC15W4K32S4系列单片机看门狗初始化函数及喂狗函数如下:
- /***************************************************************************
- * 描 述 : 看门狗初始化
- * 入 参 : 无
- * 返回值 : 无
- **************************************************************************/
- void WDT_Init(void)
- {
- WDT_CONTR &= 0xF7; //IDLE_WDT位置0,看门狗定时器在空闲模式下不计数
- WDT_CONTR &= 0xFB; //PS2位置0,设置看门狗定时器预分频值
- WDT_CONTR |= 0x03; //PS1、PS0位置1,设置看门狗定时器预分频值
- WDT_CONTR &= 0x7F; //WDT_FLAG位置0,看门狗溢出标志位清零
- WDT_CONTR |= 0x20; //EN_WDT位置1,开启看门狗定时器
- }
- /***************************************************************************
- * 描 述 : 喂狗
- * 入 参 : 无
- * 返回值 : 无
- **************************************************************************/
- void WDG_Feed(void)
- {
- WDT_CONTR |= 0x10; //CLR_WDT位置1,看门狗定时器重新计数
- }
注:看门狗溢出时间设置为约568.8ms。(下载时钟选择11.0592MHZ)
3、下面分及时喂狗和没有及时喂狗两种情况介绍实验。
1)及时喂狗时main函数设计。
- int main()
- {
- /////////////////////////////////////////////////
- //注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
- // 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
- //相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
- // P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
- /////////////////////////////////////////////////
- P0M1 &= 0x3F; P0M0 &= 0x3F; //设置P0.6~P0.7为准双向口
-
- leds_off(); //熄灭开发板上的2个指示灯(DS1和DS2)
- WDT_Init(); //看门狗初始化,看门狗溢出时间约568.8ms(11.0592MHZ)
- delay_ms(200);
- led_on(LED_1); //点亮蓝色指示灯DS1
- while(1)
- {
- //软件延时200ms,该延时是模拟喂狗前实际执行用户应用代码所用时长
- delay_ms(200);
- //喂狗
- WDG_Feed();
- led_off(LED_1); //熄灭蓝色指示灯DS1
- led_toggle(LED_2); //翻转红色指示灯DS2
- //软件延时200ms,该延时是模拟喂狗后实际执行用户应用代码所用时长
- delay_ms(200);
- }
- }
2)未及时喂狗时main函数设计。
- int main()
- {
- /////////////////////////////////////////////////
- //注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
- // 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
- //相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
- // P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
- /////////////////////////////////////////////////
- P0M1 &= 0x3F; P0M0 &= 0x3F; //设置P0.6~P0.7为准双向口
-
- leds_off(); //熄灭开发板上的2个指示灯(DS1和DS2)
- WDT_Init(); //看门狗初始化,看门狗溢出时间约568.8ms(11.0592MHZ)
- delay_ms(200);
- led_on(LED_1); //点亮蓝色指示灯DS1
- while(1)
- {
- //软件延时200ms,该延时是模拟喂狗前实际执行用户应用代码所用时长
- delay_ms(200);
- //喂狗
- WDG_Feed();
- led_off(LED_1); //熄灭蓝色指示灯DS1
- led_toggle(LED_2); //翻转红色指示灯DS2
- //软件延时500ms,该延时是模拟喂狗后实际执行用户应用代码所用时长
- delay_ms(500);
- }
- }
|
|