在编写程序时有时会出现死机或程序跑飞的情况,这时对系统有一定的影响,怎样让程序可以自行重启呢,STM8S中的看门狗就是实现这一功能的,用看门狗检测程序的执行,在看门狗的复位时间内进行喂狗,如果程序在某个地方出现问题,那么就不能及时的进行喂狗,这时系统就会重新启动,达到检测的目的。通过观察小灯的闪烁快慢可以看出系统是否复位。
程序如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | //软件环境:IAR FOR STM8V1.0 //作者:Nicole //功能:STM8的独立看门狗应用 //日期:2010.11.04 #include #include unsigned int i; //时钟配置 void CLK_Configuration(void) { //CLK_ICKR =0x08; //打开低速时钟 CLK_CKDIVR =0x00; } //延时函数 void Delay(unsigned int i) { unsigned int j; while(i--) { for(j=1000;j>0;j--); } } //IO口配置,控制小灯 void GPIO_Init(void) { unsigned int i; PD_DDR|=0x01;//PD0输出,其余保持原功能 PD_CR1|=0x01;//对应位设置为推挽输出 PD_CR2|=0x00; //输出最大频率为2MHz //小灯闪烁的速度快(为了看的清晰循环4次) for(i=0;i<4;i++) { PD_ODR=0xff; Delay(200); PD_ODR=0xfe; Delay(200); } } //看门狗配置 void IWDG_Init(void) { IWDG_KR = 0xCC; //启动IWDG IWDG_KR = 0x55; //解除 PR 及 RLR 的写保护 IWDG_RLR = 0xff;//看门狗计数器重装载数值 IWDG_PR = 0x06; //分频系数为256,最长超时时间为:1.02S IWDG_KR = 0xAA; //刷新IDDG,避免产生看门狗复位,同时恢复 PR 及 RLR的写保护状态 } void main(void) { CLK_Configuration(); //开启外部时钟 GPIO_Init();// 初始化端口 IWDG_Init();// 初始化外部看门狗 while(1) { PD_ODR =0xff;//PD0为输出1,LED灭 Delay(1000);//延时长小灯闪烁慢些 PD_ODR = 0xfe;//PD0为输出0,LED亮 Delay(1000); } //程序中没有及时喂狗,所以观察到小灯先闪烁快些,然后闪烁慢些,达到看门狗的复位时间系统重启,循环上述过程 } |
评论 抢沙发