DSP

TMS28335GPIO及外部中断学习笔记

2019-07-13 12:21发布

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); }