一、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寄存器
名 称
|
地 址
|
空间地址
|
描 述
|
GPACTRL
|
0X6F80
|
2
|
GPIOA控制寄存器
|
GPAQSEL1
|
0X6F82
|
2
|
GPIOA量化控制寄存器1
|
GPAQSEL2
|
0X6F84
|
2
|
GPIOA量化控制寄存器2
|
GPAMUX1
|
0X6F86
|
2
|
GPIOA选择寄存器1
|
GPAMUX2
|
0X6F88
|
2
|
GPIOA选择寄存器2
|
GPIOADIR
|
0X6F8A
|
2
|
GPIOA方向寄存器
|
GPIOAPUD
|
0X6F8C
|
2
|
GPIOA上拉禁止寄存器
|
GPBCTRL
|
0X6F90
|
2
|
GPIOB控制寄存器
|
GPBQSEL1
|
0X6F92
|
2
|
GPIOB量化控制寄存器1
|
GPBQSEL2
|
0X6F94
|
2
|
GPIOB量化控制寄存器2
|
GPBMUX1
|
0X6F96
|
2
|
GPIOB选择寄存器1
|
GPBMUX2
|
0X6F98
|
2
|
GPIOB选择寄存器2
|
GPBDIR
|
0X6F9A
|
2
|
GPIOB方向寄存器
|
GPBPUD
|
0X6F9C
|
2
|
GPIOB上拉禁止寄存器
|
GPCMUX1
|
0X6FA6
|
2
|
GPIOC
选择寄存器1
|
GPCMUX2
|
0X6FA8
|
2
|
GPIOC
选择寄存器2
|
GPCDIR
|
0X6FAA
|
2
|
GPIOC
方向寄存器
|
GPCPUD
|
0X6FAC
|
2
|
GPIOC
上拉禁止寄存器
|
GPIOXINT1SEL
|
0X6FE0
|
1
|
外部中断源选择寄存器1
|
GPIOXINT2SEL
|
0X6FE1
|
1
|
外部中断源选择寄存器2
|
GPIONMISEL
|
0X6FE2
|
1
|
不可屏蔽中断源选择寄存器
|
GPIOXINT3SEL
|
0X6FE3
|
1
|
外部中断源选择寄存器3
|
GPIOXINT4SEL
|
0X6FE4
|
1
|
外部中断源选择寄存器4
|
GPIOXINT5SEL
|
0X6FE5
|
1
|
外部中断源选择寄存器5
|
GPIOXINT6SEL
|
0X6FE6
|
1
|
外部中断源选择寄存器6
|
GPIOXINT7SEL
|
0X6FE7
|
1
|
外部中断源选择寄存器7
|
GPIOLPMSEL
|
0X6FE8
|
1
|
唤醒低功耗模式源选择寄存器
|
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;
}