|
外部中断——按键,使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;
}
|
|