发表于2022/1/22 12:10:00
一、GPIO工作原理 外界二进制信息(数字量)要被CPU处理,要给存储器存放,就需要外界信息源与两者之间的交换接口,这样的交换接口若用来进行通用目的数字量的输入输出,就被称为通用数字量输入/输出接口,简称GPIO。F28335 DSP有多达88个GPIO口,对应着芯片引出的88个引脚,随着芯片的封装与尺寸的确定,引脚数目是有限的,所以这88个引脚多数都是功能复用的,即可以灵活配置为输入引脚,也可以灵活配置为输出引脚,即可以作为通用I/O引脚,也可以作为特殊功能口(如SCI、SPI、ECAN等),非常灵活,用户根据需要,可以通过GPIO MUX(输入输出多路选择器,复用开关)寄存器来进行相关配置,下边详细介绍GPIO的工作原理及其配置过程。 F28335 DSP将这88个GPIO口分成了A、B、C三大组,A组包括GPIO0至GPIO31,B组包括GPIO32至GPIO63,C组包括GPIO64至GPIO87,每个引脚都复用了多个功能,同一时刻,每个引脚只能用该引脚的一个功能。究竟工作在哪个模式下,可以通过GPIO Mux(复用开关)寄存器配置每个引脚的具体功能(通用数字量I/O或者外设专用功能)。如果将这些引脚选择数字量I/O模式,可以通过方向寄存器GPxDIR配置数字量I/O的方向,即是作为输入引脚还是作为输出引脚;还可以通过量化寄存器GPxQUAL对输入信号进行量化限制,从而可以消除数字量I/O引脚的噪声干扰。此外,有下面4种方式对GPIO引脚进行读写操作: 控制GPIO接口的关键控制寄存器 1、可以通过GPxDAT寄存器独立读/写I/O信号; 2、利用GPxSET寄存器写1(写0无效)对I/O口进行置位 3、利用GPxCLEAR寄存器写1(写0无效)对I/O口进行清零; 4、利用GPxTOOGLE寄存器置1后(写0无效)来将I/O输出电平翻转,原来高电平变成低电平,原来低电平则变成高电平。 二、GPIO寄存器
GPIO寄存器数据结构 struct GPIO_CTRL_REGS { union GPACTRL_REG GPACTRL; union GPA1_REG GPAQSEL1; union GPA2_REG GPAQSEL2; union GPA1_REG GPAMUX1; union GPA2_REG GPAMUX2; union GPADAT_REG GPADIR; union GPADAT_REG GPAPUD; Uint32 rsvd1; union GPBCTRL_REG GPBCTRL; union GPB1_REG GPBQSEL1; union GPB2_REG GPBQSEL2; union GPB1_REG GPBMUX1; union GPB2_REG GPBMUX2; union GPBDAT_REG GPBDIR; union GPBDAT_REG GPBPUD; Uint16 rsvd2[8]; union GPC1_REG GPCMUX1; union GPC2_REG GPCMUX2; union GPCDAT_REG GPCDIR; union GPCDAT_REG GPCPUD; }; 三、GPIO编程 例1:采用上述结构体定义可以直接对GPIO的寄存器进行操作,完成外部引脚的初始化操作。例如,将IOA全部设置GPIO功能,输出状态,0量化: void Gpio_Select(void) { Uint16 var1; Uint16 var2; Uint16 var3; var1=0x0000; var2=0xffff; var3=0x0000; EALLOW; GpioCtrlRegs.GPAMUX1=var1;//GPIO0-15 GpioCtrlRegs.GPAMUX2=var1;//GPIO16-31 GpioCtrlRegs.GPADIR.all=var2;//GPIO0-31 GpioCtrlRegs.GPAQSEL1.all=var3; GpioCtrlRegs.GPAQSEL2.all=var3; EDIS; } 例2: F28335一共有88个GPIO,分为3组,分别是A、B、C。其中A组GPIO可以通过软件配置为外部中断1、2以及NMI功能,B组GPIO可以通过软件配置为外部中断3、4、5、6、7功能。而C组的GPIO不能配置为中断功能。如果将某GPIO配置为外部中断功能,那么下面是设置步骤: 1. 将数字量I/O配置为GPIO功能; 2. 将数字量I/O配置为输入方向; 3. 将数字量I/O量化配置正确; 4. 利用外部中断选择寄存器选择相应的引脚为外部中断源; 5. 为此GPIO触发信号设置极性,上升沿、下降沿或者双边沿; void GPIO_xint (void) { ELLOW; GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 0; GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 0; GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 0; GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 0; GpioCtrlRegs.GPBDIR.bit.GPIO54 = 0; GpioCtrlRegs.GPBDIR.bit.GPIO55 = 0; GpioCtrlRegs.GPBDIR.bit.GPIO56 = 0; GpioCtrlRegs.GPBDIR.bit.GPIO57 = 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO54= 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO55= 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO56= 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO57= 0; GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL = 54;GpioIntRegs.GPIOXINT4SEL.bit.GPIOSEL = 55; GpioIntRegs.GPIOXINT5SEL.bit.GPIOSEL = 56; GpioIntRegs.GPIOXINT6SEL.bit.GPIOSEL = 57; XIntruptRegs.XINT3CR.bit.POLARITY= 0; XIntruptRegs.XINT4CR.bit.POLARITY= 0; XIntruptRegs.XINT5CR.bit.POLARITY= 0; XIntruptRegs.XINT6CR.bit.POLARITY= 0; XIntruptRegs.XINT3CR.bit.ENABLE = 1; XIntruptRegs.XINT4CR.bit.ENABLE = 1; XIntruptRegs.XINT5CR.bit.ENABLE = 1; XIntruptRegs.XINT6CR.bit.ENABLE = 1; EDIS; } |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
楼主 |