TMS28335GPIO及外部中断学习笔记

来源:互联网 发布:51talk软件下载 编辑:程序博客网 时间:2024/06/14 22:16

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.GPIO1interrupt void ISRExint1 (void);void relay_init (){EALLOW;GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;//set GPIO1 as outputEDIS;}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);}






原创粉丝点击