TMS28335一共有88个GPIO,分为A、B、C三组。其中GPIO0~GPIO31属于A组。GPIO32~GPIO63属于B组,GPIO64~GPIO87属于C组。TMS28335的GPIO的寄存器分为两组.
分别时GpioCtrlRegs(GPIO控制相关的寄存器),这些寄存器均被EALLOW保护,包括以下寄存器:
其中常用到的时GPxMUX:GPIO的复用寄存器。作用是用来配置GPIO的具体功能。具体可以参照用户手册。如果配置成数字I/O口作为普通的输入输出。那么将GPxMUX的位配置成00.
GPxDIR:配置GPIO的输入输出方向。
GPIO的数据寄存器组
GPxDAT:GPIO的数据寄存器,可以读写,当配置成输出时,通过写操作,可以输出高低电平。当配置成输入时,可以通过读取这个寄存器的值,得到输入的是高电平还是低电平
GPxSET:这个寄存器在GPIO为输出模式时使用,通过写1可以输出高电平
GPxCLEAR:这个寄存器在GPIO为输出模式时使用,通过写1可以输出低电平
GPxTOGGLE:取反点=电平操作
注意:当GPIO配置成输入模式时,需要打开对用的外设输入时钟
外部中断:
TMS28335的中断采用三级管理机制,分为外设级,PIE级,CPU级。这三级中断任何一级的中断使能位及中断标志位没有置1,那么中断就不会响应。
外设级:不同的外设中断需要设置响应的中断管理,及使能相应的中断的使能位。需要手动的操作有:(1)使能中断使能位(2)屏蔽中断使能位(3)清除中断标志位。
PIE级:PIE管理着96个中断源。分为12组,每组8个中断来源。具体的中断源设置可以参照用户手册中的PIE向量表。对于同一组的中断,有响应优先级,位置前面的中断比位置后面的优先级高。需要手动操作的有:(1)使能中断使能位(2)屏蔽中断使能位(3)清楚中断响应位PIEACK。这一操作的目的如果不清楚PIEACK,那么就不会响应其他的中断。PIE的中断标志位时自动清除的。
CPU级的中断:响应的寄存器是IER,中断使能寄存器。IFR,中断标志位寄存器。其中,中断使能寄存器IER需要手动设置。IFR,中断标志位寄存器,自动清除。
GPIO的外部中断共有7个中断源,分别时XINT1,XINT2,XINT3,XINT4,XINT5,XINT6,XINT7。其中XINT1和XINT2对应GPIO0~GPIO31.XINT3,XINT4,XINT5,XINT6,XINT7对应GPIO32~GPIO63.
相关寄存器如下,这些寄存器均被EALLOW保护:
其中GPIOXINTnSEL选择相应的中断源
XINTnCR配置对用的中断触发方式以及使能相应的中断。具体参照相应的用户手册。
除了GPIO本身的中断控制寄存器之外,还需要设置PIE中相应的寄存器。包括PIECTRL,PIEACK,PIEIER,PIEIFR。
PIECTRL寄存器的作用是可以读相应的中断的地址和使能全局中断。
PIEACK:中断应答位。需要在中断发生后写1清楚相应的位,否则中断不会再次响应
PIEIER:中断使能寄存器,使能响应的外设中断
PIEIFR:中断标志位
注意:使用中断时,需要将响应的中断矢量表映射到响应的中断响应函数中。
附:按键控制继电器的代码:
#include "Key.h"
#define RELAYON GpioDataRegs.GPASET.bit.GPIO1
#define RELAYOFF GpioDataRegs.GPACLEAR.bit.GPIO1
interrupt void ISRExint1 (void);
void relay_init ()
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;//set GPIO1 as output
EDIS;
}
void key_interrupt_init ()
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO13 = 0;
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 13;
XIntruptRegs.XINT1CR.bit.POLARITY = 0;
XIntruptRegs.XINT1CR.bit.ENABLE = 1;
EDIS;
IER = 0x0001;
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
PieCtrlRegs.PIEIER1.bit.INTx4 = 1;
EALLOW;
PieVectTable.XINT1 = &ISRExint1;
EDIS;
}
interrupt void ISRExint1 (void)
{
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
RELAYON = 1;
DELAY_US(1000000);
RELAYOFF = 1;
}
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "Key.h"
void main ()
{
InitSysCtrl();
// IER = 0x0000;
// IFR = 0x0000;
// InitPieCtrl();
InitPieVectTable();
relay_init();
key_interrupt_init();
GpioDataRegs.GPASET.bit.GPIO1 = 1;
EINT;
while(1);
}