• 关于STM32中GPIO的8种工作模式


    转载自:https://blog.csdn.net/L20130316/article/details/50571902

    1 综述

    I/O口是单片机中非常常用的外设,STM32的I/O口有8种状态,虽然一直在使用过程中没有遇到什么问题,但是一直都不是很清楚,因此这里做一个总结(实际上这里的概念也是和STM8等其他单片机,理解了这8中状态,也就基本上理解了大部分I/O口)。

    2 庐山真面目

    我们在库文件中的"stm32f10x_gpio.h"中可以看到如下代码:

    1.  
      typedefenum
    2.  
      {
    3.  
      GPIO_Mode_AIN = 0x0,
    4.  
      GPIO_Mode_IN_FLOATING = 0x04,
    5.  
      GPIO_Mode_IPD = 0x28,
    6.  
      GPIO_Mode_IPU = 0x48,
    7.  
      GPIO_Mode_Out_OD = 0x14,
    8.  
      GPIO_Mode_Out_PP = 0x10,
    9.  
      GPIO_Mode_AF_OD = 0x1C,
    10.  
      GPIO_Mode_AF_PP = 0x18
    11.  
      }GPIOMode_TypeDef;



    上面因为是英文,不甚清晰,下面下面翻译一下:

    1.  
      typedefenum
    2.  
      {
    3.  
      GPIO_Mode_AIN = 0x0, /* 模拟输入 */
    4.  
      GPIO_Mode_IN_FLOATING = 0x04, /* 浮空输入,复位后的状态 */
    5.  
      GPIO_Mode_IPD = 0x28, /* 下拉输入,这里的下拉是指单片机内部的电阻 */
    6.  
      GPIO_Mode_IPU = 0x48, /* 上拉输入,这里的上拉是指单片机内部的电阻 */
    7.  
      GPIO_Mode_Out_OD = 0x14, /* 开漏输出 */
    8.  
      GPIO_Mode_Out_PP = 0x10, /* 推挽输出 */
    9.  
      GPIO_Mode_AF_OD = 0x1C, /* 复用开漏输出 */
    10.  
      GPIO_Mode_AF_PP = 0x18 /* 复用推挽输出 */
    11.  
      }GPIOMode_TypeDef;

    在芯片资料中我们可以看到,I/O口的基本结构如下(5V兼容I/O位的基本结构图省略):

    由于我们使用函数库开发,因此本文就不再接扫具体的位操作了。

    3 分别介绍

    3.1 模拟输入(Analog input)

    顾名思义,就是这个I/O口(input/output口)当作input使用,并且是模拟输入。模拟输入状态下用来接受模拟量(电压值),一般用于AD采集。

    3.2 浮空输入(Floating input)

    也叫悬浮输入,一般把浮空输入和上拉输入做类比学习。上拉输入的时候,引脚内部有一个上拉电阻通过开关连接到电源VDD,当引脚没有和外部电路连接时,设置上拉输入方式的I/O引脚电平是确定的高电平(相同的,下拉输入就是确定的低电平)。而浮空输入则不同,它的电瓶水hi不确定的,即使外部的一个很小的输入信号都会使其发生改变。如果引脚设置为悬空的情况下,读取该端口的电平是不确定的。

    3.3 下拉输入(Input down)

    顾名思义,很好理解,可以参见3.2 浮空输入

    3.4 上拉输入(Input up)

    顾名思义,很好理解,可以参见3.2 浮空输入

    3.5 开漏输出(Open Collector Output)

    输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。开漏形式的电路有以下几个特点:

    1、利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经上拉电阻、MOSFET到GND。IC内部仅需很小的栅极驱动电流。

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

    3、开漏输出提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。

    4、可以将多个开漏输出连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成"与逻辑"关系,即"线与"。可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑0,相当于接地,与之并联的回路"相当于被一根导线短路",所以外电路逻辑电平便为0,只有都为高电平时,与的结果才为逻辑1。

    开漏输出就是不输出电压,低电平时接地,高电平时不接地。如果外接上拉电阻,则在输出高电平时电压会拉到上拉电阻的电源电压。这种方式适合在连接的外设电压比单片机电压低的时候。输出端出跟集电极开路十分相似,工作原理也是一样的。不同的是,开漏输出使用的场效应管,使用时要加上拉电阻。(挺绕的,有机会用具体工程来介绍)

    3.6 推挽输出(Push-Pull Output)

    推挽输出可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源决定。

    推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。

    关于推挽输出和开漏输出,用一幅最简单的图形来概括:该图中左边的便是推挽输出模式,其中比较器输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;当比较器输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平。右边的则可以理解为开漏输出形式,需要接上拉。

    3.7 复用开漏输出

    可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。

    3.8 复用推挽输出

    与复用开漏输出一样,可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。

    4 使用场景总结

    1、浮空输入GPIO_IN_FLOATING ——浮空输入,可以做KEY识别,RX1。

    2、带上拉输入GPIO_IPU——IO内部上拉电阻输入,有时也用作KEY是些。

    3、带下拉输入GPIO_IPD—— IO内部下拉电阻输入,有时也用作KEY是些。

    4、模拟输入GPIO_AIN ——应用ADC模拟输入,或者低功耗下省电。

    5、开漏输出GPIO_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能。

    6、推挽输出GPIO_Mode_Out_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的。用的最多了。

    使用SPI芯片等的时候,片选引脚就是该模式。

    7、复用功能的推挽输出GPIO_AF_PP ——片内外设功能(I2C的SCL,SDA)

    8、复用功能的开漏输出GPIO_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)

    在使用SPI芯片的时候,SCK MISO MOSI管教就是该模式

    5 STM32项目实例

    1、作为普通GPIO输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。

    2、作为普通GPIO输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。

    3、作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。

    4、作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。

    5、作为内置外设的输出:根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。

    注意如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。比如要使用STM32F103VBT6的47、48脚的USART3功能,则需要配置47脚为复用推挽输出或复用开漏输出,配置48脚为某种输入模式,同时使能USART3并保持I2C2的非使能状态。如果要使用STM32F103VBT6的47脚作为TIM2_CH3,则需要对TIM2进行重映射,然后再按复用功能的方式配置对应引脚。

  • 相关阅读:
    打印九九乘法表
    PAT (Basic Level) Practice (中文) 1091 N-自守数 (15分)
    PAT (Basic Level) Practice (中文)1090 危险品装箱 (25分) (单身狗进阶版 使用map+ vector+数组标记)
    PAT (Basic Level) Practice (中文) 1088 三人行 (20分)
    PAT (Basic Level) Practice (中文) 1087 有多少不同的值 (20分)
    PAT (Basic Level) Practice (中文)1086 就不告诉你 (15分)
    PAT (Basic Level) Practice (中文) 1085 PAT单位排行 (25分) (map搜索+set排序+并列进行排行)
    PAT (Basic Level) Practice (中文) 1083 是否存在相等的差 (20分)
    PAT (Basic Level) Practice (中文) 1082 射击比赛 (20分)
    PAT (Basic Level) Practice (中文) 1081 检查密码 (15分)
  • 原文地址:https://www.cnblogs.com/shannen/p/13438595.html
Copyright © 2020-2023  润新知