• 仅针对TMS320x2833x, TMS320x2823x两款系列芯片,其他可能略有差异。

一、GPIO

1.1 GPIO-Pin划分

分组 A B C
Pin Num 0-31 32-63 64-87

1.2 GPIO0-GPIO27时钟树

时钟树
XRS为芯片复位引脚,低电平有效

1.3 寄存器介绍

1. 配置相关寄存器

GPxPUD

上拉失能寄存器

Value 作用
0 上拉
1 不上拉

GPAPUD

GPxDIR

IO驱动方向

Value 作用
0 输入(默认)
1 输出

GPADIR

GPxMUX1/2

GPIO功能及复用选择

Value 作用
00 普通IO功能
01、10、11 对应代表不同复用功能

不同引脚的复用功能不一样,见下图:
GPIOA MUX

GPxQSEL1/2

输入质量选择(输入采样窗口设置)

Value 作用
00 与系统时钟同步(SYSCLKOUT)
01 三个采样窗口(3 sample)
10 六个采样窗口(6 sample)
11 异步

同步与异步选择:
同步:与系统时钟同步,系统时钟频率为150MHz就是输出150MHz。
异步:即所需时钟不与与系统时钟相同,将系统时钟经过分频得到对应的外设时钟,如IIC、SPI、ADC等。

GPAQSEL1

GPxCTRL

输入采样周期设置;当GPxQSEL1/2配置了3 samples或6 samples,通过该寄存器设置采样周期

Value 作用
0x00 - 0xFF 采样周期 = (Value × 2) × T_SYSCLKOUT

GPACTRL

GPIOXINT1SEL

选择外部中断引脚源;比如:GPIO12挂载到XINT1,赋值为12

GPIOx XINTn
GPIO0 - GPIO31 可挂载到XINT1、XINT2
GPIO32 - GPIO63 可挂载到XINT3\4\5\6\7

GPIOXINTnSEL

低功耗模式配置

GPIOLPMSEL:低功耗模式唤醒选择
LPMCR0:低功耗模式控制寄存器

二、外部中断

时钟树

外部中断时钟树

中断向量表

外部中断:XINT1-7在中断向量表的分布:

INTy(Group) INTx 外部中断源
1 4 XINT1
1 5 XINT2
12 1 XINT3
12 2 XINT4
12 3 XINT5
12 4 XINT6
12 5 XINT7

中断向量表

寄存器
XINTnCR

外部中断控制寄存器
XINTnCR

XINT1CTR (暂时用不到)

外部中断计数寄存器,只有XINT1和XINT2有,16位递增计数器,以SYSCLKOUT速率计时。当检测到有效中断边缘时,计数器值重置为0x0000,然后继续计数,直到检测到下一个有效中断边缘。

XINT1CTR

三、GPIO工作模式配置

编程时用到的寄存器变量名:

寄存器名 作用
GpioCtrlRegs gpio控制寄存器(输入、输出、上拉等等)
GpioDataRegs gpio数据寄存器(输出高电平、读取io电平等等)
GpioIntRegs gpio中断寄存器(选择中断源)

3.1 GPIO配置输出模式

	SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; //开启GPIO使能

	GpioCtrlRegs.GPCMUX1.bit.GPIO68 = 0;     //通用GPIO功能
	GpioCtrlRegs.GPCDIR.bit.GPIO68 = 1;      //输出
	GpioCtrlRegs.GPCPUD.bit.GPIO68 = 0;      //上拉
	EDIS; //开启写保护
	GpioDataRegs.GPCSET.bit.GPIO68 = 1;      //输出高电平

3.2 GPIO配置输入模式

	// GPIO0 and GPIO1 are inputs
	EALLOW;
	SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    //开启GPIO使能
	GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;         // GPIO
	GpioCtrlRegs.GPADIR.bit.GPIO0 = 0;          // input
	GpioCtrlRegs.GPAQSEL1.bit.GPIO0 = 0;        // 与系统时钟同步
	EDIS;

3.3 GPIO外部中断模式

static void Exti_PIE_Init(void)
{
	EALLOW;
	PieVectTable.XINT1 = &xint1_isr;            //映射函数入口
	EDIS;

	//PieCtrlRegs.PIECTRL.bit.ENPIE = 1;        // 使能PIE
	PieCtrlRegs.PIEIER1.bit.INTx4 = 1;          // 使能INTx4

	EALLOW;
	GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 0;   // 选择中断源:GPIO0
	EDIS;

	XIntruptRegs.XINT1CR.bit.POLARITY = 0;      // 下降沿触发
	XIntruptRegs.XINT1CR.bit.ENABLE = 1;        // 使能XINT1

	IER |= M_INT1;                              // 使能CPU中断
	EINT;                                       // 使能全局中断
}

static void Exti_Gpio_Init(void)
{
	// GPIO0 and GPIO1 are inputs
	EALLOW;
	SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    //开启GPIO使能
	GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;         // GPIO
	GpioCtrlRegs.GPADIR.bit.GPIO0 = 0;          // input
	GpioCtrlRegs.GPAQSEL1.bit.GPIO0 = 0;        // 与系统时钟同步(一般默认)
	EDIS;

}

void Exti_Init(void)
{
	Exti_PIE_Init();
	Exti_Gpio_Init();
}

__interrupt void xint1_isr(void)
{
	// Acknowledge this interrupt to get more from group 1
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //等效:PieCtrlRegs.PIEACK.bit.ACK1 = 1;
	// 中断向量表第x组  PIEACK.bit.ACKx / PIEACK.all = PIEACK_GROUPx
	// 触发中断后,查询电平引脚作进一步动作
}

总结

DSP F28335芯片GPIO以及外部中断配置的学习记录,目前均对GPIOA组寄存器进行介绍,并给出相应配置代码。(个人学习记录分享)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐