#申请原创# 前面说到单片机的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);
}
|