DSP

DSP28335的GPIO外设中断

2019-07-13 10:44发布

说明:GPIO0接LED0,GPIO1接LED1,GPIO2、GPIO2为两个中断触发,电平变化时对应中断响应 #include "DSP28x_Project.h" //自定义变量 #define LED0 GpioDataRegs.GPADAT.bit.GPIO0 #define LED1 GpioDataRegs.GPADAT.bit.GPIO1 //自定义函数 void GpioSet(void); void PeripheralsSet(void); void PieCtrlSet(void); void PieVectTableSet(void); void RunFun(void); //自定义中断 interrupt void Led0(void); interrupt void Led1(void); //延迟函数 int i,j,m,n; void Delay(); //主函数 void main() { // 1 系统初始化 InitSysCtrl(); // 系统初始化,disable WatchDog,PLL,enable Peripheral Clocks DINT; // 屏蔽全局中断 IER=0x0000; // 清除CPU中断 IFR=0x0000; // 清除CPU中断标志 InitPieCtrl(); // 禁止中断,清除中断标志 InitPieVectTable(); // 初始化中断向量表 // 2 应用初始化 GpioSet(); PeripheralsSet(); PieVectTableSet(); PieCtrlSet(); // 3 系统运行 EnableInterrupts(); //使能中断 // 4 运行函数 RunFun(); } void GpioSet(void) { //基本配置 EALLOW; GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // GPxMUX,功能配置: 0为I/O功能,1为外设功能 GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0; GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // GPxDIR,方向配置: 0为输入,1为输出 GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; GpioCtrlRegs.GPADIR.bit.GPIO2 = 0; GpioCtrlRegs.GPADIR.bit.GPIO3 = 0; EDIS; } void PeripheralsSet(void) { //中断配置 EALLOW; GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 0x00002; // 配置GPIO2为可屏蔽中断源 XINT1 GpioIntRegs.GPIOXINT2SEL.bit.GPIOSEL = 0x00003; // 配置GPIO3为可屏蔽中断源 XINT2 GpioCtrlRegs.GPAQSEL1.bit.GPIO2 = 0; // 用于时钟同步 GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 0; // GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0; // 上拉电阻 GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0; XIntruptRegs.XINT1CR.bit.POLARITY = 3; //电平变化中断 XIntruptRegs.XINT1CR.bit.ENABLE = 1; XIntruptRegs.XINT2CR.bit.POLARITY = 3; //电平变化中断 XIntruptRegs.XINT2CR.bit.ENABLE = 1; EDIS; } void PieVectTableSet(void) { EALLOW; PieVectTable.XINT1=& Led0; PieVectTable.XINT2=& Led1; EDIS; } void PieCtrlSet(void) { EALLOW; PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // 中断PIE模组打开 PieCtrlRegs.PIEIER1.bit.INTx4=1; // 使能INT1x4,XINT1 PieCtrlRegs.PIEIER1.bit.INTx5=1; // 使能INT1x5,XINT2 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 使能PIEACK IER |=M_INT1; // 使能CPU INT1 EDIS; } void RunFun(void) { while(1) { LED0=0; Delay(); Delay(); LED0=1; Delay(); Delay(); LED1=0; Delay(); Delay(); LED1=1; Delay(); Delay(); } } interrupt void Led0() // 中断0,LED0闪烁 { i=100; while(i--) { LED0=0; Delay(); LED0=1; Delay(); } //中断结束处理 PieCtrlRegs.PIEACK.bit.ACK4 = 1; } interrupt void Led1() // 中断1,LED1闪烁 { j=100; while(j--) { LED1=0; Delay(); LED1=1; Delay(); } //中断结束处理 PieCtrlRegs.PIEACK.bit.ACK5 = 1; } void Delay() { for( m=0;m<1000;m++) { for( n=0;n<1000;n++) ; } }