ADSP-BF533之看门狗程序(原创)
0赞通过之前的学习,对于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钟,然后再闪烁一次又再复位,这样重复循环下去。