原创 【TI博客大赛】TI C2000 Delfino TMS320F28335的GPIO的简单应用

2012-11-19 20:12 3036 17 17 分类: 处理器与DSP

    写在最前,不喜请略过。本博文的主要内容已在QQ空间、人人网、网易博客、百度空间等平台发表过,作者为Mr_D_prince(斌斌-龙臻),也就是本人,前两者均为我在非技术论坛的昵称。在技术论坛我更喜欢newofcortexm3这个昵称,原因无他,我就是个技术新人。之所以文章类型为什么是整理,是因为博文的主要内容均来自TI相关的技术手册,我只是做了下解读或者整理。

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

F2833588IO口,为GPIO0GPIO87,其中GPIO0GPIO63可以配置为8个核心中断。28335GPIO口可以分为三组,分别为A口(GPIO0GPIO31),B口(GPIO32GPIO63)和C口(GPIO64GPIO87)。GPIO的寄存器可以分为三种,分别是GPIO控制寄存器,GPIO数据寄存器和GPIO中断与低功耗模式选择寄存器。

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

 

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

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

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

数据寄存器GPxDAT,是一个读/写寄存器,读入的该寄存器的值反应了输入限制后输入引脚当前的电平,写寄存器可设置输出引脚为相应的电平。但在实验过程中发现,要对该寄存器的某个位写1或置零,必须延迟多个系统周期才能实现。鉴于此对GPIO的某个具体引脚操作时不建议使用此寄存器,使用置位寄存器和清楚寄存器要来的高效的多。

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

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

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

中断选择寄存器GPIOXIMTnSEL的功能是选择某位I/O引脚来配置中断。具体的配置见表6。该表配置的是GPIO0GPIO31,对应的是XINT1XINT2,具体的中断配置见寄存器XINT1CRXINT2CR。

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

下面介绍一个简单的例子,点亮LED。电路图如下图所示:

20121119195946803.jpg

    在图中,LED所连接的GPIO引脚是GPIO60和GPIO61GPIO61,当GPIO60和GPIO61为低时,D1和D2发光。程序如下:

 

#define    LED1       GpioDataRegs.GPBDAT.bit.GPIO60

#define    LED2       GpioDataRegs.GPBDAT.bit.GPIO61

LED 的初始化程序

void configLED(void)

{

EALLOW;

GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0;

GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1;

GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0;

GpioCtrlRegs.GPBDIR.bit.GPIO61 = 1;

EDIS;

}

    在主函数中调用configLED()函数,再对LED1和LED2进行简单的赋值即可实现LED的控制。例如:LED1亮,LED2灭,即LED1=0;LED2=1.

 

 

文章评论0条评论)

登录后参与讨论
我要评论
0
17
关闭 站长推荐上一条 /2 下一条