STM32 GPIO详细解读

STM32 GPIO介绍

基本介绍GPIO(General Purpose Input Output)通用输入输出口

  • GPIO(General Purpose Input Output)通用输入输出口

  • 可配置为8种输入输出模式

  • 引脚电平:0V~3.3V,部分引脚可容忍5V

  • 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等

  • 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

    在这里插入图片描述

    每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。
    根据数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。

    8种输出模式详解

    浮空输入 GPIO_Mode_IN_FLOATING = 0x04, 输入用,完全浮空,状态不定。

    ​ 上下拉电阻关闭,施密特触发器打开,模拟输入关闭,双MOS管不导通。空闲时 (高阻态),IO状态不稳定,由外部环境决定。

    在这里插入图片描述

    浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。也就是说,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的,通常用于IICUSART等总线设备上。

    应用场景:接收外部信号的状态,如按键输入、传感器输入等。

    上拉输入 GPIO_Mode_IPU = 0x48, 输入用,用内部上拉,默认为高电平。

    ​ 使用上拉电阻,下拉电阻关闭,施密特触发器打开,模拟输入关闭,MOS管不导 通。空闲时,IO呈现高电平。

在这里插入图片描述

STM32的内部上拉是"弱上拉",即通过此上拉输出的电流是很弱的,如要求大电流还是需要外部上拉。

上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平保持在高电平(并且在I/O端口输入为低电平的时候,输入端的电平也是低电平)。

应用场景:检测外部信号为低电平时,例如按键按下。

下拉输入 GPIO_Mode_IPD = 0x28, 输入用,用内部下拉,默认为低电平。

​ 使用下拉电阻,上拉电阻关闭,施密特触发器打开,模拟输入关闭,MOS管不导 通。空闲时,IO呈现低电平。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平保持在低电平;并且在I/O端口输入为高电平的时候,输入端的电平也是高电平。

应用场景:检测外部信号为高电平时,例如按键抬起。

模拟输入 GPIO_Mode_AIN = 0x0, ADC/DAC

​ 上下拉电阻关闭,施密特触发器关闭,模拟输入打开,双MOS管不导通。专门用于 模拟信号输入。
在这里插入图片描述

模拟输入模式下,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,比如ADC模块等。

应用场景:测量传感器信号、音频输入等模拟信号的变化。

开漏输出 GPIO_Mode_Out_OD = 0x14, 软件IIC的SDL,SCL等。

​ 上下拉电阻关闭,施密特触发器打开,PMOS管关闭,在ODR对应位写0时, NMOS管导通,输出低电平,写1时不导通,不导通时为高阻态。不能输出高电 平,必须有外部上拉电阻才能输出高电平。
在这里插入图片描述

开漏输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,控制MOS管的导通。该模式下PMOS是断开的,不用看。这里要注意N-MOS管,当设置输出的值为高电平的时候,N-MOS管处于关闭状态(因为在输出和NMOS管的gate这中存在一个反相器,因此gate的电压是低电平),此时I/O端口的电平就不会由输出的高低电平决定,而是由I/O端口外部的上拉或者下拉决定;当设置输出的值为低电平的时候,N-MOS管处于开启状态,此时I/O端口的电平就是低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,I/O端口的电平不一定是输出的电平。通常使用开漏输出时外部要加一个上拉电阻。
应用场景:与外部器件连接时,如I2C总线,用于与其他设备进行通信。

开漏复用输出 GPIO_Mode_AF_OD = 0x1C, 片上外设(软件IIC的SDL,SCL等)

​ 上下拉电阻关闭,施密特触发器打开,PMOS管关闭,在外设复用输出写0时, NMOS管导通,写1时不导通,不导通时为高阻态。不能输出高电平,必须有外部 上拉电阻才能输出高电平。

在这里插入图片描述

开漏复用输出模式,与开漏输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。

应用场景:连接到外设的特殊功能引脚,如I2C总线通信引脚、故障信号输出等。

推挽输出 GPIO_Mode_Out_PP = 0x10, 驱动能力强,25mA(MAX),通用输出。

​ 上下拉电阻关闭,施密特触发器打开,ODR对应位写0时,NMOS管导通,输出低 电平,写1则PMOS管导通,输出高电平。可输出高低电平,驱动能力强。
在这里插入图片描述

推挽输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,控制P-MOS管和N-MOS管的导通来控制IO口输出高电平还是低电平。这里要注意P-MOS管和N-MOS管,当设置输出的值为1的时候,P-MOS管处于开启状态,N-MOS管处于关闭状态,此时I/O端口的电平就由P-MOS管决定为高电平;当设置输出的值为0的时候,P-MOS管处于关闭状态,N-MOS管处于开启状态,此时I/O端口的电平就由N-MOS管决定为低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,此时I/O端口的电平一定是输出的电平。

应用场景:用于驱动外部电路,如控制LED灯、驱动其他逻辑电路等。

推挽复用输出 GPIO_Mode_AF_PP = 0x18, 片上外设(SPI的SCK,MISO,MOSI等)

​ 上下拉电阻关闭,施密特触发器打开,外设复用功能写0时,NMOS管导通,输出 低电平,写1则PMOS管导通,输出高电平。可输出高低电平,驱动能力强。
在这里插入图片描述

推挽复用输出模式,与推挽输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。

应用场景:连接到外设的特殊功能引脚,如UART串口通信引脚、PWM输出等。

复用功能输出:复用功能输出中的复用是指STM32的其他片上外设对GPIO引脚进行控制,此时GPIO引脚用作该外设功能的一部分,算是第二用途。从其他外设引出来的复用功能输出信号与GPIO本身的数据寄存器都连接到双MOS管结构的输入中。

总结

模式名称性质特征
浮空输入数字输入可读取引脚电平,若引脚悬空,则电平不确定
上拉输入数字输入可读取引脚电平,内部连接上拉电阻,悬空时默认高电平
下拉输入数字输入可读取引脚电平,内部连接下拉电阻,悬空时默认低电平
模拟输入模拟输入GPIO无效,引脚直接接入内部ADC
开漏输出数字输出可输出引脚电平,高电平为高阻态,低电平接VSS
推挽输出数字输出可输出引脚电平,高电平接VDD,低电平接VSS
复用开漏输出数字输出由片上外设控制,高电平为高阻态,低电平接VSS
复用推挽输出数字输出由片上外设控制,高电平接VDD,低电平接VSS

STM32中GPIO的配置

在固件库开发中,操作寄存器 CRH 和 CRL 来配置 IO 口的模式和速度是通过 GPIO 初始化函数完成:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)/*第一个参数是用来指定 GPIO,取值范围为 GPIOA~GPIOG。
 *第二个参数为初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef
 */
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-- PB.5 端口配置

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz

GPIO_Init(GPIOB, GPIO_InitStructure);//根据设定参数配置 GPIO

结构体的Speed如下:

typedef enum

{

GPIO_Speed_10MHz,

GPIO_Speed_2MHz,

GPIO_Speed_50MHz

}GPIOSpeed_TypeDef;

8种模式如下:

typedef enum

{ GPIO_Mode_AIN = 0x0, //模拟输入

GPIO_Mode_IN_FLOATING = 0x04, //浮空输入

GPIO_Mode_IPD = 0x28, //下拉输入

GPIO_Mode_IPU = 0x48, //上拉输入

GPIO_Mode_Out_OD = 0x14, //开漏输出

GPIO_Mode_Out_PP = 0x10, //通用推挽输出

GPIO_Mode_AF_OD = 0x1C, //复用开漏输出

GPIO_Mode_AF_PP = 0x18 //复用推挽

}GPIOMode_TypeDef;

原文链接:https://blog.csdn.net/qq_45172832/article/details/126139330

原文链接:https://blog.csdn.net/u010249597/article/details/134780467

原文链接:https://blog.csdn.net/qq_45172832/article/details/126139330

原文链接:https://blog.csdn.net/u010249597/article/details/134780467

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32串口通信是通过UART(通用异步收发器)或USART(通用同步异步收发器)实现的。在配置串口连接时,需要注意以下几个方面: 1. 通信接口背景知识:串行通信按照数据传送方向可以分为两种方式。在串口通信中,设备的发送端(TXD)需要连接另一个设备的接收端(RXD),同时需要共地才能实现通信。\[2\] 2. 定义参数:在STM32串口通信中,需要定义起始位、数据位(8位或9位)、奇偶校验位(第9位)、停止位(1, 1.5, 2位)和波特率等参数。常用的串口相关寄存器包括USART_SR状态寄存器(存储通信过程中的标志)、USART_DR数据寄存器(包含发送或接收的数据)和USART_BRR波特率寄存器(用于设置波特率整数和小数部分)。\[2\] 3. 配置步骤:以USART串口为例,一般的串口配置步骤包括: a. 使能串口和GPIO时钟:需要打开相应的GPIO和USART的时钟,例如使能USART1和GPIOA的时钟。 b. 配置GPIO引脚:将USART的引脚复用为串口功能,例如将USART1的引脚PA9和PA10复用为串口功能。 c. 配置串口参数:设置起始位、数据位、奇偶校验位、停止位和波特率等参数。 d. 使能串口中断(可选):如果需要使用中断接收数据,需要使能串口的中断功能。 e. 启用串口:使能串口的发送和接收功能。\[3\] 以上是关于STM32串口连接的详细解读。 #### 引用[.reference_title] - *1* [电赛备赛日记(一):K210与STM32串口通信](https://blog.csdn.net/qq_54152756/article/details/129844665)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [stm32串口通讯配置详细解析(含驱动程序源码库函数版本)](https://blog.csdn.net/luozhizhong6666/article/details/104498085)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值