文章目录
目录
一、GPIO简介
GPIO就是通用I/O(输入/输出)端口,简单来说就是STM32 可控制的引脚,STM32 芯片的GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32 芯片的GPIO被分成很多组,每组有 16 个引脚,如型号为 STM32F103ZET6 型号的芯片有 GPIOA、GPIOB、GPIOC 至GPIOG 共7 组GPIO,芯片一共144 个引脚,其中GPIO 就占了一大部分,所有的GPIO引脚都有基本的输入输出功能。
最基本的输出功能是由 STM32 控制引脚输出高、低电平,实现开关控制,如把 GPIO 引脚接入到LED 灯,那就可以控制LED 灯的亮灭,引脚接入到继电器或三极管,那就可以通过继电器或
三极管控制外部大功率电路的通断。
最基本的输入功能是检测外部输入电平,如把GPIO 引脚连接到按键,通过电平高低区分按键是否被按下。
二、GPIO工作模式
1.四种输入模式
GPIO_Mode_IN_FLOATING—输入浮空
GPIO_Mode_IPU—输入上拉
GPIO_Mode_IPD —输入下拉
GPIO_Mode_AIN—模拟输入
2.四种输出模式
GPIO_Mode_Out_OD—开漏输出
GPIO_Mode_Out_PP—推挽式输出
GPIO_Mode_AF_PP —推挽式复用功能
GPIO_Mode_AF_OD—开漏复用功能
三、GPIO工作模式及解析
1. I/O端口的基本结构框图
通过 GPIO 硬件结构框图,就可以从整体上深入了解 GPIO 外设及它的各种应用模式。该图从最右端看起,最右端就是代表STM32 芯片引出的 GPIO 引脚,其余部件都位于芯片内部。
2.基本结构分析
1.保护二极管
引脚的两个保护二级管可以防止引脚外部过高或过低的电压输入,当引脚电压高于 VDD 时,上方的二极管导通,当引脚电压低于VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。
2.P-MOS管和N-MOS管
作用:使得GPIO具有“推挽输出”和“开漏输出”的模式。P-MOS管:高电平导通,低电平关闭。 N-MOS管:低电平导通,高电平关闭。
在推挽输出模式时该结构中输入高电平时,上方的P-MOS 导通,下方的N-MOS 关闭,对外输出高电平;而在该结构中输入低电平时,N-MOS 管导通,P-MOS 关闭,对外输出低电平。
在开漏输出模式时,上方的P-MOS 管完全不工作。如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS 管导通,使输出接地,若控制输出为 1 (它无法直接输出高电平) 时,则 P-MOS管和 N-MOS 管都关闭,所以引脚既不输出高电平,也不输出低电平,为高阻态。为正常使用时必须外部接上拉电阻。
推挽输出模式一般应用在输出电平为 0 和 3.3 伏而且需要高速切换开关状态的场合。在 STM32的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。
开漏输出一般应用在I2C、SMBUS 通讯等需要“线与”功能的总线电路中。除此之外,还用在电平不匹配的场合,如需要输出 5 伏的高电平,就可以在外部接一个上拉电阻,上拉电源为 5 伏,并且把GPIO 设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出5 伏的电平。如下图。
3.GPIO工作模式解析
1. 输入模式
在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器GPIOx_IDR 读取I/O 状态。其中输入模式,可设置为上拉、下拉、浮空和模拟输入四种。上拉和下拉输入很好理解,默
认的电平由上拉或者下拉决定。浮空输入的电平是不确定的,完全由外部的输入决定,一般接按
键的时候用的是这个模式。模拟输入则用于ADC 采集。
1.1 浮空输入模式
浮空输入模式下,I/O端口的电平信号直接进入到输入数据寄存器。
MCU直接读取I/O口电平,I/O的电平状态是不确定的,完全由外部输入决定。即io口接高电平时读取高电平,接低电平时读取低电平。默认状态时,电平不确定。
1.2上拉输入模式
上拉输入模式下, I/O端口的电平信号经过上拉电阻进入到输入数据寄存器。即io口接高电平时读取高电平,接低电平时读取低电平。默认状态时,电平为高电平。
1.3下拉输入模式
下拉输入模式下, I/O端口的电平信号经过下拉电阻进入到输入数据寄存器。即io口接高电平时读取高电平,接低电平时读取低电平。默认状态时,电平为低电平。
1.4模拟输入模式
模拟输入模式下, I/O端口的电平信号不经过TTL肖特基触发器,直接进入ADC模块,并且输入数据寄存器为空 ,MCU不能在输入数据寄存器上读到引脚状态。在模拟输入模式下,上拉电阻和下拉电阻是不起作用的,即使配置上拉和下拉模式,也不会有作用。
2.输出模式
在输出模式中,推挽模式时双MOS 管以轮流方式工作,输出数据寄存器GPIOx_ODR 可控制I/O输出高低电平。开漏模式时,只有 N-MOS 管工作,输出数据寄存器可控制 I/O 输出高阻态或低
电平。输出速度可配置,有2MHz,10MHz,50MHz 的选项。此处的输出速度即I/O 支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求不严格,把速度设置成最大即可。在输出模式时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR 可读取I/O的实际状态。
2.1 开漏输出模式
开漏模式时,P-MOS管不工作,只有N-MOS管工作,输出数据寄存器可控制 I/O 输出低电平。低电平的时候,N-MOS管导通,I/O引脚输出低电平。高电平的时候,N-MOS管关闭,I/O引脚悬空状态。
2.2 推挽输出模式
推挽输出模式下, P-MOS管和N-MOS管都工作,输出数据寄存器可以控制输出高电平和低电平。输出数据寄存器输出为 0 的时候,N-MOS管导通,I/O引脚输出低电平。输出数据寄存器输出为 1 的时候,P-MOS管导通,I/O引脚输出高电平。
2.3 复用开漏输出模式
复用开漏输出模式下, GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效, 输出的高低电平的来源于其它外设。
2.4 复用推挽输出模式
复用推挽输出模式下, GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效, 输出的高低电平的来源于其它外设。
总结
最后总结下使用情况:
在 STM32 中选用 IO 模式
(1) 浮空输入_IN_FLOATING ——浮空输入,可以做 KEY 识别,RX1
(2)带上拉输入_IPU——IO 内部上拉电阻输入
(3)带下拉输入_IPD—— IO 内部下拉电阻输入
(4) 模拟输入_AIN ——应用 ADC 模拟输入,或者低功耗下省电
(5)开漏输出_OUT_OD ——IO 输出 0 接 GND,IO 输出 1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为 1 时,IO 口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样 IO 口也就可以由外部电路改变为低电平或不变。可以读 IO 输入电平变化,实现 C51 的 IO 双向功能
(6)推挽输出_OUT_PP ——IO 输出 0-接 GND, IO 输出 1 -接 VCC,读输入值是未知的
(7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C 的 SCL,SDA)
(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
通常有 5 种方式使用某个引脚功能,它们的配置方式如下:
1)作为普通 GPIO 输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能
该引脚对应的所有复用功能模块。
2)作为普通 GPIO 输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复
用功能模块。
3)作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。
4)作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引
脚对应的某个复用功能模块。
5)作为内置外设的输出:根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块