28335之GPIO

更新时间:2023-12-01 00:02:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

28335之GPIO

本系列文章由斌斌-龙臻独立完成,首发于QQ空间,会在百度空间、网易博客、人人网同步更新,转载必须注明作者和出处,必须注明原文链接。

注:本系列文章主要针对TI公司的C28xx系列DSP芯片的一些功能模块进行介绍,并描述基本的配置。文章中提到的DSP芯片未说明即默认为TMS320F28335,简称为28335。

GPIO(General-Purpose Input/Output)——通用输入/输出口,对大多数从事电子行业的人来说并不是什么陌生的东西。但它却是基础性的,很多MCU的后续开发都得用到GPIO。

28335有88个IO口,为GPIO0至GPIO87,其中GPIO0至GPIO63可以配置为8个核心中断。28335的GPIO口可以分为三组,分别为A口(GPIO0至GPIO31),B口(GPIO32至GPIO63)和C口(GPIO64至GPIO87)。

GPIO的寄存器可以分为三种,分别是GPIO控制寄存器,GPIO数据寄存器和GPIO中断与低功耗模式选择寄存器。详见表1、2、3。

表1:GPIO控制寄存器

表2:GPIO数据寄存器

表3:GPIO中断与低功耗模式选择寄存器

我们按照表中的寄存器的顺序来讲解。

GPIO限制控制寄存器GPxCTRL(x=A,B,C)为配置为输入限制的引脚指定了采样周期。采样周期介于限制采样周期之内,是相对于系统时钟周期的倍数。具体的配置见表4,以A口为例。

表4:GPIO Port A Qualification Control (GPACTRL) Register Field Descriptions

而GPIO限制选择寄存器GPxQSELy(x=A,B,C;y=1,2)指定了采样窗是3个采样点还是6个采样点。具体的配置见表5,还是以A口为例。

表5:GPIO Port A Qualification Select 1 (GPAQSEL1) Register Field Descriptions

以上寄存器主要是为GPIO的输入功能进行的配置。通过,图1(Qualification Using Sampling Window)和图2(Input Qualifier Clock Cycles),我们可以很清楚的知道GPIO的输入限制是怎样完美的去除我们不需要的噪声的。

图1:Qualification Using Sampling Window

图2:Input Qualifier Clock Cycles

在图2中,输入限制将忽略这个尖刺小脉冲。QUALPRD位域值限制采样周期,8位值范围为0~255.当QUALPRD为0时,无限制输入,此时采样周期与SYSCLKOUT同步。对于任意一个“n”值,限制周期 = 2*n个系统时钟周期(SYSCLKOUT),即每2*n个系统时钟周期,GPIO引脚进行一次采样。当6个采样都为同一个值时,才可以确定一个输入。

具体的采样周期的配置和采样窗的配置在上文已有阐述。

有输入限制时检测输入变化,输入必须稳定(5*QUALPRD*2)个SYSCLKOUT周期,以保证检测时6个采样点的采样相同。例如QUALPRD=1时,输入必须有10个或者10个以上的稳定的SYSCLKOUT周期,因为外部信号是异步驱动的,11个SYSCLKOUT周期宽度的脉冲可以确保可靠的识别。

每个通用I/O端口都受多路复用(MUX),方向(DIR),数据(DAT),置位(SET),清楚(CLEAR),以及切换(TOGGLE)寄存器的控制。

多路复用寄存器GPxMUX(x=A,B,C)用来配置引脚的功能,是外设操作还是I/O操作。复位时,所有的GPIO引脚都配置成数字I/O功能。当寄存器中某位置1时,相应的引脚配置成相应的外设。具体的管脚与外设功能见技术手册sprufb0d——System Control and Interrupts的Table 50(GPAMUX1)。

方向控制寄存器GPxDIR用来将相应的I/O管脚配置成输出或输入,复位时,所有的GPIO引脚配置成输入,当GPxDIR.bi t= 1时,引脚配置成输出。在采用GPxDIR寄存器位将输入端口改变成输出端口之前,引脚的当前电平反应到GPXDAT寄存器上。在改变输入成输出状态之前,初始化GPxDAT用寄存器GPxSET、GPxCLEAR、GPxTOGGLE。

上拉电阻使能寄存器GPxPUD用来配置是否使能上拉电阻。复位时,所有的GPIO引脚使能上拉电阻,当GPxPUD寄存器的某位置1时,相应的引脚的上拉电阻不使能。

数据寄存器GPxDAT,是一个读/写寄存器,读入的该寄存器的值反应了输入限制后输入引脚当前的电平,写寄存器可设置输出引脚为相应的电平。

置位寄存器GPxSET是一个只写寄存器,读为0。如果对应的引脚配置为输出,则向置位寄存器的该位写1,将对应引脚的电平拉高,写0则无效。

清除寄存器GPxCLEAR是一个只写寄存器,读为0。如果对应的引脚配置为输出,则向清除寄存器的该位写1,将把对应引脚的电平拉低,写0无效。

切换寄存器GPxTOGGLE,是一个只写寄存器,读为0。如果对应的引脚配置为输出,则向切换寄存器的该位写1,将把对应引脚拉成反向电平,写0无效。

中断选择寄存器GPIOXIMTnSEL的功能是选择某位I/O引脚来配置中断。具体的配置见表6。该表配置的是GPIO0至GPIO31,对应的是XINT1和XINT2,具体的中断配置见寄存器XINT1CR和XINT2CR,本文不再详述,将在中断那

文中再具体讲解。

表6:GPIO XINTn Interrupt Select (GPIOXINTnSEL) Register Field Descriptions

低功耗模式唤醒选择寄存器GPIOLPMSEL针对的是GPIO0至GPIO31,向寄存器的某位写1,则相应的信号引脚将唤醒设备,无论设备处于HALT或者STANDBY低功耗模式。写0则无效。

GPIO的寄存器就介绍到这,接下去看个例子,点亮LED。先看电路图,见图3。

图3:LED

在图中,LED所采用的GPIO引脚是GPIO60和GPIO61,当GPIO60和GPIO61为地电平,LED发光。置于为什么不直接用GPIO驱动LED,是因为DSP芯片的拉电流较小。一般说来,MCU的灌电流都比拉电流大的多。

#define LED1 #define LED2

void configtestled(void) LED的配置函数 {

EALLOW;

GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0; //配置GPIO60为普通数字I/O

GpioDataRegs.GPBDAT.bit.GPIO60 GpioDataRegs.GPBDAT.bit.GPIO61

GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1; //配置GPIO60为输出 GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0; //配置GPIO61为普通数字I/O GpioCtrlRegs.GPBDIR.bit.GPIO61 = 1; //配置GPIO61为输出 EDIS; }

void main(void) { . . .

configtestled( ) ;

LED1=0; //D1发光 LED2=0; //D2发光 . . . }

以上的例子只是GPIO的普通I/O口的应用,进一步的外设的配置以及中断的配置会在后续的模块介绍中讲述。

GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1; //配置GPIO60为输出 GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0; //配置GPIO61为普通数字I/O GpioCtrlRegs.GPBDIR.bit.GPIO61 = 1; //配置GPIO61为输出 EDIS; }

void main(void) { . . .

configtestled( ) ;

LED1=0; //D1发光 LED2=0; //D2发光 . . . }

以上的例子只是GPIO的普通I/O口的应用,进一步的外设的配置以及中断的配置会在后续的模块介绍中讲述。

本文来源:https://www.bwwdw.com/article/03dt.html

Top