[STM32]详解单片机GPIO输入模式配置-上拉下拉与浮空

文章详细介绍了STM32单片机GPIO的三种通用输入模式:上拉、下拉和浮空。在不同场景下,根据电路设计选择合适的输入模式,如按键检测时,接VSS使用上拉模式,接VDD使用下拉模式。还提到了内部电阻的限制和外部电阻的使用情况,以及低功耗设计中IO口的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面说到单片机的GPIO主要输出模式主要有推挽模式和开漏模式,除了连接到片内外设的模拟输入模式和复用输入功能以外,这里再说一下通用输入模式配置,STM32单片机的通用输入模式主要有输入浮空、输入上拉与输入下拉。

当配置成上拉模式,即GPIO_Mode_IPU时,IO端口内部通过上拉电阻连接到电源VDD。
当配置成下拉模式,即GPIO_Mode_IPD时,IO端口内部通过下拉电阻连接到电源VSS。
当配置成浮空模式,即GPIO_Mode_IN_FLOATING时,IO端口内部没有连接内部上下拉电阻。
只要时配置成任一输入模式,输出缓冲器将被禁止,IO口上的数据在每个总线时钟周期都会被写入到数据寄存器,此时对数据寄存器的读访问,可以得到IO端口的状态时低还是高。对于什么时候配置成上拉,什么时候配置成下拉,什么时候配置成浮空,要根据具体的电路应用进行选择。
一般,当检测信号发生时,被检测信号接到电源的低电位,如IO口通过按键接到VSS,此时应该配置为上拉模式,按键未按下时,读取IO状态为高电平1,按键按下时,由于外部接到VSS,此时读取IO状态为低电平0,

反之当检测信号发生时,被检测信号接到电源的高电位,如果IO口通过按键接到VDD,此时应该配置为下拉模式。按键未按下时,读取IO状态为低电平0,按键按下时,由于外部接到VDD,此时读取IO状态为高电平1。

但是往往电路设计为了保护IO口,不直接接到VDD或VSS,在外部会增加一些必要的限流电阻来实现与内部上拉下电阻的匹配。对于STM32F103系列单片机,内部上拉下拉电阻阻值典型值40K欧,最大为50K欧。通过电流能力较弱,如果需要提高信号波形爬升即下降速率时,还需要在IO口外面增加强拉电阻,使得时间常数变小,波形变化变快。另外较强的电流能力可以提高系统检测的抗干扰性,防止由于其他因素导致的误判。但是强拉电阻由于电流较大,又会增加系统的功耗,引起发热等问题,一般根据需要进行设计最好。

除了上拉下拉之外,如果外部电路设计已经匹配过相应的电平逻辑电阻,IO模式可以配置成浮空模式,这种模式的输入逻辑电平完全由外部电路决定。但是在一些多IO口总线并联的时候,考虑到IO口不对总线电平进行干扰,往往必须配置成浮空模式。
最后说一下,在单片机低功耗设计时,对于单片机的IO管脚,不用的IO口可以设置成模拟输入,甚至可以关闭一些IO口特殊功能和总线时钟,如:JTAG。可以降低单片机功耗。
上拉输入模式配置:
void IPU_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;



    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);



    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure);

}
下拉输入模式配置:
void IPD_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;



    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);



    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure);

}
浮空输入模式配置:
void INFLOATING_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;



    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);



    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure);

}


---------------------
作者:forgot
链接:https://bbs.21ic.com/icview-3282498-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值