外部中斷——按鍵,使LED亮滅。使用矩陣鍵盤,並用按鍵延時提高抗干擾能力。
#include "DSP2833x_Project.h"
/**************函數聲明**************/
void Gpio_setup(void);
interrupt void xint1_isr(void);
/**************函數聲明**************/
// 本例中用到的全局變量;
volatile Uint32 Xint1Count; //發生外部中斷1的次數;
/***************主函數**************/
int main(void)
{
InitSysCtrl(); //初始化系統控制
Gpio_setup(); //子函數,gpio口設置
DINT; //關閉中斷
InitPieCtrl(); //初始化中斷控制
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();//初始化中斷矢量表
EALLOW; // 修改被保護的寄存器,修改前應添加EALLOW語句
PieVectTable.XINT1 = &xint1_isr; //將xint1_isr這一中斷子函數指向PieVectTable.XINT1的地址
EDIS; // EDIS的意思是不允許修改被保護的寄存器
Xint1Count = 0; // 計數外部中斷1(XINT1)
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // 使能外設中斷擴展PIE模塊
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // 使能PIE組1的INT4
IER |= M_INT1;
EINT;
ERTM;
EALLOW;
GpioDataRegs.GPBSET.bit.GPIO60 = 1; // 輸出高電平
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0; // 選擇爲通用I/O口
GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1; // 方向定義爲輸出
EDIS;
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0; // 選擇爲通用I/O口
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0; // 方向定義爲輸入
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0; // 外部中斷1(XINT1)與系統時鐘SYSCLKOUT同步
EDIS;
EALLOW;
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 0x0C; // XINT1是GPIO12
EDIS;
XIntruptRegs.XINT1CR.bit.POLARITY = 0; // 下降沿觸發中斷
XIntruptRegs.XINT1CR.bit.ENABLE = 1; // 使能XINT1
for(;;);
}
void Gpio_setup(void)
{
EALLOW;
//////以下IO口設置爲輸出,作爲列掃描/////////
//初始化行3的GPIO50
GpioCtrlRegs.GPBPUD.bit.GPIO50 = 0; // Enable pullup on GPIO50
GpioDataRegs.GPBCLEAR.bit.GPIO50 = 1; // Load output latch
GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 0; // GPIO50 = GPIO
GpioCtrlRegs.GPBDIR.bit.GPIO50 = 1; // GPIO50 = output
EDIS;
}
interrupt void xint1_isr(void)
{
DELAY_US(5000); //鍵盤消抖動
while(GpioDataRegs.GPADAT.bit.GPIO12==0);
GpioDataRegs.GPBTOGGLE.bit.GPIO60 = 1; // GPIO60-GPIO61輸出電平取反
Xint1Count++;
// 應答寄存器的位1清0,以響應同組內其他中斷;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}