一、准备工作
1、KEIL C51编译环境
2、CodeGen8 代码生成器
3、MC96F6332D 开发板
4、USB-OCD II仿真器
二、内部看门狗代码生成
1、在CodeGen8 代码生成器的外设窗口中选择内部RC时钟作为时钟源,设置时钟源的频率为8MHz,配置GPIO引脚P52为外部的可中断输入引脚,使能MCU内部的上拉电阻和防抖动功能(使能外部中断为后面喂狗的操作);具体配置如下图①、②所示,
看门狗的代码生成如下图③所示:
2、点击CodeGen8 中的C 图标,自动打开KEIL C51软件;
3、在主函数的循环体中增加如下代码,使用外部引脚进行看门狗的喂狗操作,实际的工程中可以使用定时器进行定时喂狗;
while(1)
{
if(EXIT8_STA) //判断外部中断8是否存在
{
WDT_clear(); //在恰当的时间内进行喂狗操作,防止MCU复位
EXIT8_STA = 0;
printf("EXIT 8 Interrupt To Clear WDT Counter!\r\n");
}
}
4、编译结果如下所示:
5、关于看门狗时钟的配置讲解:
1)、时钟选择:看门狗时钟选择内部的WDTRC时钟,默认频率为5kHz且不能改变(5kHz仅仅是典型值),此5kHz时钟系统默认已经分频256,这里需要特别注意;在系统时钟章节的方框图可以看出,具体如下图所示:
2)、看门狗的运行方框图如下所示:时钟输入后,WDTCNT会不断进行计数,并和WDTDR数据寄存器内的数据进行比较,当WDTCNT等于WDTDR寄存器设置的数值时,WDTCR控制进行MCU的复位或者中断;如此周而复始的工作;本例中仅仅使能WDT的系统复位操作;
具体的复位周期计算公式为:T=(WDTDR+1) / (WDTRC/256)=(FF+1)/(5K/256)≈13.1072s;
3)、关于WDT的寄存器操作也跟简单,如下所示:
6、点击编译器的下载按钮,将刚刚编译好的代码下载到MCU中进行仿真调试。
7、连接串口助手到PC端,可以看到代码的正常运行:外部中断在10s内进行喂狗,系统不会进行复位(没有初始化信息的输出:System initialized successfully!),如下如①所示;如果没有对MCU进行喂狗操作,MCU在看门狗寄存器WDTCNT溢出后会进行系统复位,如下如②所示;如果系统启动后一直不进行喂狗操作,系统会不断的进行复位,如下图③所示;
三、实验现象(具体内容可以参考工程中的Readme.txt文件)
1、MCU主频选择为内部8MHz;
2、外部引脚P52设置为下降沿触发中断,在主函数中判断对应的中断状态是否为真,如果为真,会进行状态标识位的置位,在主函数中会进行看门狗的喂狗操作,并打印喂狗信息到串口,提示系统已经喂狗;WDT的使用中需要特别注意看门狗时钟漂移问题,5kHz仅仅是典型值;如下图所示:
3、具体的代码可以访问链接:https://share.weiyun.com/5ZfEBpX;进行免费获取。
因为小编自己能力水平有限,文中难免有错误或表达失误的信息,还望广大阅读者留言批评指正,谢谢。