F2812I/O配置与应用GPIO,英文全称为General-PurposeIOports,也就是通用IO口。嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。数据寄存器的各位都直接引到芯片外部,而对这种寄存器中每一位的作用,即每一位的信号流通方向,则可以通过控制寄存器中对应位独立的加以设置。这样,有无GPIO接口也就成为微控制器区别于微处理器的一个特征。一、F2812I/O端口概述F2812提供了56个多功能引脚,这些引脚的第一功能是作为通用意义数字I/O口(GPIO),而第二功能则可以作为片内外设的输入/输出引脚。F2812通过专门的多路选择器(MUX)进行引脚功能的选择。如果作为通用数字I/O口,有专门的方向寄存器用于配置引脚作为输入还是输出,另外还有专门的数据寄存器、置位寄存器、清零寄存器以及触发寄存器用于对I/O口的状态进行读取或配置。GPIO引脚分配GPIOAGPIOA0/PWM1GPIOA1/PWM2GPIOA2/PWM3GPIOA3/PWM4GPIOA4/PWM5GPIOA5/PWM6GPIOA6/T1PWM_T1CMPGPIOA7/T2PWM_T2CMPGPIOA8/CAP1_QEP1GPIOA9/CAP2_QEP2GPIOA10/CAP3_QEPI1GPIOA11/TDIRAGPIOA12/TCLKINAGPIOA13/C1TRIPGPIOA14/C2TRIPGPIOA15/C3TRIPGPIOBGPIOB0/PWM7GPIOB1/PWM8GPIOB2/PWM9GPIOB3/PWM10GPIOB4/PWM11GPIOB5/PWM12GPIOB6/T3PWM_T3CMPGPIOB7/T4PWM_T4CMPGPIOB8/CAP4_QEP3GPIOB9/CAP5_QEP4GPIOB10/CAP6_QEPI2GPIOB11/TDIRBGPIOB12/TCLKINBGPIOB13/C4TRIPGPIOB14/C5TRIPGPIOB15/C6TRIPGPIODGPIOD0/T1CTRIP_PDPINTAGPIOD1/T2CTRIP/EVASOCGPIOD5/T3CTRIP_PDPINTBGPIOD6/T4CTRIP/EVBSOCGPIOEGPIOE0/XINT1_XBIOGPIOE1/XINT2_ADCSOCGPIOE2/XNMI_XINT13GPIOFGPIOF0/SPISIMOAGPIOF1/SPISOMIAGPIOF2/SPICLKAGPIOF3/SPISTEAGPIOF4/SCITXDAGPIOF5/SCIRXDAGPIOF6/CANTXAGPIOF7/CANRXAGPIOF8/MCLKXAGPIOF9/MCLKRAGPIOF10/MFSXAGPIOF11/MFSRAGPIOF12/MDXAGPIOF13/MDRAGPIOF14/XFGPIOGGPIOG4/SCITXDBGPIOG5/SCIRXDBNote:GPIOarepinfunctionsatresetGPIOA,B,D,EincludeInputQualificationfeature二、GPIO寄存器控制2、1GPxMUX寄存器通用输入输出多路选择寄存器I/O是工作在通用数字IO还是外围IO信号引脚就有GPxMUX决定。GPxMUX.bit.xx=0,xx通用数字IO;GPxMUX.bit.xx=1,xx外围IO引脚。2、2GPxDIR寄存器方向选择寄存器如果配置为通用数字IO脚,那么GPxDIR决定了该引脚是输入还是输出。GPxDIR.bit.xx=0,xx配置为输入;GPxDIR.bitxx=1,xx配置为输出。2、3GPxQUAL寄存器设置采样脉冲寄存器在配置为通用数字IO后,DSP的数字IO引脚有对输入过滤噪声的功能,即对IO输入电平采样,在采样设置的次数后都是一个电平,才会确定有效。假如设置为输入高电平,采样10次,那么这10都为高电平才认为输入高有效,GPxDAT寄存器相应位才会改变。它是一个16位的寄存器,低八位有效。GPxQUAL=0;与SYSCLKOUT同步,没有限制作用GPxQUAL=1;2个SYSCLKOUT周期采样,GPxQUAL=2;4个SYSCLKOUT周期采样,GPxQUAL=0xff;510个SYSCLKOUT周期采样,2、4GPxSET置1寄存器每个IO口有一个置1寄存器,只能写不能读,也就是只能用在输出上,写1可以使输出为1,写0没有变化。GPxSET.bit.xx=0,被忽略;GPxSET.bit.xx=1,且引脚配置为输出,则输出变高2、5GPxCLEAR清0寄存器每个IO口有一个清0寄存器,只能写不能读,也就是只能用在输出上,写1可以使输出清0,写0没有变化。GPxCLEAR.bit.xx=0,被忽略;GPxCLEAR.bit.xx=1,且引脚配置为输出,则输出清02、6GPxTOGGLE翻转寄存器每个IO口有一个翻转寄存器,只能写不能读,也就是只能用在输出上,写1可以使输出翻转,写0没有变化。GPxTOGGLE.bit.xx=0,被忽略;GPxTOGGLE.bit.xx=1,且引脚配置为输出,则输出翻转2、7GPxDAT寄存器IO数据寄存器每个IO都有一个数据寄存器,当IO配置为输出时,相GPxDAT中写数据就可以决定输出状态;GPxDAT.bit.xx=0,输出变低;GPxDAT.xx=1,输出变高当IO配置为输入时,读取GPxDAT中的数据就可以决定输入状态;注意:当引脚配置为通用数字IO时,相应的外围功能必须屏蔽,否则可能会引发不必要的中断三、GPIO应用举例应用DSP的GPIO端口控制输出数据,控制8×8点阵进行图形或字符显示。3、1硬件电路设计电路如下图所示。74164为串行输入并行输出移位寄存器。设计中,选择两片74164分别控制点阵模块的行和列,控制数据从DSP端口输出。其中,GPIOF0输出数据与U1的74164的A端口相连,GPIOF1与B口连接,两个端口用来输出对点阵进行显示控制的数据,GPIOF2输出模拟时钟脉冲信号,与74164的CLK引脚相连,GPIOF3连接CLR清零端。DSPF2812的GPIOB0---GPIOB3与另外一片74164的A、B、CLR、CLK对应相连。如图所示。图3.18×8点阵电路图3、28×8点阵内部电路点阵内部为排列的8×8个发光二极管,每一个二极管都在行线和列线的交点处,要同时受到行和列的控制才能点亮。二极管阵列的正向端分别由COL1-COL8端口控制,负向端通过端口ROW1-ROW8控制。在驱动某个点阵点点亮时,需要同时控制该发光二极管正端接高电平,负端接低电平即可。例如:要使得COL4和ROW4交点处二极管点亮,则需要在端口COL端输入数据:00001000(08H),在ROW端输入:00001000(08H)。图3.28×8点阵内部电路3、3串行输入并行输出移位寄存器74164功能如图所示为74164的引脚图,CLEAR为清零端,CLOCK为时钟脉冲输入端,A、B端口为串行输入数据引脚,Q0—Q7为数据输出引脚。从真值表可以看出,CLEAR为逻辑低电平时,无论其他引脚电平信号如何,从QA-QH端口输出均为低电平,实现输出清零。A、B输入信号为相与的关系,相与后的结果送入内部RS触发器。在CLOCK脉冲信号的上升沿,采样输入脚A、B相与后的结果,作为内部RS触发器的输入信号,根据输入数据触发输出,从QA端口输出。在QA端口输出更新数据时,QB端口输出数据为QA端口更新前的QAn,QC端口输出数据为QBn,依次类推。图3.374164引脚图图3.474164内部电路以如下时序图为例说明:在图中标注的时钟脉冲1时刻,A端口输入为高电平,B端口输入为逻辑1,在CLOCK上升沿,采样输入信号,经过内部RS触发器,在QA端口输出逻辑1,此时,QB输出为QA更新前QAn,更新前QAn为逻辑0,因此,QB输出为0,QC输出为QBn,QD输出为QCn,依此类推,QH输出为QGn,输出均为0。在图中标注的时钟脉冲1-8时刻,从A端口串行输入的数据为11010000,从B端口输入数据为11111111逻辑1,AB相与后输入内部RS触发器的串行数据为:11010000。经过8个时钟脉冲后,从第八个时钟脉冲上升沿后QA-QH引脚电平可以看出,该串行数据从QA-QH端口并行输出,即从QH-QA输出电平为:11010000。从而,实现了将串行输入数据并行输出的功能。图3.574164时序图3、4参考主程序:#includeDSP28_Device.h#includeDSP28_Globalprototypes.h/*****************************************************************************端口GPIOF0用DINA表示,“#define”为宏定义,以下程序中用字符“DINA”代表成员变量GpioDataRegs.GPFDAT.bit.GPIOF0,增加程序的可读性。其他端口定义用法相同。***************************************************************************/#defineDINAGpioDataRegs.GPFDAT.bit.GPIOF0#defineDINBGpioDataRegs.GPFDAT.bit.GPIOF1#defineCLK2GpioDataRegs.GPFDAT.bit.GPIOF2#defineCLEAR2GpioDataRegs.GPFDAT.bit.GPIOF3#defineDINCGpioDataRegs.GPBDAT.bit.GPIOB0#defineDINDGpioDataRegs.GPBDAT.bit.GPIOB1#defineCLK1GpioDataRegs.GPBDAT.bit.GPIOB2#defineCLEAR1GpioDataRegs.GPBDAT.bit.GPIOB3/********程序中引用的函数定义**************/voiddelay_loop(void);//点阵动态显示控制的延时程序voidGpio_select(void);//GPIO端口设置程序voidsendto1(unsignedcharkdab);//串行数据输出函数,输出行扫描数voidsendto2(unsignedchardat);//串行数据输出函数,输出列扫描数voidDELAY(void);/**************定义变量数组*****************/unsignedchardispdata[8]={0x10,0xFE,0x92,0xFE,0x10,0x10,0x10,0x10};//显示字符“中”字的行扫描数组unsignedchardispbit[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}//显示字符“中”字的列扫描数组unsignedcharkdab;unsignedcharkdat;/*************************主程序************************/voidmain(void){unsignedchari;InitSysCtrl();//系统初始化函数InitPieCtrl();//初始化PIE模块到默认状态InitPieVectTable();Gpio_select();//设置端口函数