STM32 GPIO详细介绍
一、GPIO简介
1、GPIO概述
GPIO是通用输入输出接口(General Purpose Input Output)
的简称,主要用于工业现场需要用到数字量输入/输出的场合。
作用:负责采集外部器件的信息或者控制外部器件工作,即
输入输出。
2、GPIO的用途
- 输出功能:继电器、LED、蜂鸣器的控制
- 输入功能:传感器状态、高低电平等信息的读取
- 复用功能:片内外设的对外接口
- 时序模拟:模拟SPI、I2C和UART等常用接口的时序
3、GPIO的基本特性
- 多种工作模式:输出/输入/复用/模拟
- 灵活的复用模式
- 5V电压容限
- 外部中断功能
4、两个重要概念
端口:独立的外设子模块,一个端口包括多个引脚,通过多个硬
件寄存器控制引脚。GPIO模块端口由端口GPIOA、GPIOB、GPIOC等
多个独立的子模块构成,例如:GPIOE包括PE0~PE15这16个引脚。
引脚:对应微控制器的一个管脚,归属于端口,由端口寄存器的
对应位控制。例如PA9对应STM32F407ZET芯片的101脚,属于GPIOA。
5、STM32引脚类型(以STM32F407ZET为例,共144个引脚):
- 电源引脚:以‘V’字母开头的都可认为是电源引脚。
- 晶振引脚:包含‘OSC’且包含‘32’低速晶振,其余高速晶振。
- 复位引脚:含‘NRST’引脚。
- 下载引脚:含串口、SWD、JTAG。
- BOOT引脚:含‘BOOT0’和‘PB2’引脚。
- GPIO引脚:以‘P’开头的,如PE2,PF2,PC2等。
二、GPIO基本结构
1、基本框图
GPIO中寄存器有32位,而端口只有16位,故寄存器只有低16位对应的有端口驱动器用来增加信号的驱动能力寄存器只用于存放数据
2、原理图
3、GPIO工作原理
1.电子器件的作用:
器件名 |
作用 |
输出数据寄存器 |
此寄存器的值会通过输出驱动器输出,其中指定位用于决定使用P-MOS还是N-MOS,有些位表示输出高低电平,如寄存器是4位的,其中0-2位代表输出模式,第3位表示输出电平信号,数字信号1则高电平,数字信号0则低电平 |
P-MOS |
Vgs(电荷)小于一定的值就会导通,利用这个特性和实现推挽与开漏输出 |
N-MOS |
Vgs(电荷)大于一定的值就会导通,利用这个特性和实现推挽与开漏输出 |
保护二极管 |
IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。 当引脚电压高于VDD时,上方的二极管导通;当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁,即只有电流不高于VDD也不低于VSS时才能正常通过 |
TTL肖特基触发器 |
用于将电流信号转化为模拟数字信号0或1,当使用模拟输入时不会通过触发器,模拟输入是指不通过内部转换器,需要外部外接adc进行ad采样转换 |
2.P-MOS与N-MOS的区别
P-MOS是接了VDD(正极电源),所以它拥有输出高电流的能力,所以给P-MOS高电平就可以导通P-MOS管,因为接了电源线的原因一旦导通了就可以让电源线里的工作电压流通,而N-MOS上面接了VSS,若给高电平是无法导通的,因为它没有接电源线是无法输出高电平的,如果给了N-MOS高电平即便流通了因为没有VDD电源线它也无法正常输出电流,若给了低电平则会流向VSS接地处,所以N-MOS只能给低电平才有效,若想N-MOS驱动可以外接上拉电阻。
P-MOS具有输出高电流的能力,给P-MOS高电平可以导通P-MOS管,使电源线中的工作电压流通。
N-MOS无法输出高电平,只能给低电平才有效。想要N-MOS驱动,可以外接上拉电阻。
所以这里输出低电流的话输出到N-MOS晶体管的引脚上,那么始终输出的是接地部分,可以有效降低材料的消耗率。
三、GPIO模式
1、通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式
GPIO的八种模式 |
特点及应用 |
浮空输入 |
输入用,完全浮空,状态不定 |
上拉输入 |
输入用,用内部上拉,默认高电平 |
下拉输入 |
输入用,用内部下拉,默认低电平 |
模拟功能 |
ADC、DAC |
开漏输出 |
软件I2C的SDL、SCL等 |
推挽输出 |
驱动能力强,通用输出 |
开漏式复用功能 |
片上外设功能 |
推挽式复用功能 |
片上外设功能 |
1.输入模式
(1)浮空输入
(2)上拉输入:上拉电阻保证无信号输入时输入端电平为高电平
(3)下拉输入:下拉电阻保证无信号输入时输入端电平为低电平
(4)模拟输入:CPU不能在数据存器上读到数据;采用ADC采集数据。
使用场合:
浮空输入:按键(电平不稳定)
上拉输入:蜂鸣器(信号线在开关未关闭时能够保持高电平稳定工作)
下拉输入:稳定输出的低电平,若达不到GND,需要接下拉电阻
2.输出模式
(1)推挽输出:
• 输出高电平
P-MOS激活
N-MOS关闭
• 输出低电平
N-MOS激活
P-MOS关闭
(2)推挽复用输出:
• 与复用功能输出端相连
• 输出数据寄存器从输出通道断开
(3)开漏输出:
N-MOS激活
P-MOS关闭
(4)开漏复用:
• 与复用功能输出端相连
• 输出数据寄存器从输出通道断开
推挽输出 |
开漏输出 |
|
高电平 |
P-MOS激活 N-MOS断开 3.3V |
P-MOS断开 N-MOS断开 由外部电路决定 |
低电平 |
P-MOS断开 N-MOS激活 0V |
P-MOS断开 N-MOS激活 0V |
优点 |
可以直接输出3.3V |
配合外部电路 更加灵活 |
缺点 |
只能输出3.3V |
高电平实际是高阻态 无法输出电流 |
2、根据控制来源的不同,STM32将两种输出模式又细分为:
- 普通的推挽输出和开漏输出
- 复用的推挽输出和开漏输出
四、GPIO常用寄存器
(1)端口配置低\高寄存器(GPIOx_CRL/GPIOx_CRH)(x=A…E) 端口配置寄存器共16位,但每4位数据表示1位,共需要64位,而STM32中每个寄存器都为32位,因此分为端口配置低寄存器和端口配置高寄存器。通过端口配置寄存器可以配置GPIO工作模式与端口输出速度。
注意:输出速度可以限制输出引脚的最大翻转速度,作用是降低功耗、提高稳定性,一般情况下配置为50MHz。
(2)端口输入数据寄存器(GPIOx_IDR)(x=A…E) 输入数据共16位,但寄存器共32位,因此寄存器高16位为空。
(3)端口输出数据寄存器(GPIOx_ODR)(x=A…E) 输出数据共16位,但寄存器共32位,因此寄存器高16位为空。
(4)端口位设置/清除寄存器(GPIOx_BERR)(x=A…E) 高16位用于位清除,低16位用于位设置。高16位:为0不影响;为1清0;低16为:为0不影响;为1置1。
(5)端口位清除寄存器(GPIOx_BER)(x=A…E) 高16位为空,低16位用于清除,方法同上。
(6)端口位配置锁定寄存器(GPIOx_LCKR)(x=A…E) 高15位为空,低17位用于锁定,较少使用。
五基于HAL库方式控制GPIO
1、GPIO外设的数据类型
1. 引脚初始化数据类型:
/** * @brief GPIO Init结构定义 */
typedef struct
{
uint32_t Pin; //指定要配置的GPIO引脚,该参数可以是GPIO_pins的任意值 */
uint32_t Mode; //指定所选引脚的工作模式。该参数可以是GPIO_mode的值 */
uint32_t Pull; //指定所选引脚的上拉或下拉激活。该参数可以是GPIO_pull的值 */
uint32_t Speed; //指定所选引脚的速度。该参数可以是GPIO_speed_define的值 */
uint32_t Alternate;//外设要连接到所选引脚。参数可以是GPIO_Alternate_function_selection的值
}GPIO_InitTypeDef;
/** * @brief GPIO Init结构定义 */
typedef struct
{
uint32_t Pin; /*指定要配置的GPIO引脚,该参数可以是GPIO_pins的任意值 */
uint32_t Mode; /*指定所选引脚的工作模式。该参数可以是GPIO_mode的值 */
uint32_t Pull; /*指定所选引脚的上拉或下拉激活。该参数可以是GPIO_pull的值 */
uint32_t Speed; /*指定所选引脚的速度。该参数可以是GPIO_speed_define的值 */
uint32_t Alternate;/*外设连接到所选引脚。参数可以是GPIO_Alternate_function_selection的值 */
}GPIO_InitTypeDef;
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOF_CLK_ENABLE(); // GPIO端口时钟使能
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET); //配置GPIO引脚输出电平
GPIO_InitStruct.Pin = GPIO_PIN_9; //对应的IO口
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_InitStruct.Pull = GPIO_PULLUP; //上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //超高速
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); //初始化
}
成员变量PIN的取值范围:
成员变量MODE的取值范围:
成员变量PULL的取值范围:
成员变量SPEED的取值范围:
引脚电平状态数据类型:
端口数据类型:
2、GPIO外设的接口函数
1. 引脚初始化函数:HAL_GPIO_Init()
2. 读取引脚函数,如:HAL_GPIO_ReadPin(GPIOI,GPIO_PIN_4)
3. 写入引脚函数,如HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_SET)
4. 翻转引脚函数:HAL_GPIO_TogglePi(GPIOH,GPIO_PIN_12)
六、其他
1、有源蜂鸣器:内部自带振荡器,频率固定
无源蜂鸣器:不带振荡器,要提供震荡脉冲才能发生,可以发出不同频率的声音
2、推挽输出高低电平都有驱动能力
开漏输出高电平相当于高阻态,没有驱动能力,低电平有驱动能力
作者:阿奇不孤独