关于STM32 GPIO的上拉输入和下拉输入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于STM32 GPIO的上拉输入和下拉输入相关的知识,希望对你有一定的参考价值。

我想问的STM32的上拉输入和下拉输入的工作原理是什么。
因为按照上拉输入的概念,它是为了保证无信号输入时输入端的电平为高电平,
而下拉输入的概念则是为了保证无信号输入时输入端的电平为低电平。
现在我想通过读取相关GPIO的IDR去判断按键是否被按下。
下面给我的分析过程,看看是哪里出错了。
现在假设PB2通过轻触开关连接到Vcc,PB3通过轻触开关连接到GND。
我把PB2设为下拉输入,PB3设为上拉输入。
理由:PB2设为下拉输入,未按下开关时,引脚电平被下拉为低电平,即对应的IDR也为0,按下时引脚被强制变成高电平,此时IDR变为1,发生了改变。PB3设为上拉输入,未按下开关时,引脚电平被上拉为高电平,即对应的IDR也为1,按下时引脚被强制变成低电平,此时IDR变为0,也发生了改变。
但是我用软件仿真的时候发现PB3设为上拉输入时,只有ODR为高电平,IDR和Pins为低电平,请问这是为什么。按照上拉输入的概念,此时PB3的IDR和Pins,也就是IO口状态,不应该是高电平吗,怎么是低电平。
如果说当配置为输入模式时,引脚不能输出高电平,那么当PB3按下按键时,它又怎么知道引脚电平被拉低了。
跪求解释,这个卡了几天,真心求解。如果要程序就私信吧,这里发超过字数限制了。
对于GPIO的配置如第一张图

仿真的情况如第二张图

PB6、13为上拉输入,PC7、12为下拉输入,但是他们的状态一样的,这是为什么

我猜你是只在软件仿真,没有用JLINK或STLINK这些在线仿真的吧,软件没有收到你仿真的对应IO电平变化,所以你观察寄存器只是观察到GPIO的寄存器的值。

需要在pins对应的引脚处打上勾代替实际按键按下。

追问

就算我用J-Link也是一样的,因为PB3就只有ODR是高电平,IDR和Pins都是低电平,一开始就默认接地了

追答

你只要是设置了上拉ODR肯定是高电平。Pins上面应该没有电平。我这个是我人为打上的勾。。
另外你可以加个LED试试,比如判断某个IO变为低就改变LED状态。。而且你要在这个判断语句前加上断点进行测试。

参考技术A 上下拉只在IO口设为输入时起作用追问

这个我知道,我已经设为上拉/下拉输入,然后再去ODR改为上拉了

追答

你这句话理解有错:如果说当配置为输入模式时,引脚不能输出高电平,那么当PB3按下按键时,它又怎么知道引脚电平被拉低了。

解释:输入时就不存在输出的概念,事实上,如果不用上下拉,则为高阻态,其引脚电平完全取决与外部所接的电平,而内部必须用读出IO口来判断输入状态。

    另外输入输出是不同的电路,设置输入输出其实就是选通那个电路而已。

上图是个典型的GPIO图 两个虚线框就分别是输入出电路

本回答被提问者采纳

STM32--GPIO口的八种工作模式

GPIO的输入工作模式1——输入浮空模式:

GPIO_Mode_IN_FLOATING =0x04

技术分享

工作原理:配置完相应寄存器为此工作模式后,高低电平信号通过1处的IO口输入进去,由于寄存器配置了的缘故VDD处上拉和下拉均为断开状态。通过TTL施密特触发器后进入到3(输入数据寄存器)中,然后由MCU将数据读取。

适用场景:一般多用于外部按键输入;

 

 

GPIO的输入工作模式2——输入上拉模式:

GPIO_Mode_IPU =0x48

技术分享

工作原理:配置完相应寄存器为此工作模式后,高低电平信号通过1处的IO口输入进去,由于寄存器配置了的缘故VDD处上拉电阻(30K~50K)处于闭合状态。通过TTL施密特触发器后进入到3(输入数据寄存器)中,然后由MCU将数据读取。

适用场景:

 

 

GPIO的输入工作模式3——输入下拉模式:

GPIO_Mode_IPD =0x28

技术分享

工作原理:配置完相应寄存器为此工作模式后,高低电平信号通过1处的IO口输入进去,由于寄存器配置了的缘故VSS处下拉电阻(       )处于闭合状态。通过TTL施密特触发器后进入到3(输入数据寄存器)中,然后由MCU将数据读取。

适用场景:

 

 

GPIO的输入工作模式4——输入模拟模式:

GPIO_Mode_AIN =0x0

技术分享

工作原理:配置完相应寄存器为此工作模式后,模拟电压信号通过1处的IO口输入进去,由于寄存器配置了的缘故VDD处上拉和下拉电阻于断开状态。TTL施密特触发器也被关闭,一直将模拟电压信号输入至片上外设模块AD转换器,然后由MCU将数据读取。

适用场景:应用ADC模拟输入;低功耗下省电

 

 

GPIO的输出工作模式1——开漏输出模式:

GPIO_Mode_Out_OD=0x14

技术分享

工作原理:配置完相应寄存器为此工作模式后,MCU将要发送的数据位设置/清除寄存器和输出数据寄存器将高低电平信号发送到输出控制电路中,当电平为0时输出控制电路向N-MOS管给出信号,N-MOS管导通,将IO口电平拉低,输出低电平;当电平为1时,MOS管截止,不向IO口给出高低电平信号,IO口此时电平信号由外部电路中的上拉电阻拉到电源电压。

适用场景:

1、这种方式适合在连接的外设电压比单片机电压低的时候

2、一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连 接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功 能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以 改变传输电平。比如加上上拉电阻就可以提供TTL/CMOS电平输出等。(上拉 电阻的阻值决定了逻辑电平转换的沿的速度 。阻值越大,速度越低功耗越小, 所以负载电阻的选择要兼顾功耗和速度。)

 

 

GPIO的输出工作模式2——复用开漏输出模式:

GPIO_Mode_AF_OD=0x1c

技术分享

工作原理: 理解为GPIO口被用作第二功能时的配置情况,工作原理类似于“开漏输出模式”,只是要输出的电平信号来源不是mcu,而是复用功能输出通道,比如片上外设模块。

适用场景:

 

 

GPIO的输出工作模式3——推挽输出模式:

GPIO_Mode_Out_PP=0x10

技术分享

工作原理:配置完相应寄存器为此工作模式后,MCU将要发送的数据位设置/清除寄存器和输出数据寄存器将高低电平信号发送到输出控制电路中,当电平为0时输出控制电路向N-MOS管给出信号,N-MOS管导通,P-MOS管截止,将IO口电平拉低,输出低电平;当电平为1时,P-MOS管导通,N-MOS管截止,将IO口电平拉高,输出高电平,与此同时,IO口的高低电平状态可通过TTL施密特触发器后进入到3(输入数据寄存器)中,然后由MCU将IO口读取。

适用场景:

 

 

GPIO的输出工作模式3——复用推挽输出模式:

GPIO_Mode_AF_PP=0x18

技术分享

工作原理:理解为GPIO口被用作第二功能时的配置情况,工作原理类似于“推挽输出模式”,只是要输出的电平信号来源不是mcu,而是复用功能输出通道,比如片上外设模块。

 

以上是关于关于STM32 GPIO的上拉输入和下拉输入的主要内容,如果未能解决你的问题,请参考以下文章

STM32输入上拉下拉 寄存器怎么设置实现

GPIO输入输出模式

stm32GPIO8种模式

stm32 GPIO 输出配置参照

stm32-GPIO使用注意事项

stm32 GPIO的八种工作模式