您的位置:首页 > 其它

DSP28335的GPIO外设中断

2014-04-04 11:54 417 查看
说明: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++)
;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息