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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在用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使用就要把引脚设置为复用开漏输出。

 

### STM32 GPIO8工作模式及对应电阻配置 #### 输入模式 (Input Mode) 1. **浮空输入 (Floating Input)** 浮空输入模式不连接任何内部电阻,这意味着引脚处于未定义状态。当外部信号源提供稳定的高低电平时适用此模式。 2. **上拉输入 (Pull-up Input)** 上拉输入通过激活内部的弱上拉电阻使引脚默认为高电平[^4]。这种设置适用于按键检测等场合,在无外加信号时保持逻辑‘1’。 3. **下拉输入 (Pull-down Input)** 下拉输入则相反,它利用内部弱下拉电阻将引脚维持在低电平状态下。同样用于防止噪声干扰引起误触发的情况。 #### 输出模式 (Output Mode) 4. **推挽输出 (Push-Pull Output)** 推挽输出能够驱动负载到电源轨或接地,从而实现全摆幅输出。适合用来控制LED或其他需要明确高低电平的应用场景。 5. **开漏输出 (Open Drain Output)** 开漏输出仅能将引脚拉至地线电位;要获得高电平,则需依靠外部上拉元件来完成。常应用于I²C通信协议中作为总线共享机制的一部分。 #### 复用功能模式 (Alternate Function Mode) 6. **复用推挽输出 (Alternate Push-Pull Output)** 此模式允许指定某些GPIO引脚执行预设好的外围设备专用的功能,并采用标准的推挽方式操作这些线路。 7. **复用开漏输出 (Alternate Open-Drain Output)** 类似于普通的开漏输出形式,不过这里是指定给特殊用途使用的引脚,比如USART接口中的TXD/RXD端子。 #### 模拟模式 (Analog Mode) 8. **模拟输入/输出 (Analog Input/Output)** 当设定成模拟模式时,数字缓冲器被禁用以便让ADC/DAC模块可以直接访问对应的物理管脚来进行采样或者数据发送接收活动。 对于上述提到的各种模式而言: - 对于**输入模式下的上拉和下拉选项**, 可以通过软件编程选择是否启用相应的内置电阻; - 而对于**输出模式的选择**, 则决定了电流流向以及所能达到的最大电压水平; - 至于**复用功能模式**, 主要是针对那些具有多重角色定位的多路复用型引脚来说的; - 最后,**模拟模式**则是为了配合片内外围器件而特别设立的一种非数字化处理途径。 ```c // 配置PA0为上拉输入模式的例子 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值