专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

Cortex-M0 看门狗程序详解

作者:佚名   来源:本站原创   点击数:  更新时间:2014年08月17日   【字体:

  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会闪烁
  
   }
}
 
关闭窗口