TMS320F28335---外部按鍵中斷

外部中斷——按鍵,使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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章