[STM32]详解单片机GPIO输入模式配置

您所在的位置:网站首页 下拉选择输入 [STM32]详解单片机GPIO输入模式配置

[STM32]详解单片机GPIO输入模式配置

2024-07-15 14:11| 来源: 网络整理| 查看: 265

前面说到单片机的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所有,任何人未经允许禁止转载。 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3