GPIO的8种工作模式详细介绍!

本文详细介绍了STM32微控制器中GPIO的各种工作模式,包括4种输入模式和4种输出模式。输入模式涵盖了浮空输入、模拟输入及带上下拉输入;输出模式则涉及推挽输出、开漏输出及其复用功能。文章通过定义和应用场景解释了每种模式的特点。

我们在用STM32这颗MCU的时候,用的最多的也是最基础的应该就是GPIO外设了,而在STM32的HAL库中GPIO有8种工作模式

4种输入状态,4种输出状态(2种复用输出2种普通输出),分别对应如下:

如图1所示,浮空输入模式

#define GPIO_MODE_INPUT 0x00000000U / *!<输入浮动模式* /

当GPIO采用浮空输入模式时,STM32的引脚状态是不确定的,此时STM32得到的电平状态完全取决于GPIO外部的电平状态,所以说在GPIO外部的引脚悬空时,读取该端口的电平状态是个不确定的值。

2,模拟输入模式

#define GPIO_MODE_ANALOG 0x00000003U / *!<模拟模式* /

这个很好理解,最常用的场合是ADC模拟输入,不像其他输入模式只有0和1,模拟输入模式可以读取到很细微变化的值。

3,带上拉,下拉输入模式

#define GPIO_MODE_IT_RISING 0x10110000U / *!<具有上升沿触发检测的外部中断模式* /

#define GPIO_MODE_IT_FALLING 0x10210000U / *!<具有下降沿触发检测的外部中断模式* /

#define GPIO_MODE_IT_RISING_FALLING 0x10310000U / *!<具有上升沿/下降沿触发检测的外部中断模式* /

我查到STM32的数据手册中关于上下拉的电阻的介绍是电阻阻值都在30-50K之间。

为什么要用带上拉或者下拉输入的模式呢?因为浮空模式时,在GPIO外部连接的电路未工作时,STM32读取的GPIO状态是不确定的,所以可以采用带上拉或者下拉输入的模式先给MCU一个确定的状态,当外部电路电平状态发生变化时,易于MCU的判断。这样可以增强MCU的抗干扰能力

 

下面开始介绍输出模式:

4,推挽输出模式

#define GPIO_MODE_OUTPUT_PP 0x00000001U / *!<输出推拉模式* /

推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。这种结构既可以输出高电平,,也可以输出低电平,可以用于连接数字器件。

推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小,效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。

5,开漏输出模式

#define GPIO_MODE_OUTPUT_OD 0x00000011U / *!<输出开漏模式* /

我们重点讲开漏输出,一般开漏输出模式时,如果外部不接上拉电阻时,只能输出低电平,所以要想输出高电平必须要外接上拉电阻。这样做的有一个好处,可以用来匹配不同的电平信号,也就是用于不同电压的系统之间的通信;另外,因为要输出高电平需要有外部的上拉电阻,所以在进行通信时,通信的速度也受到上拉电阻阻值的影响,阻值小时,通信速度可以很快,阻值大时,通信速度变慢,但也不能为了通信速度把上拉电阻用的很小,也要注意在电阻很小时,功耗会变大,所以要平衡好这个度。

如图6所示,复用推挽,开漏输出模式

#define GPIO_MODE_AF_PP 0x00000002U / *!<备用功能推拉模式* /

#define GPIO_MODE_AF_OD 0x00000012U / *!<Alternate Function Open Drain Mode * /

这两种模式,可以理解为把GPIO配置为第二功能使用的时候的配置,并非单纯的用作IO输入或输出。

比如使用外设IIC时,我们需要把GPIO配置为复用推挽输出,用于数据通信功能。

再比如串口通信的TX,以及SPI外设的GPIO使用就要把引脚设置为复用开漏输出。

 

### GPIO 8工作模式的结构图解析 GPIO(General Purpose Input/Output)是微控制器中非常重要的外设,其八种工作模式涵盖了输入和输出的不同配置方式。以下是关于GPIO八种工作模式的结构图解析: #### 输入模式 1. **浮空输入 (GPIO_Mode_IN_FLOATING)** 浮空输入模式下,引脚没有内部上拉或下拉电阻,状态由外部电路决定[^2]。这种模式适用于不需要默认电平的场景。 2. **上拉输入 (GPIO_Mode_IPU)** 在上拉输入模式下,内部上拉电阻启用,确保在无外部信号时引脚处于高电平状态[^2]。 3. **下拉输入 (GPIO_Mode_IPD)** 下拉输入模式下,内部下拉电阻启用,确保在无外部信号时引脚处于低电平状态[^2]。 4. **模拟输入 (GPIO_Mode_AIN)** 模拟输入模式用于连接模数转换器(ADC),允许读取模拟信号[^1]。 #### 输出模式 5. **开漏输出 (GPIO_Mode_Out_OD)** 开漏输出模式下,输出引脚仅能驱动低电平,需要外部上拉电阻来实现高电平[^1]。 6. **推挽输出 (GPIO_Mode_Out_PP)** 推挽输出模式可以主动驱动高电平和低电平,适用于大多数数字信号输出场景[^1]。 #### 复用模式 7. **复用开漏输出 (GPIO_Mode_AF_OD)** 复用开漏输出模式GPIO引脚配置为复用功能,并以开漏形式工作[^1]。 8. **复用推挽输出 (GPIO_Mode_AF_PP)** 复用推挽输出模式GPIO引脚配置为复用功能,并以推挽形式工作[^1]。 #### 结构图说明 GPIO的八种工作模式可以通过以下结构图表示: ```plaintext +-----------------------------+ | GPIO Pin | +-----------------------------+ | | | Input Modes: | | - Float | | - Pull-Up | | - Pull-Down | | - Analog | | | | Output Modes: | | - Open Drain | | - Push-Pull | | | | Alternate Function Modes: | | - AF Open Drain | | - AF Push-Pull | | | +-----------------------------+ ``` 上述结构图展示了GPIO的八种工作模式分类,分为输入模式、输出模式和复用模式。每种模式的具体实现依赖于硬件配置和软件初始化代码。 #### 示例代码:配置GPIO模式 以下是一个基于STM32的GPIO配置示例代码: ```c #include "stm32f10x.h" void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; // 使能GPIO端口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置为推挽输出模式 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 此代码片段展示了如何将STM32的GPIOA_0配置为推挽输出模式
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值