GPIO 简介
GPIO=General Purpose Input Output,通用输入输出。简称为“IO口”。
GPIO 是通用输入输出端口的简称,STM32 可控制的引脚,STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32 芯片的 GPIO被分成很多组,每组有 16 个引脚,如型号为 STM32F4IGT6 型号的芯片有 GPIOA、GPIOB、GPIOC至 GPIOI 共 9 组 GPIO,芯片一共 176 个引脚,其中 GPIO 就占了一大部分,所有的 GPIO 引脚都有基本的输入输出功能。
最基本的输出功能是由 STM32 控制引脚输出高、低电平,实现开关控制,GPIO口是怎么被控制的呢?通过软件代码。需要亮灯的时候调用GPIO口拉高的函数,需要熄灯的时候调用GPIO拉低的函数,即可实现控制。如把 GPIO 引脚接入到 LED 灯,那就可以控制 LED 灯的亮灭。最基本的输入功能是检测外部输入电平,如把 GPIO 引脚连接到按键,通过电平高低区分按键是否被按下。
GPIO除了简单的输入输出之外,还可以做一些相对复杂的操作,例如模拟I2C或SPI数据线、ADC电压检测、输出PWM波形等。
GPIO框图
保护二极管及上、下拉电阻
通过上、下拉对应的开关配置,我们可以控制引脚默认状态的电压,开启上拉的时候引脚电压为高电平,开启下拉的时候引脚电压为低电平,这样可以消除引脚不定状态的影响。如引脚外部没有外接器件,或者外部的器件不干扰该引脚电压时,STM32 的引脚都会有这个默认状态。也可以设置“既不上拉也不下拉模式”,我们也把这种状态称为浮空模式,配置成这个模式时,直接用电压表测量其引脚电压为 1 点几伏,这是个不确定值。所以一般来说我们都会选择给引脚设置“上拉模式”或“下拉模式”使它有默认状态。
STM32 的内部上拉是“弱上拉”,即通过此上拉输出的电流是很弱的,如要求大电流还是需要外
部上拉。通过“上拉/下拉寄存器 GPIOx_PUPDR”控制引脚的上、下拉以及浮空模式。
用于输入模式时,可设置为上拉、下拉或浮空模式
P-MOS 管和 N-MOS 管
输出模式部分,线路经过一个由 P-MOS 和 N-MOS 管组成的单元电路。这个结构使 GPIO 具有了“推挽输出”和“开漏输出”两种模式。
推挽输出模式,是根据这两个 MOS 管的工作方式来命名的。输入高电平时,上方的 P-MOS 导通,下方的 N-MOS 关闭,对外输出高电平,输入低电平时反之。
推挽输出的低电平为0 伏,高电平为3.3 伏,它是推挽输出模式时的等效电路。
通过“输出类型寄存器 GPIOx_OTYPER 可以控制 GPIO 端口是推挽模式还是开漏模式。
输出数据寄存器
置位/复位寄存器GPIOx_BSRR可以通过修改输出数据寄存器的值从而影响电路的输出。
复用功能输出
使用 USART 串口通讯时,需要用到某个 GPIO 引脚作为通讯发送引脚,这个时候就可以把该 GPIO 引脚配置成 USART 串口复用功能,由串口外设控制该引脚,发送数据。
输入数据寄存器
连接到施密特触发器,信号经过触发器后,模拟信号转化为 0、1 的数字信号,然后存储在“输入数据寄存器GPIOx_IDR”中,通过读取该寄存器就可以了解 GPIO 引脚的电平状态。
复用功能输入
和复用功能输出一致,发送变接收。
模拟输入输出
当 GPIO 引脚用于 ADC 采集电压的输入通道时,用作“模拟输入”功能,此时信号是不经过施密特触发器的,因为经过施密特触发器后信号只有 0、1 两种状态,所以 ADC 外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。反之作为模拟输出,当 GPIO 用于模拟功能时 (包括输入输出),引脚的上、下拉电阻是不起作用的,即使在寄存器配置了上拉或下拉模式,也不会影响到模拟信号的输入输出。
正点原子F429原理图
图中PB0和PB1就是控制正点原子板子上两个LED灯的IO口。