//#####################################################################
//文件: Example_281xWatchdog.c
//說明: DSP281x看門狗中斷測試程序
//#####################################################################
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
interrupt void wakeint_isr(void); //中斷服務程序wakeint_isr的聲明
Uint32 WakeCount;
Uint32 LoopCount;
//主程序
void main(void)
{
//Step 1. 初始化系統控制,該函數在DSP281x_SysCtrl.c 文件中
InitSysCtrl(); //初始化PLL、看門狗,使能外設時鐘
//Step 2.初始化GPIO
//該函數在DSP281x_Gpio.c文件中,顯示如何設置GPIO到其默認狀態
//InitGpio(); //本例未使用,跳過
//Step 3.禁止所有中斷,初始化PIE中斷向量表
DINT; //關全局中斷
//初始化PIE控制寄存器到它們的默認狀態,即禁止所有的PIE中斷,清除所有的PIE中斷
//標志,這個函數在DSP281x_PieCtrl.c文件中
InitPieCtrl();
IER = 0x0000; //禁止CPU中斷
IFR = 0x0000; //清除CPU中斷標志
//初始化PIE中斷向量表,使中斷向量指向中斷服務程序(ISR)。為了調試方便,即使本例
//不使用的中斷也初始化。ISR在DSP281x_DefaultIsr.c文件中
InitPieVectTable();
//本例中使用到的中斷程序入口地址重載到相應中斷向量
EALLOW; //允許訪問受保護寄存器
PieVectTable.WAKEINT = &wakeint_isr;
EDIS; //禁止訪問受保護寄存器
//Step 4.初始化器件所有的片內外設,該函數在DSP281x_InitPeripherals.c文件中
//InitPeripherals(); //本例不需要,跳過
//Step 5. 用戶代碼,使能中斷
WakeCount = 0; //計中斷次數清零
LoopCount = 0; //計通過循環的次數清零
//看門狗復位(WDRST)輸出信號無效且看門狗中斷(WDINT)輸出信號有效
EALLOW;
SysCtrlRegs.SCSR = BIT1; //清除WDOVERRIDE位
EDIS;
PieCtrlRegs.PIECRTL.bit.ENPIE = 1; //使能PIE塊
PieCtrlRegs.PIEIER1.bit.INTx8 = 1; //使能PIE級中斷INT1.8
IER |= M_INT1; //使能CPU級中斷 INT1
EINT; //使能全局中斷
KickDog( ); //喂狗,清除看門狗計數器
EALLOW;
SysCtrlRegs.WDCR = 0x0028; //使能看門狗
EDIS;
//Step 6. 空循環
for(;;)
{
LoopCount++;
//不注釋掉KickDog(喂狗)就一直在這兒循環,注釋掉KickDog(喂狗)引起WAKEINT中斷
//KickDog();
}
}
//Step 7. 加上局部中斷服務程序(ISR),如果局部ISR已經使用,按照Step 5中斷向量,
//再分配中斷向量地址
interrupt void wakeint_isr(void)
{
WakeCount++;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
//應答這個中斷,以便再接收PIE組1的中斷
}