文章目录
一、28377开发板的led电路分析
led电路图:
LED串联1k欧限流电阻,正极接3.3V电源,负极接28377引脚。3个LED用共阳接法。当引脚P89输出低电平,LED1点亮;当引脚P89输出高电平,LED1熄灭。其他LED同样受P91、P93引脚控制亮灭。
二、28377的GPIO相关寄存器介绍
2.1 前言
28377引脚是多功能复用的,因此需要将P89、P91和P93设置为GPIO功能,并上拉输出。
在2837xD系列的DSP芯片中,有高达8组I/O端口,它们的关系为
Port | GPIO |
---|---|
A | 0~31 |
B | 32~63 |
C | 64~95 |
D | 96~127 |
E | 128~159 |
F | 160~191 |
G | 192~223 |
H | 224~255 |
因此点亮LED所需的P89、P91和P93引脚属于PortC.
此外值得一提的是,在TI官方资料《TMS320F2837xD Dual-Core Microcontrollers Technical Reference Manual (Rev. K)》(可在TI官网下载)中可以看到2837xD系列的外设复用、CPU复用和引脚选项只能通过CPU1进行配置。
所以该工程只使用CPU1进行GPIO的配置与控制。
2.2 GPySET 寄存器介绍
该寄存器用于驱动引脚输出为高电平,且不影响其他的引脚。GPySET其中的y用于指代不同引脚的Port,例如P89就是GPCSET。因此设置P89为高电平,可以采用下列程序:
GpioDataRegs.GPCSET.bit.GPIO89 = 1; //用于GPIO89置高
同时在程序中选中GPCSET按下F3可以看到GPCSET是GPCSET_REG类型的数据,GPCSET_REG的定义如下:
union GPCSET_REG {
Uint32 all;
struct GPCSET_BITS bit;
};
其中GPCSET_BITS 为包含GPIO64~GPIO95的结构体。
struct GPCCLEAR_BITS { // bits description
Uint16 GPIO64:1; // 0 Output Clear bit for this pin
Uint16 GPIO65:1; // 1 Output Clear bit for this pin
Uint16 GPIO66:1; // 2 Output Clear bit for this pin
Uint16 GPIO67:1; // 3 Output Clear bit for this pin
...
}
2.3 GPyCLEAR 寄存器介绍
与GPySET刚好相反,GPyCLEAR 用于驱动引脚输出为底电平。同样的,设置P89为低电平,可以采用下列程序:
GpioDataRegs.GPCCLEAR.bit.GPIO89 = 1 //用于GPI89置低
在这两段程序中都出现了GpioDataRegs,选中按下F3可以看到,它属于GpioDataRegs结构体类型,而它用于修改GPIO的GPyDAT、GPySET、GPyCLEAR、GPyTOGGLE四类寄存器。GPyDAT用于直接设置电平,GPyTOGGLE用于切换电平。
struct GPIO_DATA_REGS {
union GPADAT_REG GPADAT; // GPIO A Data Register (GPIO0 to 31)
union GPASET_REG GPASET; // GPIO A Data Set Register (GPIO0 to 31)
union GPACLEAR_REG GPACLEAR; // GPIO A Data Clear Register (GPIO0 to 31)
union GPATOGGLE_REG GPATOGGLE; // GPIO A Data Toggle Register (GPIO0 to 31)
...
};
三、程序介绍
3.1 引入库
处理器间通信Interprocessor Communication (IPC)
#include "F28x_Project.h"
#include "F2837xD_Ipc_drivers.h"
3.2 配置GPIO引脚功能
用于设置GPIO引脚为上拉输出
void GPIO_Setup() //配置GPIO的功能
{
GPIO_SetupPinMux(89, GPIO_MUX_CPU1, 0);//对引脚89设置;选择CPU1为内核,选择外设功能0
GPIO_SetupPinOptions(89, GPIO_OUTPUT, GPIO_PUSHPULL);//GPIO89,作为输出,上拉
GPIO_SetupPinMux(91, GPIO_MUX_CPU1, 0);
GPIO_SetupPinOptions(91, GPIO_OUTPUT, GPIO_PUSHPULL);
GPIO_SetupPinMux(93, GPIO_MUX_CPU1, 0);
GPIO_SetupPinOptions(93, GPIO_OUTPUT, GPIO_PUSHPULL);
}
3.2.1 GPIO_SetupPinMux函数
GPIO_SetupPinMux函数设置指定引脚的外设复用,
void GPIO_SetupPinMux(Uint16 pin, Uint16 cpu, Uint16 peripheral)
参数pin为设置的引脚。参数cpu为选择使用的cpu内核,GPIO的复用使用CPU1。参数peripheral的选择参看下图(源自参考文献1),外设功能选择0即可。
3.2.1 GPIO_SetupPinOptions函数
GPIO_SetupPinOptions函数用于设置指定引脚的GPIO输入/输出模式,
void GPIO_SetupPinOptions(Uint16 pin, Uint16 output, Uint16 flags)
参数output用于控制引脚输入输出,参数flags为设置GPIO输入/输出模式掩码,具体如下
//Flags for GPIO_SetupPinOptions(). The qualification flags (SYNC, QUAL3,
//QUAL6, and ASYNC) take up two bits and must be in the order specified.
#define GPIO_INPUT 0
#define GPIO_OUTPUT 1
#define GPIO_PUSHPULL 0
#define GPIO_PULLUP (1 << 0)
#define GPIO_INVERT (1 << 1)
#define GPIO_OPENDRAIN (1 << 2)
#define GPIO_SYNC (0x0 << 4)
#define GPIO_QUAL3 (0x1 << 4)
#define GPIO_QUAL6 (0x2 << 4)
#define GPIO_ASYNC (0x3 << 4)
这里选择GPIO_OUTPUT和GPIO_PUSHPULL,输出模式和上拉模式(关于什么是上拉输出,可以阅读参考文献2)
3.3 系统初始化
系统程序初始化代码如下图,对于系统初始化可以结合参考文献3的第6节视频系统初始化和*“C2000Ware”*中例程进行理解进行理解。
InitSysCtrl();
InitGpio();
GPIO_Setup();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EINT;
ERTM;
3.4 循环程序
1s为周期翻转引脚输出,实现led的循环亮灭。
while(0)
{
GpioDataRegs.GPCSET.bit.GPIO89 = 1;
GpioDataRegs.GPCSET.bit.GPIO91 = 1;
GpioDataRegs.GPCSET.bit.GPIO93 = 1;
DELAY_US(1000 * 500);
GpioDataRegs.GPCCLEAR.bit.GPIO89 = 1;
GpioDataRegs.GPCCLEAR.bit.GPIO91 = 1;
GpioDataRegs.GPCCLEAR.bit.GPIO93 = 1;
DELAY_US(1000 * 500);
}
28377板点亮led图
参考文献
- TMS320F2837xD Dual-Core Microcontrollers Technical Reference Manual (Rev. K)
- 深刻理解GPIO(上拉输入、下拉输入、模拟输入、浮空输入,开漏输出,推挽输出的区别,以STM32为例): link
- tms320f2837x入门指南 TI 官方: link