MCU

ADSP-BF533之看门狗程序(原创)

0
阅读(3623)

通过之前的学习,对于ADSP-BF533的看门狗功能已经有一个基本的了解,今天打算编一个程序实现看门狗功能,首先说一下看门狗的使用步骤:

1.  把计数值写入看门狗计数寄存器WDOG_CNT,设置看门狗定时器的时间,注意必须在看门狗定时器未启用之前进行设置,这样也将加载WDOG_STA状态寄存器;

2.  在控制寄存器WDOG_CTL中选择看门狗定时器溢出时产生的事件;

3.  在控制寄存器WDOG_CTL中启用看门狗定时器,启用后看门狗定时器将开始倒计时,递减WDOG_STA寄存器中的值,当WDOG_STA寄存器的值到达0时,2中选择的事件将产生。为了防止事件的产生,软件必须在定时器溢出之前重新赋值WDOG_CNT,注意必须先禁止看门狗定时器,这样WDOG_CNT的值才会自动加载到WDOG_STA寄存器中。

下面先用流程图说一下程序的具体实现过程,如下图所示:

下面是具体程序,并附有详细解释,仅供参考。

#include <cdefBF533.h>

#define pDEVICE_OE  (volatile unsigned short *)0x20320000

#define pLED_DAT       (volatile unsigned short *)0x20340000

#define LED_OE   0x01

mdelay(int count)//延时函数

{

       int i;

       for(i=0;i<count;i++);

}

void Set_PLL(unsigned int pmsel,unsigned int pssel)//系统时钟设置

{

       unsigned int new_PLL_CTL;

       *pPLL_DIV = pssel;

       asm("ssync;");

       new_PLL_CTL = (pmsel & 0x3f) << 9;             

       *pSIC_IWR |= 0xffffffff;

       if (new_PLL_CTL != *pPLL_CTL)

       {

              *pPLL_CTL = new_PLL_CTL;

              asm("ssync;");

              asm("idle;");

       }

}

void Init_EBIU(void)//EBIU接口初始化

{

       *pEBIU_AMBCTL0      = 0x7bb07bb0;

       *pEBIU_AMBCTL1      = 0xffc07bb0;

       *pEBIU_AMGCTL       = 0x000f;

}

void Watchdog_Init(void)//看门狗初始化程序

{

       *pWDOG_CTL = 0x0AD0;   //禁止看门狗定时器

       *pWDOG_CNT = 0x3F6B5A0;//设置看门狗的定时时间为0.5s   注意必须先禁止看门狗定时器才赋值

       *pWDOG_CTL = 0x0FF0;   //启动看门狗定时器,设置看门狗事件为复位      

}

void main(void)//系统主应用程序

{

       unsigned int i;

       Set_PLL(16,3);//系统时钟设置为133MHZ 25*16/3=133

       Init_EBIU( );//EBIU初始化             

       *pDEVICE_OE = ~LED_OE;//使能LED

       *pLED_DAT =0x00;//点亮所有LED灯

        mdelay(12000000);//延时大概1s

        Watchdog_Init( );//看门狗初始化 

        while(1)

        {

             Watchdog_Init( );//看门狗初始化,即喂狗  

            *pLED_DAT = ~(*pLED_DAT);//LED灯状态取反

            mdelay(3000000);//延时0.2S让灯闪烁 注意看门狗定时器的长度应大于延时时间 不然系统将溢出复位

        }   

}

测试的时候可以试着将while(1)里面的Watchdog_Init( );语句注释掉,这样LED灯将在闪烁一次0.4S后再亮灯亮了0.1s后看门狗定时器溢出,从而产生系统复位事件,这时LED灯将亮1s钟,然后再闪烁一次又再复位,这样重复循环下去。