GPIO是指通用输入/输出端口。通俗地说,就是芯片引脚,可以通过它们输出高电平或者低电平,也可以通过它们读入引脚的电平状态——是高电平还是低电平。
比如STM32F103ZET6芯片共有112个I/O端口,共7组:GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG,每组端口分为0~15,共16个不同的引脚。可以通过设置寄存器来确定某个引脚用于输入、输出还是其他特殊功能。比如可能设置GPIOA.6作为一般的输入、输出引脚,或者用于串口。
GPIO(General Purpose Input Output)通用输入输出口
• 可配置为8种输入输出模式
• 引脚电平:0V~3.3V,部分引脚可容忍5V
• 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
• 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
与GPIO相关的寄存器主要有以下几种:
(1)配置寄存器:配置GPIO的模式及状态,如输入/输出模式、复用功能及输出的最大速度等以及端口配置低寄存器(GPIOx_CRL)、端口配置高寄存器(GPIO_CRH);
(2)数据寄存器:保存了GPIO的输入电平或将要输出的电平,如端口输入数据寄存器(GPIOx_IDR)、端口输出数据寄存器(GPIOx_ODR);
(3)位控制寄存器:设置某引脚的数据为1或0,如端口位设置/清除寄存器(GPIOx_BSRR)、端口位清除寄存器(GPIOx_BRR);
(4)锁定寄存器:设置某锁定引脚后,就不能修改其配置,如端口配置锁定寄存器(GPIOx_LCKR)(其中,x=A~E)。
工作模式 | 解释 |
浮空输入 (GPIO_Mode_IN_FLOATING) | 这是GPIO引脚的默认工作模式。在这种模式下,引脚内部没有连接上拉或下拉电阻,因此当外部电路没有驱动该引脚时,引脚的电平是不确定的。这种模式适用于外部电路能够可靠地驱动输入引脚的情况。 |
上拉输入 (GPIO_Mode_IPU) | 在这种模式下,GPIO引脚内部连接一个上拉电阻,将引脚与电源电压相连。这样,当外部电路没有驱动该引脚时,引脚的电平将被上拉至高电平。这种模式适用于外部电路使用开漏输出来驱动输入引脚的情况。 |
下拉输入 (GPIO_Mode_IPD) | 在这种模式下,GPIO引脚内部连接一个下拉电阻,将引脚与地相连。这样,当外部电路没有驱动该引脚时,引脚的电平将被下拉至低电平。这种模式适用于需要确保输入引脚处于已知状态的情况。 |
模拟输入 (GPIO_Mode_AIN) | 在这种模式下,GPIO引脚被配置为模拟输入,可以连接到微控制器内部的模拟数字转换器(ADC)上。这种模式适用于需要测量外部模拟信号的情况。 |
推挽输出 (GPIO_Mode_Out_PP) | 在这种模式下,GPIO引脚被配置为推挽输出。当输出高电平时,引脚内部的上拉晶体管导通,将引脚与电源电压相连;当输出低电平时,引脚内部的下拉晶体管导通,将引脚与地相连。这种模式适用于需要直接驱动外部负载的情况。高低电平均有驱动能力 |
开漏输出 (GPIO_Mode_Out_OD) | 在这种模式下,GPIO引脚被配置为开漏输出。当输出低电平时,引脚内部的下拉晶体管导通,将引脚与地相连;当输出高电平时,下拉晶体管截止,引脚处于高阻态。由于开漏输出无法主动将输出引脚拉高,因此通常需要在外部连接一个上拉电阻。对低电平的驱动能力较强 |
复用推挽输出 (GPIO_Mode_AF_PP) | 在这种模式下,GPIO引脚被配置为复用推挽输出。与普通推挽输出类似,但是该引脚不再作为普通GPIO使用,而是连接到微控制器内部的某个外设上。这种模式适用于需要使用微控制器内部外设(如 UART 或 SPI)的情况。 |
复用开漏输出 (GPIO_Mode_AF_OD) | 在这种模式下,GPIO引脚被配置为复用开漏输出。与普通开漏输出类似,但是该引脚不再作为普通GPIO使用,而是连接到微控制器内部的某个外设上。这种模式适用于需要使用微控制器内部外设(如 I2C 或 CAN),且外设要求使用开漏输出驱动总线的情况。 |
复用功能和重定义功能是两个不同的概念。
复用功能指的是一个GPIO引脚可以被配置为多种不同的功能。例如,一个引脚可以被配置为普通的数字输入/输出,也可以被配置为串行通信接口(如UART或SPI)的一部分。复用功能允许开发人员灵活地选择引脚来实现所需的功能。
重定义功能指的是改变某些外设的默认引脚映射。例如,某些微控制器上的 UART1 接口默认映射到 PA9 和 PA10 引脚上。但是,如果这些引脚已经被用于其他目的,开发人员可以通过重定义功能将 UART1 接口映射到其他引脚上,如 PB6 和 PB7。
总之,复用功能允许开发人员为单个引脚选择多种不同的功能,而重定义功能允许开发人员更改外设的默认引脚映射。
函数 | 功能 |
GPIO_DeInit | 将GPIOx外设的所有寄存器恢复为默认值 |
GPIO_AFIODeInit | 将GPIOx外设的复用功能(重映射与EXTI设置)恢复为默认值 |
GPIO_StructInit | 将GPIO_InitTypeDef结构体的各个成员设置为默认值 |
GPIO_Init | 按照GPIO_InitStruct结构体的变量所配置的参数来初始化GPIOx |
GPIO_ReadInputDataBit | 读取GPIOx端口指定引脚的输入,返回输入端口引脚值 |
GPIO_ReadInputData | 读取GPIOx端口的输入,返回输入端口值 |
GPIO_ReadOutputDataBit | 读取GPIOx端口指定的引脚的输出,返回输出端口引脚值 |
GPIO_ReadOutputData | 读取GPIOx端口的输出,返回输出端口值 |
GPIO_SetBits | 设置GPIOx的数据端口引脚位 |
GPIO_ResetBits | 清除GPIOx的数据端口引脚位 |
GPIO_WriteBit | 设置或清除GPIOx的数据端口引脚位 |
GPIO_Write | 向GPIOx的数据端口写入数据 |
GPIO_PinLockConfig | 锁定GPIOx端口指定引脚的配置寄存器 |
GPIO_EventOutputConfig | 选择GPIOx端口指定引脚用作事件输出 |
GPIO_EventOutputCmd | 使能或失能事件输出 |
GPIO_PinRemapConfig | 改变指定管脚的映射,即重定义某些外设的默认引脚映射 允许将外设从一个引脚重映射到另一个引脚 |
GPIO_EXTILineConfig | 选择GPIOx端口指定引脚用作中断线路 |
GPIO配置过程
(1)打开相应的I/O组时钟源(上电时,所有设备的时钟源都是关闭的,为开发者免去了不知道关闭哪些设备的问题);
(2)设置为相应的模式与设置时钟速度;
(3)设置GPIO对应的设备初始状态。
注意事项
(1)配置RCC之前,建议先调用RCC_DeInit()函数复位RCC设置,否则可能会在调试过程中遇到预期不到的初始化问题。
(2)APB1总线最高频率是36MHz,请注意RCC_PCLK1Config()函数所传递的参数。
(3)GPIO配置为输出方向时,其最大翻转频率的设置语句是不可缺少的。
(4)两个LED为共阴接法,表示使用STM32的GPIO口输出电流来驱动LED。鉴于STM32的GPIO具备不俗的驱动能力,这样做完全是可以的。但仍然建议在允许的情况下尽量使用共阳接法,使用外部电源驱动,这样可以减轻主控芯片的负担。