发新帖本帖赏金 30.00元(功能说明)我要提问
返回列表
打印
[STM32]

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

[复制链接]
1836|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
forgot|  楼主 | 2023-2-7 15:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#申请原创#
前面说到单片机的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口,不直接接到VDDVSS,在外部会增加一些必要的限流电阻来实现与内部上拉下电阻的匹配。对于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);
}



使用特权

评论回复

打赏榜单

21ic小管家 打赏了 30.00 元 2023-03-13
理由:签约作者奖励

相关帖子

发新帖 本帖赏金 30.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1762

主题

13158

帖子

55

粉丝