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

news2024/11/20 5:36:13

目录

一、输入浮空(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.coloradmin.cn/o/2243831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对于 unix 系统管理员来说,了解 VIM 有多重要?

对于 Unix 系统管理员来说,掌握 VIM 的重要性不言而喻。VIM 作为 Unix 系统中默认的文本编辑器,几乎在所有 Unix 系统中都预装,这使得系统管理员必须熟练使用它来编辑配置文件、编写脚本等。 VIM 强大的功能和灵活性,使得它能够满…

containerd使用

一、ctr命令 1.查看命名空间 ctr namespace ls 2.查看特定命名空间镜像 ctr -n k8s.io images ls 3.查看特定命名空间容器 ctr -n k8s.io container ls 注意:该项与docker不同,container查看容器是所有的容器无论有没有启动,只要创建了的…

Python 数据结构对比:列表与数组的选择指南

文章目录 💯前言💯Python中的列表(list)和数组(array)的详细对比1. 数据类型的灵活性2. 性能与效率3. 功能与操作4. 使用场景5. 数据结构选择的考量6. 实际应用案例7. 结论 💯小结 &#x1f4af…

在Q-Studio中进行OTX脚本的开发、仿真与调试

一 背景 现如今,随着车辆中电子器件和软件数量的快速增加,在车辆研发、生产、测试及售后阶段需要进行的车载测试工作越来越多、越来越复杂,呈现指数级增长的趋势。以往常用的手动测试方式已完全无法满足现如今的测试需求了,由此推…

Cursor安装Windows / Ubuntu

一、安装 1、下载软件 2、安装依赖 #安装fuse sudo apt-get install fuse3、将cursor添加到应用程序列表 sudo mv cursor-0.42.5x86_64.AppImage /opt/cursor.appimage #使用自己版本号替换 sudo chmod x /opt/cursor.appimage #给予可执行权限 sudo nano /usr/share/applic…

NLP论文速读(多伦多大学)|利用人类偏好校准来调整机器翻译的元指标

论文速读|MetaMetrics-MT: Tuning Meta-Metrics for Machine Translation via Human Preference Calibration 论文信息: 简介: 本文的背景是机器翻译(MT)任务的评估。在机器翻译领域,由于不同场景和语言对的需求差异&a…

Docker部署Kafka集群,增加 SASL_SSL认证,并集成到Spring Boot,无Zookeeper版

1,准备好Kafka 镜像包: bitnami/kafka:3.9.0 镜像资源包 2,准备好kafka.keystore.jks 和 kafka.truststore.jks证书 具体操作可参考: Docker部署Kafka SASL_SSL认证,并集成到Spring Boot-CSDN博客 3,配置…

Git 分⽀规范 Git Flow 模型

前言 GitFlow 是一种流行的 Git 分支管理策略,由 Vincent Driessen 在 2010 年提出。它提供了一种结构化的方法来管理项目的开发、发布和维护,特别适合大型和复杂的项目。GitFlow 定义了一套明确的分支模型和工作流程,使得团队成员可以更有效…

shell脚本命令1,保姆级别---清风

声明: 本文的学习内容来源于B站up主“泷羽sec”视频“蓝队基础之网络七层杀伤链”的公开分享,所有内容仅限于网络安全技术的交流学习,不涉及任何侵犯版权或其他侵权意图。如有任何侵权问题,请联系本人,我将立即删除相…

MySQL扩展varchar字段长度能否Online DDL

目录 问题场景 Online DDL 简介 场景复现 DBdoctor快速识别 Online DDL 总结 问题场景 在MySQL数据库中,DDL变更可以通过两种算法实现:Copy算法和In-Place算法。Copy算法会复制整个表,这可能导致长时间的写入阻塞,从而严重影…

低成本出租屋5G CPE解决方案:ZX7981PG/ZX7981PM WIFI6千兆高速网络

刚搬进新租的房子,没有网络,开个热点?续航不太行。随身WIFI?大多是百兆级网络。找人拉宽带?太麻烦,退租的时候也不能带着走。5G CPE倒是个不错的选择,插入SIM卡就能直接连接5G网络,千…

港大ArcLab最新开源DEIO:第一个学习与传统非线性图优化紧密结合的单目事件惯性里程计

原文链接:港大ArcLab最新开源DEIO:第一个学习与传统非线性图优化紧密结合的单目事件惯性里程计 导读 本文介绍了一种名为 DEIO(Deep Event Inertial Odometry)的新型单目深度事件惯性里程计框架。该方法创新性地将深度学习与传统…

基于麒麟服务器操作系统V10版本,部署Nginx服务、MySql服务搭建PHP环境,实现静态网站平台的搭建。

一、环境准备 关闭防火墙。 查看当前防火墙的状态 systemctl status firewalld Copy 如果防火墙的状态参数是inactive,则防火墙为关闭状态。 如果防火墙的状态参数是active,则防火墙为开启状态。 关闭防火墙。 如果您想临时关闭防火墙,需要运行以下命令: systemctl…

【priority_queue的使用及模拟实现】—— 我与C++的不解之缘(十六)

前言 ​ priority_queue,翻译过来就是优先级队列,但是它其实是我们的堆结构(如果堆一些遗忘的可以看一下前面的文章复习一下【数据结构】二叉树——顺序结构——堆及其实现_二叉树顺序结构-CSDN博客),本篇文章就来使用…

在AndroidStudio中新建项目时遇到的Gradle下载慢问题,配置错的按我的来,镜像地址不知道哪个网页找的,最主要下载要快

android-studio-2024.2.1.11-windows Android 移动应用开发者工具 – Android 开发者 | Android Developers https://r4---sn-j5o76n7z.gvt1-cn.com/edgedl/android/studio/install/2024.2.1.11/android-studio-2024.2.1.11-windows.exe?cms_redirectyes&met1731775…

《Java核心技术 卷I》用户界面中首选项API

首选项API 在桌面程序中,通常都会存储用户首选项,如用户最后处理的文件、窗口的最后位置等。 利用Properties类可以很容易的加载和保存程序的配置信息,但有以下缺点: 有些操作系统没有主目录概念,很难为匹配文件找到…

服务器数据恢复—raid5阵列故障导致上层系统分区无法识别的数据恢复案例

服务器数据恢复环境: 某品牌DL380服务器,服务器中三块SAS硬盘组建了一组raid5阵列。服务器安装Windows Server操作系统,划分了3个分区,D分区存放数据库,E分区存放数据库备份。 服务器故障: RAID5阵列中有一…

Linux_shell脚本if语句详细教程

前言 在 Linux Shell 脚本中,if 语句用于基于条件执行命令或代码块。它的基本语法结构如下: if 条件; then# 如果条件为真时执行的代码 elif 另一个条件; then# 如果另一个条件为真时执行的代码 else# 如果所有条件都不成立时执行的代码 fi一、if 语句…

java中设计模式的使用(持续更新中)

概述 设计模式的目的:编写软件过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序(软件),具有…

Leetcode 有效的数独

这段代码解决的是 验证一个数独是否有效 的问题,其算法思想是基于 规则校验和状态记录。具体思想如下: 算法思想 核心目标: 检查每个数字在 同一行、同一列 和 同一个 3x3 子格 中是否重复。 状态记录: 使用 3 个布尔二维数组分别…