说明: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++)
;
}
}