STM32 GPIO引脚基础介绍与使用详解

1、GPIO简介

        GPIO是通用输入输出端口(General-purpose input/output)的英文简写。STM32的GPIO端口有四种输入模式和四种输出模式。输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等;输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等。

        I/O 端口的每个位均可自由编程,但必须按照 32 位,即以字为单位访问(不允许半字或字节访问) I/O 端口寄存器。 每个 GPIO 引脚都可以由软件配置成输出(推挽或开漏)、输入(浮空输入、上拉输入或下拉输入)或其它的外设功能端口。多数 GPIO 引脚都与数字或模拟的外设共用。 I/O 引脚的外设功能可以按需锁定,以避免意外的写入 I/O 寄存器。 所有的 GPIO 引脚都有大电流通过能力。

2、GPIO基本结构

        这是GPIO的硬件结构框图,可以从这个框图中清晰的了解GPIO外设极其各种应用模式,最右端的I/O引脚就是STM32芯片引出的GPIO引脚,其它的部件都位于芯片内部。

关键器件解析:

1、保护二极管:防止I/O引脚外部过高、过低的电压输入,当引脚电压高于VDD时,上方的二极管导通;当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。

2、TTL肖特基触发器:将模拟信号转化为0和1的数字信号,但当GPIO作为ADC采集电压通道时,此时信号不再经过触发器进行TTL电平转换。

3、P-MOS、N-MOS:单元电路使得GPIO具有“推挽输出”和“开漏输出”的功能。

3、GPIO工作模式

        GPIO一共有8中工作模式。分别是浮空输入、上拉输入、下拉输入、模拟输入、开漏输出、推挽输出、开漏复用输出、推挽复用输出。

3.1 浮空输入模式

        在浮空输入模式下,I/O端口的电平信号有外部输入决定,当I/O端口悬空(在无信号输入)的情况下,引脚的电平状态不确定。浮空输入模式通常用于配置USART的RX引脚。

3.2 上拉输入模式

        在上拉输入模式下,I/O端口悬空(在无信号输入)的情况下,电平状态保持在高电平,当输入低电平时,电平状态是低电平。

3.3 下拉输入模式

        在下拉输入模式下,I/O端口悬空(在无信号输入)的情况下,电平状态保持在低电平,当输入高电平时,电平状态是高电平。

3.4 模拟输入模式

        在模拟输入模式下,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,比如ADC模块等。模拟输入通常应用于ADC模拟输入,或者低功耗下省电等情景。

 3.5 开漏输出模式

        在开漏输出模式下,位设置/清除寄存器写入的值会被映射到输出数据寄存器,到输出控制电路,途径N-MOS管,最终输出到I/O引脚。开漏输出只可以输出强低电平,高电平得靠外部电阻拉高,输出端相当于三极管的集电极,适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。

        需要注意N-MOS管的特性,当设置输出的电平状态为高电平时,N-MOS管处于关闭状态,此时I/O端口的电平就不会由输出的高低电平决定,而是由I/O端口内部或者外部的上拉或者下拉决定;当设置输出的电平状态为低电平时,则N-MOS管处于开启状态,此时I/O端口的电平就是低电平。输出的电平信号可以被输入数据寄存器读取。

3.6 推挽输出模式

        推挽输出模式和开漏输出模式有一定的区别,其控制输出的寄存器是一样的。输出控制电路输出1的时候,P-MOS管导通,N-MOS管截止,这样I/O口电平就会被P-MOS管拉高,输出强高电平;相反,当输出控制电路输出0时,P-MOS管截止,N-MOS管导通,I/O端口电平被N-MOS管拉低,输出强低电平。同样,输出的电平信号可以被输入数据寄存器读取。

        需要注意P-MOS管和N-MOS管的特性,当设置输出的电平状态为高电平时,P-MOS管处于开启状态,N-MOS管处于关闭状态,此时I/O端口的电平就由P-MOS管决定:高电平;当设置输出的电平状态为低电平时,P-MOS管处于关闭状态,N-MOS管处于开启状态,此时I/O端口的电平就由N-MOS管决定:低电平。

3.7 开漏复用输出模式

        开漏复用输出模式的原理和开漏输出模式的原理基本一致,只不过输出的高低电平不是由MCU配置位设置/清除寄存器或者输出数据寄存器的值决定,而是利用片上外设模块的复用功能输出来决定的(通信接口(SPI,UART,I 2 C,USB,CAN,LCD等)、定时器、调试接口等复用)。开漏复用输出模式通常用于TX1、MOSI、MISO等引脚的配置。

3.8 推挽复用输出模式

        推挽复用输出模式的原理和推挽输出模式的原理基本一致,只不过输出的高低电平不是由MCU配置位设置/清除寄存器或者输出数据寄存器的值决定,而是利用片上外设模块的复用功能输出来决定的(通信接口(SPI,UART,I2 C,USB,CAN,LCD等)、定时器、调试接口等复用)。推挽复用输出模式通常用于I2C的SCL、SDA引脚的配置。

 3.9 注意事项

        推挽输出可以输出强高低电平(高电平为3.3V),一般用来连接数字器件。在STM32的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。

        开漏输出只可输出强低电平,高电平需要靠外部电阻拉高。输出端相当于三极管的集电极;要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。开漏输出一般应用在I2C、SMBUS通讯等需要“线与”功能的总线电路中。除此之外,还用在电平不匹配的场合,如需要输出5伏的高电平,就可以在外部接一个上拉电阻,上拉电源为5伏,并且把GPIO设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出5伏电平。

4、GPIO相关寄存器

        每个 GPIO 端口有两个 32 位配置寄存器( GPIOx_CRL, GPIOx_CRH)、两个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR)、一个 32 位置位/复位寄存器(GPIOx_BSRR)、一个 16 位复位寄存器(GPIOx_BRR) 、 一 个 32 位 锁 定 寄 存 器 ( GPIOx_LCKR)。

4.1 端口x配置低寄存器(GPIOx_CRL)(x = A…E)

 4.2 端口x配置高寄存器(GPIOx_CRH)(x = A…E)

4.3 端口x输入数据寄存器(GPIOx_IDR)(x = A…E) 

 4.4 端口x输出数据寄存器(GPIOx_ODR)(x = A…E)

 4.5 端口x置位/复位寄存器(GPIOx_BSRR)(x = A…E)

 4.6 端口x复位寄存器(GPIOx_BRR)(x = A…E)

 4.7 端口x配置锁定寄存器(GPIOx_LCKR)(x = A…E)

 5、GPIO库函数

 5.1 函数GPIO_DeInit

5.2 函数AFIODeInit

5.3 函数GPIO_Init

//    GPIO_InitTypeDef定义于文件“stm32f10x_gpio.h”
typedef struct
{
    u16 GPIO_Pin;
    GPIOSpeed_TypeDef GPIO_Speed;
    GPIOMode_TypeDef  GPIO_Mode;
} GPIO_InitTypeDef

         GPIO_Pin选择待设置的GPIO管脚,使用操作符”|“可以一次选中多个管脚,可以使用下表中的任意组合。

        GPIO_Speed用于设置选中管脚的速率。下表给出了该参数可取的值。

        GPIO_Mode用于设置选中管脚的工作状态。下表给出了该参数可取的值。

5.4 函数GPIO_StructInit

 GPIO_InitStruct缺省值

 5.5 函数GPIO_ReadInputDataBit

 5.6 函数GPIO_ReadInputData

 5.7 函数GPIO_ReadOutputDataBit

5.8 函数GPIO_ReadOutputData

5.9 函数GPIO_SetBits

 5.10 函数GPIO_ResetBits

5.11 函数GPIO_ WriteBit

 5.12 函数GPIO_Write

 5.13 函数GPIO_PinLockConfig

 5.14 函数GPIO_EventOutputConfig

 GPIO_PortSource值

 5.15 函数GPIO_EventOutputCmd

 5.16 函数GPIO_PinRemapConfig

        GPIO_Remap用以选择用作事件输出的GPIO端口。下表给出了该参数可取的值。

 5.17 函数GPIO_EXTILineConfig

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 GPIO引脚基础介绍与使用详解

发表评论