M0的看门狗和普通51单片机的看门狗类似。比较简单。在配置完看门狗寄存器后看门狗模块就会随程序一直执行不能关闭。唯一关闭的方法就是系统发生复位。狗狗工作标记位就会由硬件自动清零而不工作了。在对看门狗寄存器写数据前需要先使能看门狗模块 :SYSAHBCLKCTRL|=1<<15;//使能看门狗模块。这一点非常重要否则造成狗不工作
来认识一下狗狗的寄存器,WDTCLKUEN-看门狗时钟源使能寄存器。因为狗狗的时钟是可选的。在对狗进行时钟源选择前是要关闭狗狗的时钟连接!该寄存器的有效位只有一位。WDTCLKUEN=0X01;//第0位为1连接看门狗时钟源
WDTCLKSEL-看门狗时钟源选择寄存器。用于选择看门狗的时钟源。狗的时钟源可以由LPC1114内部时钟源IRC提供,还可以由系统主时钟和内部看门狗时钟提供。默认是选择IRC。这里我们选择系统主时钟。WDTCLKSEL=0X01;//选择系统主时钟
WDTCLKDIV-看门狗时钟分频寄存器。看门狗的时钟源设置好了以后就可以对狗进行分频设置了。一般选择1分频。WDTCLKDIV=0X01;//选择1分频
设置完看门狗的时钟后,就可以对狗狗的计数时间进行设置了。LPC1114的看门狗计数器采用的减法计数。不像一般的计数器是往上下而是往下减。减到0还没喂狗。系统就复位了。
WDTTC-看门狗计数寄存器。设置的是看门狗的计数时间。这个是一个32位的寄存器。有点特殊。最小值要求为0XFF,给它赋小于0XFF的值时系统自动会为其设置成0XFF。WDTTC=0XFFFF;//设置看门狗的计数时间(既溢出时间)
WDTMOD-看门狗模式寄存器。设置完这些看门狗并不会工作。因为还没有对看门狗模块设置成使能。需要启动看门狗模块.该寄存器第0位是看门狗的使能位。要设置其为1.第2位是看门狗复位使能。M0的看门狗在未正常的喂狗的情况下是可以执行2个步骤的。一个是产生系统复位,一个是产生中断。这里我们选择产生复位。WDTMOD=0X03;//设置开启看门狗使能和狗溢出后系统复位。完成上面的设置现在看门狗还是没有启动的。那是因为在启动前必须要先喂一次狗(哈哈。。类似于先吃了才能工作)。
WDTFEED-看门狗馈送序列寄存器。该寄存器用来为喂狗。要分2次写入0XAA,0X55。写的时候要注意!两次写入要接连着完成。如果只写了一句会引起系统复位。所以说喂狗时最好先关掉中断以免引起系统不正常复位!
WDTFEED=0XAA;WDTFEED=0X55;//以上完成后看门狗就彻彻底底的开始工作了
以下是程序源代码及工程文件(基于TKStduio环境)attachment download
#include "..\config.h"
void myDelay (INT32U ulTime)
{
INT32U i;
i = 0;
while (ulTime--) {
for (i = 0; i < 5000; i++);
}
}
void WDT_Init(INT32U time)
{
if(time<0xff)
time=0xff;
WDTCLKUEN=0X00;//关闭看门狗的时钟源
WDTCLKSEL=0X01;//选择主时钟作为看门狗的时钟
WDTCLKUEN=0X01;//开启看门狗的时钟源,现在看门狗还不是工作的。需要喂一次狗
WDTCLKDIV=0X01;//进行1分频
SYSAHBCLKCTRL|=1<<15;//使能看门狗模块。这一点非常重要否则造成狗不工作
WDTTC=time;//设置看门狗的计数时间
WDTMOD=0X03;//设置看门狗使能
WDTFEED=0XAA;//启动看门狗喂狗序列。如果在看门狗正常工作后喂狗序列不完整会造成看门狗复位
WDTFEED=0X55;//完成看门狗喂狗操作
}
void WDT_FEED(void)
{
zyIrqDisable();//喂狗的时候停止中断
WDTFEED=0XAA;
WDTFEED=0X55;//完成喂狗
zyIrqEnable();//开启系统的中断
}
int main (void)
{
targetInit();
pinInit();
myDelay(1000);
SYSAHBCLKCTRL |= (1ul << 6);
GPIO0DIR=0X02;//设置P0.02为IO输出
WDT_Init(0xffff);
GPIO0DATA=0XFD;//led持续闪烁表明系统在不停的复位
myDelay(1000);//加延时使LED闪烁跟明显
while (1)
{
myDelay(1000);//不喂狗LED会闪烁
}
}
上一篇:uC/OS II程序设计点滴记录
下一篇:基于微控制器的自由轴法RLC测量方法研究
推荐阅读最新更新时间:2024-03-16 13:50