文章目录
- 仅针对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 | 不上拉 |
GPxDIR
IO驱动方向
Value | 作用 |
---|---|
0 | 输入(默认) |
1 | 输出 |
GPxMUX1/2
GPIO功能及复用选择
Value | 作用 |
---|---|
00 | 普通IO功能 |
01、10、11 | 对应代表不同复用功能 |
不同引脚的复用功能不一样,见下图:
GPxQSEL1/2
输入质量选择(输入采样窗口设置)
Value | 作用 |
---|---|
00 | 与系统时钟同步(SYSCLKOUT) |
01 | 三个采样窗口(3 sample) |
10 | 六个采样窗口(6 sample) |
11 | 异步 |
同步与异步选择:
同步:与系统时钟同步,系统时钟频率为150MHz就是输出150MHz。
异步:即所需时钟不与与系统时钟相同,将系统时钟经过分频得到对应的外设时钟,如IIC、SPI、ADC等。
GPxCTRL
输入采样周期设置;当GPxQSEL1/2配置了3 samples或6 samples,通过该寄存器设置采样周期
Value | 作用 |
---|---|
0x00 - 0xFF | 采样周期 = (Value × 2) × T_SYSCLKOUT |
GPIOXINT1SEL
选择外部中断引脚源;比如:GPIO12挂载到XINT1,赋值为12
GPIOx | XINTn |
---|---|
GPIO0 - GPIO31 | 可挂载到XINT1、XINT2 |
GPIO32 - GPIO63 | 可挂载到XINT3\4\5\6\7 |
低功耗模式配置
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
外部中断控制寄存器
XINT1CTR (暂时用不到)
外部中断计数寄存器,只有XINT1和XINT2有,16位递增计数器,以SYSCLKOUT速率计时。当检测到有效中断边缘时,计数器值重置为0x0000,然后继续计数,直到检测到下一个有效中断边缘。
三、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组寄存器进行介绍,并给出相应配置代码。(个人学习记录分享)