详细解析STM32 GPIO引脚的8种模式

目录

一、输入浮空(Floating Input):GPIO引脚不连接任何上拉或下拉电阻,处于高阻态

1.浮空输入的定义

2.浮空输入的特点

3.浮空输入的应用场景

4.浮空输入的缺点

5.典型配置方式

6.注意事项

二、输入上拉(Input Pull-up)与输入下拉(Input Pull-down)

1.上拉输入(PullupInput)

特点:

应用场景:

配置示例:

2.下拉输入(PulldownInput)

特点:

应用场景:

配置示例:

3.上拉输入与下拉输入的对比

4.使用注意事项

三、模拟输入(Analog Input):模拟输入模式下,GPIO引脚用于接受模拟信号,而不限制为高、低电平

1.模拟输入的定义

2.模拟输入的特点

3.模拟输入的工作原理

4.模拟输入的应用场景

5.配置示例

7.注意事项

8.模拟输入与数字输入的对比

四、开漏输出(Open-drain Output):GPIO引脚只有低电平导通(连接到GND)和高阻态(悬空)两种状态。

1.开漏输出的工作原理

2.开漏输出的特点

3.应用场景

4.上拉电阻的作用

5.开漏输出的配置示例

6.开漏输出和推挽输出的对比

7.注意事项

五、推挽输出(Push-pull Output):GPIO引脚可以主动输出高电平或低电平

1.推挽输出的工作原理

2.推挽输出的特点

3.推挽输出的应用场景

4.推挽输出的配置示例

5.推挽输出和开漏输出的对比

6.推挽输出的优缺点

六、推挽式复用功能(Push-pull Alternate Function)与开漏复用功能(Open-drain Alternate Function)

0.什么是复用

在微控制器中,常见的复用功能包括:

复用的必要性

复用的设置方式

复用的应用示例

1.复用开漏输出(AlternateFunctionOpenDrain)

工作原理

应用场景

配置代码示例

特点

2.复用推挽输出(AlternateFunctionPushPull)

工作原理

应用场景

配置代码示例

特点

3.复用开漏输出和复用推挽输出的对比


在嵌入式系统设计中,GPIO(通用输入输出)引脚是非常重要的硬件资源,通常用于与外部设备进行通信和控制。不同的工作模式允许GPIO引脚在不同的场景下执行不同的任务。STM32等微控制器提供了多种GPIO模式,今天我们将详细介绍这八种常见的GPIO模式,帮助你更好地理解它们的功能和应用场景。

一、输入浮空(Floating Input):GPIO引脚不连接任何上拉或下拉电阻,处于高阻态

浮空输入(FloatingInput)是一种GPIO(通用输入输出)引脚的配置模式,在这种模式下,引脚处于高阻态(HiZ),不连接任何上拉或下拉电阻。

1.浮空输入的定义


在浮空输入模式下,GPIO引脚不被内部电阻拉到任何固定电平(高或低),这意味着该引脚完全开放,以高阻抗的状态接受外部输入信号。高阻态意味着引脚不会主动提供电流或电压,而是允许外部电路自由地改变其电平。

2.浮空输入的特点


高阻态:浮空输入模式不会主动驱动高或低电平,对外部电路几乎不影响电流流动,类似于断开的电路。
易受干扰:由于引脚未通过内部电阻固定电位,因此当输入端未连接外部信号时,引脚状态可能不稳定,容易受到外部电磁干扰或信号“漂移”影响,使得输入信号变得不确定。
响应外部信号:浮空输入的高阻态允许引脚通过外部信号轻松控制电平,因此适合需要外部控制的场景。

3.浮空输入的应用场景


需要外部电阻的输入电路:适用于外部已经连接了上拉或下拉电阻的情况。如果电路中使用了物理电阻拉高或拉低引脚,浮空输入模式不会与之冲突,保持对输入信号的响应。
信号检测:适合用于检测外部信号变化的场合,如传感器信号输入,但通常需要外部电路保证信号稳定,避免悬空带来的信号漂移。
低功耗应用:在一些低功耗设备中,未连接的GPIO引脚可以配置为浮空输入以减少功耗,因为高阻态下引脚不会有明显的电流流动。

4.浮空输入的缺点


不稳定性:由于没有电阻将电平固定在高或低状态,悬空的浮空输入引脚非常容易受到干扰。任何微小的环境噪声或干扰都会导致引脚电压变化,导致不确定的输入信号。
误触发风险:在悬空情况下,引脚可能随意“漂移”到高或低电平,可能导致逻辑电路误判为输入有效信号而误触发事件。

5.典型配置方式

GPIO_InitTypeDefGPIO_InitStruct={0};
GPIO_InitStruct.Pin=GPIO_PIN_X;//X代表具体的引脚编号
GPIO_InitStruct.Mode=GPIO_MODE_INPUT;//设置为浮空输入模式
GPIO_InitStruct.Pull=GPIO_NOPULL;//无内部上拉或下拉电阻
HAL_GPIO_Init(GPIOX,&GPIO_InitStruct);//X为GPIO端口号

6.注意事项


尽量避免引脚悬空:为了避免干扰和不稳定信号,如果浮空输入引脚没有外部电路连接,最好改用上拉或下拉配置,以确保引脚稳定。
外部电路稳定性:如果使用浮空输入,通常建议使用外部上拉或下拉电阻来固定电平,避免引脚无意触发。

浮空输入适合有明确外部驱动的输入场景,而在信号易受干扰或要求信号稳定的场合,建议采用上拉或下拉输入。

二、输入上拉(Input Pull-up)与输入下拉(Input Pull-down)

上拉输入(PullupInput)和下拉输入(PulldownInput)是GPIO引脚的两种常见输入模式,通过在引脚内部连接上拉或下拉电阻来使引脚保持稳定电位,防止其悬空。

1.上拉输入(PullupInput)

上拉输入模式在引脚内部连接一个上拉电阻,将引脚电位固定为高电平(接近电源电压)。这种模式确保引脚在没有外部信号连接时仍保持高电平。

特点:


默认高电平:上拉输入通过内部上拉电阻将引脚电位拉高到接近电源电压,使引脚在无外部信号时默认保持高电平状态。
抗干扰能力:上拉输入避免了引脚悬空问题,能减少环境噪声对引脚电平的影响。
省去外部电阻:内置的上拉电阻可以省去电路设计中的额外电阻,简化硬件布线。

应用场景:


按钮或开关输入检测:在许多按钮和开关检测电路中,按钮按下连接到地,释放时引脚通过上拉电阻保持高电平,可以实现低电平触发检测。
逻辑信号保持高电平:在需要保持输入信号默认高电平的逻辑电路中,通常将引脚设置为上拉输入。

配置示例:


GPIO_InitTypeDefGPIO_InitStruct={0};
GPIO_InitStruct.Pin=GPIO_PIN_X;//X代表具体的引脚编号
GPIO_InitStruct.Mode=GPIO_MODE_INPUT;//设置为输入模式
GPIO_InitStruct.Pull=GPIO_PULLUP;//启用上拉电阻
HAL_GPIO_Init(GPIOX,&GPIO_InitStruct);//X为GPIO端口号

2.下拉输入(PulldownInput)

下拉输入模式则在引脚内部连接一个下拉电阻,将引脚电位固定为低电平(接近地电位)。这种模式确保引脚在没有外部信号连接时默认保持低电平。

特点:


默认低电平:下拉输入通过内部下拉电阻将引脚电位拉低到接近地电位,使引脚在无外部信号时默认保持低电平状态。
抗干扰能力:下拉输入模式同样可以防止引脚悬空,减少引脚受噪声影响而电平不稳定。
节省硬件资源:使用内部下拉电阻可以避免在电路设计中增加额外的外部电阻,简化电路设计。

应用场景:


按钮或开关输入检测:适用于按钮或开关检测电路,通常当按钮按下连接到电源,释放时引脚通过下拉电阻保持低电平,可以实现高电平触发检测。
逻辑信号保持低电平:需要输入信号默认保持低电平的逻辑电路中,通常将引脚设置为下拉输入。

配置示例:
 

GPIO_InitTypeDefGPIO_InitStruct={0};
GPIO_InitStruct.Pin=GPIO_PIN_X;//X代表具体的引脚编号
GPIO_InitStruct.Mode=GPIO_MODE_INPUT;//设置为输入模式
GPIO_InitStruct.Pull=GPIO_PULLDOWN;//启用下拉电阻
HAL_GPIO_Init(GPIOX,&GPIO_InitStruct);//X为GPIO端口号

3.上拉输入与下拉输入的对比

4.使用注意事项


选择合适的模式:根据需要的默认电平选择上拉或下拉输入,避免出现悬空状态。
电平兼容性:在与外部电路连接时,确保与外部电路的逻辑电平兼容,避免产生意外的电流流动。
防止误触发:上拉和下拉输入模式有效地防止引脚浮空,有助于减少外部干扰引起的误触发。

三、模拟输入(Analog Input):模拟输入模式下,GPIO引脚用于接受模拟信号,而不限制为高、低电平

模拟输入(AnalogInput)是一种GPIO引脚配置模式,主要用于处理模拟信号,将模拟量转换为数字信号。模拟输入模式通常应用在需要采集连续变化的电压信号的场景,例如温度、光线、湿度等传感器的数据采集。

1.模拟输入的定义


在模拟输入模式下,GPIO引脚接收一个模拟信号,即一个连续变化的电压值,而不是传统的高低电平。处理模拟信号通常需要将其输入至一个模数转换器(ADC,AnalogtoDigitalConverter),由ADC模块将连续的模拟信号采样并量化为数字值,以便在数字系统中进一步处理和分析。

2.模拟输入的特点


连续电压范围:模拟输入可以接受从0V到芯片供电电压(如3.3V或5V)之间的任何电压值,区别于仅能接收高电平或低电平的数字输入。
无上拉/下拉电阻:在模拟输入模式下,引脚不具备上拉或下拉电阻,以确保信号不会受到内部电路的影响,尽可能准确地反映外部信号的真实电平。
配合ADC使用:模拟输入模式通常配合ADC模块,将模拟信号采样并转换为数字数据。ADC会对模拟电压进行量化,转换成若干个离散的数值,这些数值用以表示输入的电压信号强度。

3.模拟输入的工作原理


模拟信号通过模拟输入引脚进入ADC,ADC模块按设定的采样速率对信号进行采集,并将每一个采样的电压值转换成数字量。ADC通常会根据位数(如8位、10位、12位等)将电压量化到相应的范围内。例如,对于10位ADC,电压范围会被量化为0到1023的数字值。

4.模拟输入的应用场景


模拟输入模式广泛应用于需要采集传感器数据的场合,尤其是以下情况:
环境监测传感器:如温度传感器、光敏传感器、湿度传感器等,其输出的电压随环境变化连续变化。
模拟设备接口:如音频信号采集(麦克风)、模拟电位器(用于音量调节)、气压传感器等。
电池电压监测:用于实时监控电池电压以判断其电量状态。

5.配置示例


在微控制器中配置模拟输入通常包括两个步骤:将引脚配置为模拟输入模式,并启用ADC功能。下面是一个典型的配置示例:

GPIO_InitTypeDefGPIO_InitStruct={0};
GPIO_InitStruct.Pin=GPIO_PIN_X;//X代表具体的引脚编号
GPIO_InitStruct.Mode=GPIO_MODE_ANALOG;//配置为模拟输入模式
GPIO_InitStruct.Pull=GPIO_NOPULL;//无内部上拉或下拉电阻
HAL_GPIO_Init(GPIOX,&GPIO_InitStruct);//X为GPIO端口号ADC_HandleTypeDefhadc;
hadc.Instance=ADCX;//ADC通道编号
HAL_ADC_Start(&hadc);//启动ADC
HAL_ADC_PollForConversion(&hadc,timeout);//等待ADC转换完成
uint32_tadcValue=HAL_ADC_GetValue(&hadc);//获取ADC的数值

7.注意事项


信号稳定性:由于模拟输入容易受到噪声干扰,应确保输入信号源稳定。如有必要,可以通过添加滤波电容等方式减少干扰。
输入电压范围:输入电压应在ADC的参考电压范围内,通常为0到Vref(供电电压),过高的电压可能损坏ADC。
采样速率与分辨率:选择合适的采样速率和分辨率,以确保采样数据的准确性。高分辨率可以提高数据精度,但也可能增加处理时间和计算资源的需求。

8.模拟输入与数字输入的对比

 


模拟输入模式通过将连续电压信号输入至ADC进行数字化转换,广泛应用于传感器、模拟信号采集等领域。配置模拟输入时需要注意信号范围、滤波抗干扰以及采样速率等因素,以确保采集数据的准确性和稳定性。

四、开漏输出(Open-drain Output):GPIO引脚只有低电平导通(连接到GND)和高阻态(悬空)两种状态。

开漏输出(OpenDrainOutput)是GPIO(通用输入输出)引脚的一种输出模式,在这种模式下,GPIO引脚只能主动拉低至低电平(连接到地,GND),而不能主动输出高电平。当GPIO设置为开漏输出模式时,引脚可以处于两种状态:低电平或高阻态(HiZ),这使得开漏输出适合与外部电路或多个设备共同工作。

1.开漏输出的工作原理


低电平(导通):当GPIO输出低电平时,内部的MOSFET开关接通,将引脚与地相连,这一状态被称为“拉低”。
高阻态(断开):当GPIO不输出低电平时,引脚进入高阻态,表现为开路(不接地,也不接电源),不会输出高电平。这时引脚电压依赖于外部电路的作用,例如一个外部上拉电阻将引脚拉高。

2.开漏输出的特点


不主动输出高电平:在开漏模式下,GPIO引脚无法主动输出高电平,只能通过外部电路提供高电平,通常需要使用上拉电阻将引脚电平“拉高”。
高阻态可实现多设备连接:开漏输出具有高阻态,不会干扰其他设备的信号,适合用于多设备通信场合。
低功耗:在高阻态时,引脚不会消耗显著的电流,因此开漏输出可以实现低功耗。

3.应用场景

多设备通信
I²C总线:在I²C通信中,数据线和时钟线都采用开漏输出模式,并通过外部上拉电阻拉高,使得总线上的多个设备能够安全地共享同一条通信线。在此模式下,任何设备只需拉低总线来传输数据,而不会出现多个设备同时输出高电平引起冲突的情况。

控制大电流设备
继电器、LED等驱动:开漏输出可以连接较大功率的负载(如继电器或LED灯),通过拉低GPIO引脚来导通负载电路,适合用于电流较大的场合。GPIO低电平时驱动负载,高阻态时关闭负载电路。

与不同电压系统互连
不同电压逻辑电平兼容:开漏输出模式允许不同电压的系统相互通信,例如在低电压单片机和高电压设备之间添加上拉电阻,使得两者能够安全互连。

4.上拉电阻的作用


由于开漏输出不提供高电平,通常需要连接一个上拉电阻来将引脚拉高:
外部上拉电阻:上拉电阻通常连接至电源正极(如VCC),在GPIO高阻态时,将引脚电平拉至电源电压。
上拉电阻值选择:上拉电阻的阻值一般为4.7kΩ到10kΩ,过大可能导致上拉速度变慢,过小则会增大电流消耗。

5.开漏输出的配置示例


GPIO_InitTypeDefGPIO_InitStruct={0};
GPIO_InitStruct.Pin=GPIO_PIN_X;//X代表具体的引脚编号
GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_OD;//设置为开漏输出模式
GPIO_InitStruct.Pull=GPIO_NOPULL;//不使用内部上拉或下拉电阻
HAL_GPIO_Init(GPIOX,&GPIO_InitStruct);//X为GPIO端口号//在此模式下,可以根据需要在引脚外部连接上拉电阻。开漏输出模式下,通过如下代码控制引脚状态:HAL_GPIO_WritePin(GPIOX,GPIO_PIN_X,GPIO_PIN_RESET);//输出低电平,拉低引脚
HAL_GPIO_WritePin(GPIOX,GPIO_PIN_X,GPIO_PIN_SET);//输出高阻态,不主动拉高

6.开漏输出和推挽输出的对比

 

7.注意事项


确保使用上拉电阻:开漏输出无法提供高电平,在无上拉电阻的情况下,引脚可能悬空,电平不确定。
高低电平状态兼容:确保在使用开漏输出时与外部电路逻辑电平兼容,避免因电平不兼容导致不稳定或损坏。
多设备连接的冲突风险:开漏输出模式有利于避免多设备同时输出高电平导致的冲突,但在实际应用中仍需确保多设备协调时序。

开漏输出模式通过“低电平+高阻态”提供灵活的多设备连接和电平控制能力,适合用于I²C总线、驱动大功率负载、不同电压系统通信等场合。结合外部上拉电阻使用,开漏输出能够在不同应用中提供稳定的电平控制和通信功能。

五、推挽输出(Push-pull Output):GPIO引脚可以主动输出高电平或低电平

推挽输出(PushPullOutput)是GPIO的一种输出模式。在这种模式下,GPIO引脚可以主动输出高电平和低电平,适合需要快速切换电平状态和较高电流驱动能力的应用场景。推挽输出在单片机、微控制器、FPGA等数字电路中非常常见。

1.推挽输出的工作原理


推挽输出模式是通过两个MOSFET(或晶体管)实现的,一个负责输出高电平(接电源正极,通常是VCC),另一个负责输出低电平(接地,GND)。当GPIO需要输出高电平时,上面的MOSFET导通,输出端接VCC;当需要输出低电平时,下面的MOSFET导通,输出端接GND。
输出高电平:上部MOSFET导通,下部MOSFET断开,GPIO引脚被拉到高电平。
输出低电平:下部MOSFET导通,上部MOSFET断开,GPIO引脚被拉到低电平。

2.推挽输出的特点


主动输出高低电平:推挽输出可以主动拉高到VCC或拉低到GND,无需外部上拉或下拉电阻。
电平切换迅速:由于输出的电平切换是通过内部MOSFET驱动实现的,切换速度较快,适合快速变化的信号。
较大的驱动电流:推挽模式下的引脚通常具有较大的驱动能力,可以直接驱动一些小功率负载,如LED。

3.推挽输出的应用场景


控制信号输出:用作数字信号的驱动,如发送PWM信号控制电机、LED等。
高速通信:用于通信总线或时钟信号输出(如SPI的时钟信号),适合要求快速切换电平的应用。
驱动简单负载:可以直接驱动一些小功率的负载,如LED灯,或通过简单的电路控制继电器等。

4.推挽输出的配置示例

GPIO_InitTypeDefGPIO_InitStruct={0};
GPIO_InitStruct.Pin=GPIO_PIN_X;//X代表具体的引脚编号
GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;//设置为推挽输出模式
GPIO_InitStruct.Pull=GPIO_NOPULL;//不使用内部上拉或下拉电阻
GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_HIGH;//设置为高速,适合快速切换信号
HAL_GPIO_Init(GPIOX,&GPIO_InitStruct);//X为GPIO端口号//可以通过以下代码来控制引脚输出状态:HAL_GPIO_WritePin(GPIOX,GPIO_PIN_X,GPIO_PIN_SET);//输出高电平
HAL_GPIO_WritePin(GPIOX,GPIO_PIN_X,GPIO_PIN_RESET);//输出低电平

5.推挽输出和开漏输出的对比

 

6.推挽输出的优缺点

优点
电平切换速度快:推挽输出的电平切换时间较短,适合高速信号。
无需外部电阻:推挽模式不需要上拉或下拉电阻,电路更简洁。
高驱动能力:推挽输出的电流驱动能力相对较大,可以直接驱动小型负载。

缺点
不适合多设备共享:推挽输出模式如果连接多个设备,可能会因多个设备同时输出相反电平引起冲突,导致电流过大而损坏电路。
功耗较高:在高频切换时,推挽输出的功耗相对较高。

7.注意事项
驱动能力限制:尽管推挽输出可以直接驱动一些小负载,但要避免超过其电流输出能力,以免损坏GPIO引脚。
电平冲突风险:避免将推挽输出的GPIO直接与其他输出模式的GPIO相连,防止出现电平冲突。

推挽输出模式提供了可靠的高低电平切换能力,适合用于高速控制信号和驱动小功率负载。相比开漏输出,推挽模式无需上拉电阻,电平切换快速且具有较强的驱动能力,但不适合与多个设备共用引脚。在使用时需特别注意电平冲突问题,以确保电路安全。

六、推挽式复用功能(Push-pull Alternate Function)与开漏复用功能(Open-drain Alternate Function)

复用开漏输出(AlternateFunctionOpenDrain)和复用推挽输出(AlternateFunctionPushPull)是GPIO的两种特殊模式,常用于引脚需要复用(AlternateFunction)的情况。在这种模式下,GPIO引脚会连接到芯片内的某些特定的外设功能上,比如I²C、SPI、USART等接口。这些模式让引脚在支持特定外设协议的同时,具备各自的输出特性。

0.什么是复用

复用(AlternateFunction)是指在微控制器的GPIO引脚上,除了基本的输入输出功能外,引脚还能被分配到特定的外设功能上,以满足不同的应用需求。复用允许同一个引脚在不同情况下承担不同的角色,比如用于通信、定时、控制等功能,从而有效利用芯片资源并减少引脚数量。

在微控制器中,常见的复用功能包括:


1.通信接口:GPIO引脚可以复用为I²C、SPI、UART、USART等通信总线的接口引脚,用于数据传输。
2.定时器功能:一些GPIO引脚可以复用为定时器的输入捕获或输出比较引脚,用于PWM输出、计时等。
3.模拟功能:部分引脚可以复用为ADC(模数转换器)、DAC(数模转换器)等模拟信号输入或输出通道。
4.外部中断:某些GPIO引脚可以复用为外部中断源,用于捕获事件或信号变化。

复用的必要性


在微控制器设计中,芯片引脚有限,复用可以让同一个引脚在不同需求下发挥多种作用,避免占用额外硬件资源。比如,当需要在有限引脚上实现复杂的功能或多个外设通信时,复用功能显得尤为重要。

复用的设置方式


复用通常通过寄存器配置来设置,每个引脚都对应一组复用选项,可以通过改变GPIO的配置来实现。例如在STM32微控制器中,可以通过配置GPIO的模式寄存器和复用功能寄存器来选择引脚的复用功能。

复用的应用示例


假设一个引脚既可以作为普通GPIO输出,又可以复用为UART通信的TX(发送)引脚。根据实际应用需求,这个引脚可以在不同的模式下被配置为:
普通GPIO输出:直接控制引脚的高低电平。
复用为UARTTX:将引脚配置为复用模式,并由UART外设控制数据的发送。

总结
复用功能让一个引脚可以在多个外设功能之间切换,从而在引脚有限的微控制器中实现更多功能。这在嵌入式系统中广泛应用,为实现通信、控制和信号处理等多种任务提供了灵活性。

1.复用开漏输出(AlternateFunctionOpenDrain)

复用开漏输出模式下,GPIO引脚作为外设的开漏输出。它可以被外设控制,输出低电平或进入高阻态(HiZ),而不主动输出高电平。通常需要外部上拉电阻以保证高电平,这种模式常用于需要多个设备共用一条总线的场景。

工作原理


低电平:当复用的外设要求输出低电平时,GPIO通过开漏模式将引脚接地。
高阻态:当不需要输出低电平时,引脚进入高阻态,引脚状态取决于上拉电阻,通常被拉高到电源电压(VCC)。

应用场景


I²C通信:I²C协议使用SDA(数据)和SCL(时钟)两根线,且要求总线上的设备通过开漏输出连接,因此使用复用开漏模式可以有效防止多设备电平冲突。
多设备通信:复用开漏模式适合用于要求引脚进入高阻态的情况,适用于多设备或不同电压之间通信。

配置代码示例


GPIO_InitTypeDefGPIO_InitStruct={0};
GPIO_InitStruct.Pin=GPIO_PIN_X;//X代表具体的引脚编号
GPIO_InitStruct.Mode=GPIO_MODE_AF_OD;//复用开漏输出模式
GPIO_InitStruct.Pull=GPIO_NOPULL;//不使用内部上拉电阻
GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_HIGH;//设置为高速,适合频率较高的通信场合
GPIO_InitStruct.Alternate=GPIO_AFx_I2C;//设置为I²C外设复用功能
HAL_GPIO_Init(GPIOX,&GPIO_InitStruct);//X为GPIO端口号

特点


外设驱动输出:引脚由芯片内部的外设驱动,可以进入高阻态,允许多设备共用。
外部上拉电阻:需要通过外部上拉电阻来提供高电平。
电平冲突保护:由于支持高阻态,适合用于总线共享和多设备场景,降低电平冲突的风险。

2.复用推挽输出(AlternateFunctionPushPull)

复用推挽输出模式下,GPIO引脚作为外设的推挽输出。引脚可以在外设控制下输出高电平或低电平,通常不需要上拉电阻,因此适合单方向、快速切换的信号输出。

工作原理


高电平:当外设要求高电平时,GPIO引脚直接被驱动到VCC。
低电平:当外设要求低电平时,引脚被拉到地。

应用场景


SPI通信:SPI协议中,时钟(SCK)、数据(MOSI、MISO)等引脚通常使用复用推挽模式,因为SPI信号对驱动电流、传输速率和抗干扰要求较高。
UART、USART通信:UART和USART通信的TX和RX引脚也通常配置为复用推挽模式,以保证稳定的信号传输。
高速输出:适合单方向信号输出且不需要多设备共用引脚的情况,例如PWM输出控制或高速数据信号传输。

配置代码示例

GPIO_InitTypeDefGPIO_InitStruct={0};
GPIO_InitStruct.Pin=GPIO_PIN_X;//X代表具体的引脚编号
GPIO_InitStruct.Mode=GPIO_MODE_AF_PP;//复用推挽输出模式
GPIO_InitStruct.Pull=GPIO_NOPULL;//不使用内部上拉电阻
GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_HIGH;//设置为高速,适合快速信号切换
GPIO_InitStruct.Alternate=GPIO_AFx_SPI;//设置为SPI外设复用功能
HAL_GPIO_Init(GPIOX,&GPIO_InitStruct);//X为GPIO端口号

特点


稳定的高低电平切换:复用推挽输出提供稳定的高低电平,适合高速传输信号。
无需外部电阻:推挽模式不需要外部上拉电阻,电路相对简单。
不适合多设备共享:推挽模式下无法进入高阻态,不适合多设备共用的引脚,容易引起电平冲突。

3.复用开漏输出和复用推挽输出的对比

 复用开漏输出适合需要多个设备共用信号线的情况,通过开漏和上拉电阻保证电平兼容,应用于I²C等协议。
复用推挽输出适合高速信号传输和单向信号驱动应用,广泛应用于SPI、UART等通信协议以及需要高速切换的信号输出场景。

STM32微控制器的GPIO引脚提供了丰富的配置选项,不仅可以作为基本的输入输出引脚,还可以通过复用功能实现多种通信协议和外设控制。通过合理配置这些模式,可以有效地节省引脚资源,提升系统的功能性和灵活性。

每种模式都有其独特的应用场景,开发者需要根据具体的需求选择合适的模式,从而实现高效且稳定的嵌入式设计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/474734.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第8章 硬件维护-8.6 产品变更管理(PCN)

8.6 产品变更管理(PCN) PCN是Product Change Notice(产品变更管理)的缩写。PCN是厂商为了提高质量、降低成本主动向客户发起的产品变更。一般涉及如下变更的,需要发布PCN公告。 (1)生产地址变更…

关于安卓模拟器或手机设置了BurpSuite代理和安装证书后仍然抓取不到APP数据包的解决办法

免责申明 本文仅是用于学习研究安卓系统设置代理后抓取不到App数据包实验,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》【学法时习之丨网络安全在身边一…

【小程序】dialog组件

这个比较简单 我就直接上代码了 只需要传入title即可&#xff0c; 内容部分设置slot 代码 dialog.ttml <view class"dialog-wrapper" hidden"{{!visible}}"><view class"mask" /><view class"dialog"><view …

问:Spring MVC DispatcherServlet流程步骤梳理

DispatcherServlet是Spring MVC框架中的核心组件&#xff0c;负责接收客户端请求并将其分发到相应的控制器进行处理。作为前端控制器&#xff08;Front Controller&#xff09;的实现&#xff0c;DispatcherServlet在整个请求处理流程中扮演着至关重要的角色。本文将探讨Dispat…

uni-app快速入门(十)--常用内置组件(下)

本文介绍uni-app的textarea多行文本框组件、web-view组件、image图片组件、switch开关组件、audio音频组件、video视频组件。 一、textarea多行文本框组件 textarea组件在HTML 中相信大家非常熟悉&#xff0c;组件的官方介绍见&#xff1a; textarea | uni-app官网uni-app,un…

一些任务调度的概念杂谈

任务调度 1.什么是调度任务 依赖&#xff1a;依赖管理是整个DAG调度的核心。调度依赖包括依赖策略和依赖区间。 依赖分为任务依赖和作业依赖&#xff0c;任务依赖是DAG任务本身的依赖关系&#xff0c;作业依赖是根据任务依赖每天的作业产生的。两者在数据存储模型上有所不同…

[已解决]Tomcat 9.0.97控制台乱码

maven3.8.1 JDK11 Tomcat9.0.97 修改apache-tomcat-9.0.97\conf\logging.properties文件&#xff1a; WebServlet("/login") public class LoginServlet extends HttpServlet {Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) th…

语义通信论文略读(十六)多任务+中继通道

Two Birds with One Stone: Multi-Task Semantic Communications Systems over Relay Channel 一石二鸟&#xff1a;中继通道上的多任务语义通信系统 作者: Yujie Cao, Tong Wu, Zhiyong Chen, Yin Xu, Meixia Tao, Wenjun Zhang 所属机构: 上海交通大学 时间&#xff1a;…

【微软:多模态基础模型】(5)多模态大模型:通过LLM训练

欢迎关注[【youcans的AGI学习笔记】](https://blog.csdn.net/youcans/category_12244543.html&#xff09;原创作品 【微软&#xff1a;多模态基础模型】&#xff08;1&#xff09;从专家到通用助手 【微软&#xff1a;多模态基础模型】&#xff08;2&#xff09;视觉理解 【微…

蓝桥杯第22场小白入门赛2~5题

这场比赛开打第二题就理解错意思了&#xff0c;还以为只能用3个消除和5个消除其中一种呢&#xff0c;结果就是死活a不过去&#xff0c;第三题根本读不懂题意&#xff0c;这蓝桥杯的题面我只能说出的是一言难尽啊。。第四题写出来一点但是后来知道是错了&#xff0c;不会正解&am…

【初阶数据结构篇】队列的实现(赋源码)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

Java基础夯实——2.4 线程的生命周期

Java线程生命周期 Java线程的生命周期分为&#xff1a;新建&#xff08;New&#xff09;、就绪&#xff08;Runnable&#xff09;、阻塞&#xff08;Blocked&#xff09;、等待 (Waiting) 、计时等待&#xff08;Timed_Waiting&#xff09;、终止&#xff08;Terminated&#…

基于Java Springboot二手书籍交易系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

【Mac】未能完成该操作 Unable to locate a Java Runtime

重生之我做完产品经理之后回来学习Data Mining Mac打开weka.jar报错"未能完成该操作 Unable to locate a Java Runtime" 1. 打开终端执行 java -version 指令&#xff0c;原来是没安装 JDK 环境 yyzccnn-mac ~ % java -version The operation couldn’t be comple…

【大语言模型】ACL2024论文-12 大型语言模型的能力如何受到监督式微调数据组成影响

【大语言模型】ACL2024论文-12 大型语言模型的能力如何受到监督式微调数据组成影响 论文&#xff1a;https://arxiv.org/pdf/2310.05492 目录 文章目录 【大语言模型】ACL2024论文-12 大型语言模型的能力如何受到监督式微调数据组成影响论文&#xff1a;https://arxiv.org/p…

刷题强训(day09)【C++】添加逗号、跳台阶、扑克牌顺子

目录 1、添加逗号 1.1 题目 1.2 思路 1.3 代码实现 2、 跳台阶 2.1 题目 2.2 思路 2.3 代码实现 dp 滚动数组 3、扑克牌顺子 3.1 题目 3.2 题目 3.3 代码实现 1、添加逗号 1.1 题目 1.2 思路 读完题&#xff0c;我们知道了要将一个数的每三位用逗号分割。 所以…

华为再掀技术革新!超薄膜天线设计路由器首发!

随着Wi-Fi技术的不断进步&#xff0c;新一代的Wi-Fi 7路由器凭借其高速率、低延迟、更稳定的性能受到了广泛关注。它能够更好地满足现代家庭对网络性能的高要求&#xff0c;带来更加流畅、高效的网络体验。9月24日&#xff0c;华为在其秋季全场景新品发布会上推出了全新Wi-Fi 7…

leetcode:344. 反转字符串(python3解法)

难度&#xff1a;简单 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1&#xff1a; 输入&#xff1a;s [&qu…

【蓝桥杯C/C++】深入解析I/O高效性能优化:std::ios::sync_with_stdio(false)

文章目录 &#x1f4af;前言&#x1f4af;C 语言与 C 语言的输入输出对比1.1 C 语言的输入输出1.2 C 语言的输入输出 &#x1f4af; std::ios::sync_with_stdio(false) 的作用与意义2.1 什么是 std::ios::sync_with_stdio(false)2.2 使用 std::ios::sync_with_stdio(false) 的示…

学习threejs,通过SkinnedMesh来创建骨骼和蒙皮动画

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.SkinnedMesh 蒙皮网格…