TMS28335GPIO及外部中断学习笔记

TMS28335一共有88个GPIO,分为A、B、C三组。其中GPIO0~GPIO31属于A组。GPIO32~GPIO63属于B组,GPIO64~GPIO87属于C组。TMS28335的GPIO的寄存器分为两组.

分别时GpioCtrlRegs(GPIO控制相关的寄存器),这些寄存器均被EALLOW保护,包括以下寄存器:

TMS28335GPIO及外部中断学习笔记_第1张图片

其中常用到的时GPxMUX:GPIO的复用寄存器。作用是用来配置GPIO的具体功能。具体可以参照用户手册。如果配置成数字I/O口作为普通的输入输出。那么将GPxMUX的位配置成00.

GPxDIR:配置GPIO的输入输出方向。

GPIO的数据寄存器组

TMS28335GPIO及外部中断学习笔记_第2张图片

TMS28335GPIO及外部中断学习笔记_第3张图片

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保护

TMS28335GPIO及外部中断学习笔记_第4张图片

TMS28335GPIO及外部中断学习笔记_第5张图片

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







你可能感兴趣的:(TMS28335学习笔记)