关于stm32推挽带有上下拉电阻的思考、IO口驱动能力是什么

1、发现推挽带有上下拉电阻

1.1、stm32手册

记忆中推挽是不需要上下拉的,没关注过,但是我真的理解上下拉吗,下图来自stm32f4的中文版和英文版的数据手册,没有翻译错,就是“推挽带有上下拉的能力”。

1.2、查找相关信息

搜索到一篇推挽上下拉的文章,实际测试表格如下,从他的数据来看,推挽不加上下拉对低电平的影响很大,直接变成了1.2V。(持保留意见)

我不信,于是开始测试,推挽加或不加上拉电阻,高电平是3.270V,低电平是0.006V.

那这个1.2V是错误数据?再看其他引脚配置,上拉推挽输出低是0.134V,比起别的输出低电平时的0.005V也要高不少,推测是这个引脚外围电路的影响,他测试的时候有的引脚不是悬空的。

2、负载对输出电平的影响

上拉推挽输出低电平,悬空0.006V,加10mA负载是0.236V。

上拉推挽输出高电平,悬空3.270V,加10mA负载是3.067V。

结论:IO的驱动能力是有限的,负载明显影响着输出电平的电压;

对于stm32f4芯片,大概10mA负载电流,电压会拉0.2V左右。

3、驱动能力是什么

驱动,动词,做谓语,宾语是什么,驱动什么,驱动负载,驱动能力指的是驱动负载的能力。

驱动,动词,做谓语,主语是什么,什么来驱动,电源。

合起来就是,电源驱动负载的能力。

(再继续,电源分电压源和电流源,下面只说电压源)

3.1、电压源

3.1.1、理想电压源

不管负载是什么,电压源输出的电压不变,电路模型和伏安特性曲线如下:

3.1.2、实际电压源

含有内阻,内阻和负载影响着电压源输出的电压,电路模型和伏安特性曲线如下:

 

现实中,IO口推挽输出对应实际电压源,比如推挽输出高电平看做一个3.3V的电压源,随着负载加大,电流增大,内阻上分去的电压也增大,负载两端的电压就减小,所以上面测试,加10mA负载后,电压从3.270V降到了3.067V。

4、推挽的电路结构与驱动能力

4.1、推挽的电路结构

下图是手册中IO口的内部结构,推挽就是通过控制PMOS和NMOS的导通,只导通PMOS输出高,只导通NMOS输出低。

4.2、推挽的驱动能力

稍微简化一下上图。

以输出高电平(PMOS导通NMOS截止)、不加上拉电阻为例。

此时电流的路径是VDD——PMOS——负载,MOS导通是有内阻的,可以看做是电压源的内阻,还是上面3.1.2所说的,负载越大内阻上分压越大,所以负载上电压减小,推挽的驱动能力就是受到内阻的影响。

 

4.3、上拉电阻对于驱动能力的影响

继续看图,PMOS和上拉电阻的上端都是连VDD,PMOS导通电阻和上拉电阻并连,等效为新的内阻,由于是并连,所以现在的内阻比之前的小,驱动能力就会增强。

上面是理论分析,实际测试加不加上拉电阻,在空载和负载两种情况下没啥区别,为什么配置推挽上拉电阻驱动能力测不出明显区别呢?

要看PMOS的内阻是多少,上拉电阻是多少。

PMOS内阻:20mA下降1.3V,内阻62欧;6mA下降0.4V,内阻66欧。

PMOS取66欧,上拉取40K,并联完了65.9欧,测不出来明显区别就合理了。

 

### HAL库中配置GPIO复用推挽输出的方法 在STM32微控制器中,通过HAL库可以方便地配置GPIO引脚为复用推挽输出模式。具体实现涉及多个函数调用和结构体设置。 #### 初始化GPIO引脚为复用推挽输出模式 为了使能特定功能模块(如定时器通道、串通信等),某些GPIO引脚需被设定成复用模式下的推挽输出形式。这通常意味着该引脚将用于连接内部外设而非简单的高低电平控制[^1]。 定义`GPIO_InitTypeDef`类型的变量来存储初始化参数,并指定目标端(`GPIOx`)以及对应的位号(`GPIO_PIN_x`);接着调整其成员属性以匹配所需的电气特性: - `Mode`: 设置为`GPIO_MODE_AF_PP`表示复用开漏输出; - `Pull`: 上拉/下拉电阻选项这里一般选无上下拉即`GPIO_NOPULL`; - `Speed`: 定义最大切换速度比如高速度可写入`GPIO_SPEED_FREQ_HIGH`; 最后利用`HAL_GPIO_Init()`完成实际硬件资源分配工作[^2]。 ```c // 假定我们要把PA9配置为USART1_TX的复用推挽输出 GPIO_InitTypeDef GPIO_InitStruct = {0}; /*Configure GPIO pin : PA9 */ GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出模式 GPIO_InitStruct.Pull = GPIO_NOPULL; // 不使用上拉或下拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速频率 GPIO_InitStruct.Alternate = GPIO_AF7_USART1; // USART1 Alternate Function HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` 上述代码片段展示了如何针对USART1_TX信号线(PA9)执行必要的初始化操作,使其处于正确的状态以便后续数据传输过程正常运作[^3]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值