DSP相关笔记_2:LaunchXL-F28379D的简单教程系列(二)GPIO输入
注:
1)这是本人关于Ti的C2000系列的学习笔记,所用工具有官方的开发软件CCS10版本,帮助文库以及函数库软件controlSUITE。硬件部分LaunchXL-F28379D和逻辑分析仪一台。
2)DSP相关笔记_1:LaunchXL-F28379D的简单教程系列(一) GPIO输出
前言:接着上次做完简单的GPIO输出之后,我们继续进行GPIO输入的实验,但会涉及到GPIO的输出配置,也是寄存器和函数库两个版本。
老规矩结构决定功能,先上结构图:
简单版:
详细版:
根据具体版的结构图,要完成GPIO的输入,不仅要配置(图中的小y我换成常用的小x表示,强迫症,哈哈哈)GPxPUD、GPxDIR、GPxMUX1或GPxMUX2、GPxGMUX1或GPxGMUX2,共四个寄存器,还需要配置GPxINV、GPxCTRL、GPxQSEL1或GPxQSEL2,共三个寄存器。为什么会多出3个寄存器,这就是我们需要理解每个寄存器对应什么功能。
注:这里需要配置之前GPIO输出的相关寄存器(GPxPUD、GPxDIR、GPxMUX1或GPxMUX2、GPxGMUX1或GPxGMUX2),但由于篇幅有限,就只会说一下输入额外用到的寄存器(GPxINV、GPxCTRL、GPxQSEL1或GPxQSEL2)。
1)GPxINV:是否需要进行取反,相当于加了一个非门。Reset:0,相当于默认就是0,没有非门。不过我们为了更加有体系的认识需要手动配置一下。
2)GPxCTRL 和 GPxQSEL1或GPxQSEL2 两个寄存器,配合完成输入的模式,其中GPxQSEL1或GPxQSEL2是因为一个引脚占2位所以需要分成两个寄存器管理,只需要选择对应的使用就可以。
a.GPxQSEL1或GPxQSEL2:选择输入模式,有异步模式(Asysnc),同步模式(sysnc,和系统时钟同步),采样模式两种(3-sample(一个采样周期采样3次)和5-sample(一个采样周期采样5次),直白点就是采样的数量)
b.当选择了采样模式之后,就需要进行对GPxCTRL的配置,进行采样周期配置,具体参照应用手册P970内容。
注:我们进行简单的GPIO输入实验,所以我选用的是异步模式,也就是GPxCTRL(默认00)位11就可以,而无法配置GPxCTRL ,但如果选择采样模式则需要GPxCTRL,不然默认是周期和系统时钟一样。
当使用采样时的结构图:
然后就是代码:
函数库版:
#include "F28x_Project.h"
void gpioInit_my(void);
void main(void)
{
//1.配置时钟,需要包括F2837xD_SysCtrl.c
InitSysCtrl();
//2.初始化GPIO,需要包括F2837xD_Gpio.c
InitGpio();
//3.关CPU中断
DINT;
//4.初始化PIE,并清楚相关寄存器,需要包括F2837xD_PieCtrl.c,F2837xD_PieVect.c,F2837xD_DefaultIsr.c
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
gpioInit_my();
int i;
while(1)
{
if(GPIO_ReadPin(1) == 0)//如果输入低电平,则执行方波输出,否则一直为低电平
{
for(i=10;i>0;i--)
{
GPIO_WritePin(0,0);
delay_loop();
GPIO_WritePin(0,1);
delay_loop();
GPIO_WritePin(0,0);
}
break;
}
else
{
GPIO_WritePin(0,0);
}
}
}
void gpioInit_my(void)
{
GPIO_SetupPinMux(0,GPIO_MUX_CPU1,0x0);//配置GPIO0,属于GPU1,普通GPIO1
GPIO_SetupPinOptions(0,GPIO_OUTPUT,GPIO_PUSHPULL);//输出模式,推挽模式
GPIO_SetupPinMux(1,GPIO_MUX_CPU1,0x0);//配置GPIO1,属于GPU1,普通GPIO1
GPIO_SetupPinOptions(1,GPIO_INPUT,GPIO_PULLUP|GPIO_ASYNC);//输出模式,上拉模式(不要让输入悬空)和异步模式
}
void delay_loop()
{
short i;
for (i = 0; i < 100; i++) {}
}
结果图:
寄存器版:
#include "F28x_Project.h"
void gpioInit_my(void);
void main(void)
{
//1.配置时钟,需要包括F2837xD_SysCtrl.c
InitSysCtrl();
//2.关CPU中断
DINT;
//3.初始化PIE,并清楚相关寄存器,需要包括F2837xD_PieCtrl.c,F2837xD_PieVect.c,F2837xD_DefaultIsr.c
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
gpioInit_my();
//GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
//GpioDataRegs.GPASET.bit.GPIO0 = 1;
int i;
while(1)
{
if(GpioDataRegs.GPADAT.bit.GPIO1 == 1)//输入为高电平,输出方波,否则低电平。
{
for(i=10;i>0;i--)
{
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
delay_loop();
GpioDataRegs.GPASET.bit.GPIO0 = 1;
delay_loop();
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
}
break;
}
else
{
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
}
}
}
void gpioInit_my(void)
{
EALLOW;
//Gpio0 Output
GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0 ;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0 ;
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1 ;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1 ;
//Gpio1 Input
GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 0 ;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0 ;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 0 ;
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0 ;//上拉输入,不要选课
GpioCtrlRegs.GPAQSEL1.bit.GPIO1 = 3 ;//选择No Synchronization (Asynchronous Input),异步输入
GpioCtrlRegs.GPAINV.bit.GPIO1 = 0 ;//不取反
EDIS;
}
void delay_loop()
{
short i;
for (i = 0; i < 100; i++) {}
}
结果图:
总结:这是基于上次GPIO的输出的完善,结合输出功能演示GPIO的输入功能。由于芯片很强大很多细节我都没有说,因为只是简单的使用GPIO所以不会说得很多,我在想想。由于才看不久可能会有说错的地方请大家下面评论就行,我会立即完善自己的笔记的。
注:如果不会配置工程文件,controlSUITE中的指导书和网上都有工程文件配置。
参考资料:TMS320F2837XD Dual-Core Microcontollers Technical Reference Manual