发布时间:2023-07-26 11:00
GPIO (general purpose intput output) ,是通用输入输出端口的简称,可以通过软件来控制其输入和输出。STM32 芯片的GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。不过GPIO 最简单的应用还属点亮LED 灯了,只需通过软件控制GPIO 输出高低电平即可。当然GPIO 还可以作为输入控制,比如在引脚上接入一个按键,通过电平的高低判断按键是否按下。
那么是不是所有引脚都是GPIO 呢?当然不是,STM32 引脚可以分为这么几大类:
(1)电源引脚:引脚图中的VDD、VSS、VREF+、VREF-、VSSA、VDDA 等都属于电源引脚。
(2)晶振引脚:引脚图中的PC14、PC15 和OSC_IN、OSC_OUT 都属于晶振引脚,不过它们还可以作为普通引脚使用。
(3)复位引脚:引脚图中的NRST 属于复位引脚,不做其他功能使用。
(4)下载引脚:引脚图中的PA13、PA14、PA15、PB3 和PB4 属于JTAG 或SW 下载引脚。不过它们还可以作为普通引脚或者特殊功能使用,具体的功能可以查看芯片数据手册,里面都会有附加功能说明。当然,STM32 的串口功能引脚也是可以作为下载引脚使用。
(5)BOOT 引脚:引脚图中的BOOT0 和PB2(BOOT1)属于BOOT 引脚,PB2 还可以作为普通管脚使用。在STM32 启动中会有模式选择,其中就是依靠着BOOT0和BOOT1 的电平来决定。
(6)GPIO 引脚:引脚图中的PA、PB、PC、PD 等均属于GPIO 引脚。从引脚图可以看出,GPIO 占用了STM32 芯片大部分的引脚。并且每一个端口都有16 个引脚,比如PA 端口,它有PA0-PA15。其他的PB、PC 等端口是一样的。
GPIO的基本结构
如下图:
从图中可以看出GPIO 内部结构还是比较复杂的,只要将这张GPIO结构图理解好,那么关于GPIO 的各种应用模式将非常清楚。图中最右端I/O 端口就是STM32 芯片的引脚,其它部分都在STM32 芯片内部。上图中我们将每部分都用红线圈起来标号了,按照顺序逐一讲解。
(1)保护二极管
引脚内部加上这两个保护二级管可以防止引脚外部过高或过低的电压输入,当引脚电压高于VDD_FT 或VDD 时,上方的二极管导通吸收这个高电压,当引脚电压低于VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。尽管STM32 芯片内部有这样的保护,但并不意味着STM32 的引脚就无所不能,如果直接将引脚连接大功率器件,比如电机,那么要么电机不转,要么烧坏芯片。如果要驱动一些大功率器件,必须要加大功率及隔离电路驱动。也可以说STM32引脚是用来做控制,而不是做驱动使用的。
(2)上下拉电阻
从图中可以看到,上拉和下拉电阻上都有一个开关,通过配置上下拉电阻开关,可以控制引脚的默认状态电平。当开启上拉时引脚默认电压为高电平,开启下拉时,引脚默认电压为低电平,这样就可以消除引脚不定状态的影响。当然也可以将上拉和下拉的开关都关断,这种状态我们称为浮空模式,一旦配置成这个模式,引脚的电压是不确定的,如果用万用表测量此模式下管脚电压时会发现只有1 点几伏,而且还不时改变,所以一般情况下我们都会给引脚设置成上拉或者下拉模式,使它有一个默认状态。STM32 上下拉及浮空模式的配置是通过GPIOx_CRL 和GPIOx_CRH 寄存器控制的。STM32 内部的上拉其实是一个弱上拉,也就是说通过此上拉电阻输出的电流很小,如果想要输出一个大电流,那么就需要外接上拉电阻了。
(3)P-MOS 和N-MOS 管
GPIO 引脚经过两个保护二极管后就分成两路,上面一路是“输入模式”,下面一路是“输出模式”。
我们先讲输出模式,线路经过一个由P-MOS 和N-MOS管组成的单元电路,这让GPIO 引脚具有了推挽和开漏两种输出模式。所谓推挽输出模式,是根据P-MOS 和N-MOS 管的工作方式命名的。在该结构单元输入一个高电平时,P-MOS 管导通,N-MOS 管截止(可以将P-MOS 当作NPN三极管,N-MOS 当作PNP 三极管来看就非常清楚),对外输出高电平(3.3V)。在该单元输入一个低电平时,P-MOS 管截止,N-MOS 管导通,对外输出低电平(0V)。如果当切换输入高低电平时,两个MOS 管将轮流导通,一个负责灌电流(电流输出到负载),一个负责拉电流(负载电流流向芯片),使其负载能力和开关速度都比普通的方式有很大的提高。
图为推挽输出模式的等效电路:
在开漏输出模式时,不论输入是高电平还是低电平,P-MOS 管总处于关闭状态。当给这个单元电路输入低电平时,N-MOS 管导通,输出即为低电平。当输入高电平时,N-MOS 管截止,这个时候引脚状态既不是高电平,又不是低电平,我们称之为高阻态。如果想让引脚输出高电平,那么引脚必须外接一个上拉电阻,由上拉电阻提供高电平。开漏输出模式等效电路图如图所示。
图为开漏输出等效电路图
在开漏输出模式中还有一个特点,引脚具有**“线与”**关系。就是说如果有很多个开漏输出模式的引脚接在一起,只要有一个引脚为低电平,其他所有管脚都为低,即把所有引脚连接在一起的这条总线拉低了。只有当所有引脚输出高阻态时这条总线的电平才由上拉电阻的VDD 决定。如果VDD 连接的是3.3V,那么引脚输出的就是3.3V,如果VDD 连接的是5V,那么引脚输出的就是5V。因此如果想要让STM32 管脚输出5V,可以选择开漏输出模式,然后在外接上拉电阻的电源VDD 选择5V 即可,前提是这个STM32 引脚是容忍5V 的。开漏输出模式一般应用在I2C、SMBUS 通讯等需要“线与”功能的总线电路中。还可以用在电平不匹配的场合中,就如上面说的输出5V 一样。推挽输出模式一般应用在输出电平为0-3.3V 而且需要高速切换开关状态的场合。除了必须要用开漏输出模式的场合,我们一般选择推挽输出模式。要配置引脚是开漏输出还是推挽输出模式可以使用GPIOx_CRL 和GPIOx_CRH 寄存器。
(4)输出数据寄存器
前面提到的双MOS 管结构电路的输入信号,是由GPIO“输出数据寄存器GPIOx_ODR”提供的,因此我们通过修改输出数据寄存器的值就可以修改GPIO 引脚的输出电平。而“置位/复位寄存器GPIOx_BSRR”可以通过修改输出数据寄存器的值从而影响电路的输出。
(5)复用功能输出
由于STM32 的GPIO 引脚具有第二功能,因此当使用复用功能的时候,也就是通过其他外设复用功能输出信号与GPIO 数据寄存器一起连接到双MOS 管电路的输入,其中梯形结构是用来选择使用复用功能还是普通IO 口功能。例如我们使用USART 串口通讯时,需要用到某个GPIO 引脚作为通讯发送引脚,这个时候就可以把该GPIO 引脚配置成USART 串口复用功能,由串口外设控制该引脚,发送数据。
(6)输入数据寄存器
输入数据寄存器是由IO 口经过上下拉电阻、施密特触发器引入。当信号经过触发器,模拟信号将变为数字信号0 或1,然后存储在输入数据寄存器中,通过读取输入数据寄存器GPIOx_IDR 就可以知道IO 口的电平状态。
(7)复用功能输入
此模式与前面讲解的复用功能输出类似。在复用功能输入模式时,GPIO 引脚的信号传输到STM32 其他片上外设,由该外设读取引脚的状态。同样,如我们使用USART 串口通讯时,需要用到某个GPIO 引脚作为通讯接收引脚,这个时候就可以把该GPIO 引脚配置成USART 串口复用功能,使USART 可以通过该通讯引脚的接收远端数据。
(8)模拟输入输出
当GPIO 引脚用于ADC 采集电压的输入通道时,用作“模拟输入”功能,此时信号是不经过施密特触发器的,因为经过施密特触发器后信号只有0、1 两种状态,ADC 外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。类似地,当GPIO 引脚用于DAC 作为模拟电压输出通道时,此时作为“模拟输出”功能, DAC 的模拟信号输出就不经过双MOS 管结构了,模拟信号直接
通过管脚输出。
通过GPIO 内部的结构关系,决定了GPIO 可以配置成以下几种模式。
(1)输入模式(模拟、上拉、下拉、浮空)
在输入模式时,施密特触发器打开,输出被禁止。可通过输入数据寄存器GPIOx_IDR 读取I/O 状态。输入模式可以配置为模拟、上拉、下拉以及浮空模式。上拉和下拉输入很好理解,默认的电平由上拉或者下拉决定。浮空输入的电平是不确定的,完全由外部的输入决定,一般接按键的时候可以使用这个模式。模拟输入则用于ADC 采集。
(2)输出模式(推挽/开漏)
在输出模式中,推挽模式时双MOS 管以推挽方式工作,输出数据寄存器GPIOx_ODR 可控制I/O 输出高低电平。开漏模式时,只有N-MOS 管工作,输出数据寄存器可控制I/O 输出高阻态或低电平。输出速度可配置, 有2MHz\25MHz\50MHz 的选项。此处的输出速度即I/O 支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求不严格,把速度设置成最大即可。在输出模式时,施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR 可读取I/O 的实际状态。
(3)复用功能(推挽/开漏)
复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出信号源于其它外设,输出数据寄存器GPIOx_ODR 无效;输入可用,通过输入数据寄存器可获取I/O 实际状态,但一般直接用外设的寄存器来获取该
数据信号。
(4)模拟输入输出(上下拉无影响)
模拟输入输出模式中,双MOS 管结构被关闭,施密特触发器停用,上/下拉也被禁止。其它外设通过模拟通道进行输入输出。通过对GPIO 寄存器写入不同的参数,就可以改变GPIO 的应用模式,再强调一下,要了解具体寄存器时一定要查阅《STM32F1xx 参考手册》中对应外设的寄存器说明。在GPIO 外设中,通过设置“端口配置寄存器GPIOx_CRL 和GPIOx_CRH”可配置GPIO 的工作模式和输出速度。CRH 控制端口的高八位,CRL 控制端口的低八位。