1、GPIO工作原理

  • 1、GPIO工作原理
  • 1.1关于I/O输入口两个电阻
  • 1.2GPIO的八种输入输出模式
  • 1.2.1浮空输入模式
  • 1.2.2上拉输入模式
  • 1.2.3下拉输入模式
  • 1.2.4模拟输入模式
  • 1.2.5开漏输出模式
  • 1.2.6开漏复用输出模式
  • 1.2.7推挽输出模式
  • 1.2.8推挽复用输出模式
  • 1.3GPIO端口复用
  • 1.4GPIO端口重映射
  • 2、GPIO相关寄存器
  • 3、GPIO库函数的配置
  • 1、GPIO工作原理

    GPIO是通用输入输出端口(General-purpose input/output)的英文简写,是所有的微控制器必不可少的外设之一,可以由STM32直接驱动从而实现与外部设备通信、控制以及采集和捕获的功能。STM32单片机的GPIO被分为很多组,每组有16个引脚,不同型号的MCU的GPIO个数是不同的,比如STM32F103C8T6只有PA、PB以及个别PC引脚而STM32F103ZET6拥有PA~PG的全部112个引脚。所有的GPIO都有基本的输入输出功能,同时GPIO还可以作为其它的外设功能引脚。

    作为STM32最基本的外设,GPIO最基本的输出功能是由STM32控制 引脚输出高低电平,比如可以把GPIO接LED灯来控制其亮灭,也可以接继电器或者三极管,通过继电器或三极管来控制外部大功率电路的通断。

    GPIO最基本的输入功能是检测外部电平变化,比如把GPIO引脚连接到按键电路,通过电平的高低变化来识别按键是否被按下。

    下图为GPIO的硬件结构框图,可以从这个框图中清晰的了解GPIO外设极其各种应用模式,最右端的I/O引脚就是STM32芯片引出的GPIO引脚,其它的部件都位于芯片内部。
    ​​​​​​

    1.1关于I/O输入口两个电阻

    2、关于I/O输入口两个电阻
    为了防止芯片被外部过高或者过低的输入电压烧坏,STM32内置两个保护二极管对输入电压进行限幅,当引脚输入电压高于VDD时上方的二极管导通,当引脚电压低于Vss时,下方的二极管导通,由于二极管是相对于vss电压的可以接收负的电压,这样就可以防止不正常的电压引入芯片导致芯片烧毁。(如下图所示)

    1.2GPIO的八种输入输出模式

    1.2GPIO的八种输入输出模式

    STM32的GPIO共有8种工作模式,分别是输入模式的模拟输入、上拉输入、下拉输入和浮空输入以及输出模式的推挽输出、开漏输出、推挽复用输出和开漏复用输出,接下给大家一一介绍。

    1.2.1浮空输入模式

    1.2.1浮空输入模式

    GPIO作为输入功能的浮空输入时,电信号使由外部流向内部的,从结构图的右侧往左侧看,信号流经顺序是①端口——②施密特触发器——③输入数据寄存器——④读取

    1.2.2上拉输入模式

    1.2.2上拉输入模式

    上拉输入和浮空输入的区别就是在第①和第②之间多了一个上拉电阻,这样GPIO在没有连接外部部件时的默认电平是高电平,其它流程和原来一样。

    1.2.3下拉输入模式

    1.2.3下拉输入模式

    下拉输入和浮空输入的区别就是在第①和第②之间多了一个下拉电阻,这样GPIO在没有连接外部部件时的默认电平是低电平,其它流程和原来一样。

    1.2.4模拟输入模式

    1.2.4模拟输入模式

    模拟输入模式和其它三种输入模式不同,它的外部电平信号没有流入输入数据寄存器,而是直接流入模拟输入部分。模拟输入一般是用来ADC读取和转换的。

    1.2.5开漏输出模式

    1.2.5开漏输出模式

    GPIO 的输出模式比输入模式复杂,首先看开漏输出模式,电平信号由STM32内部流出引脚,因此流向是①写(包括位设置/清除寄存器、输出数据寄存器)——②输出控制电路——③N-MOS管——④I/O端口

    位设置/清除寄存器写入的值会映射到输出数据寄存器,最终到达输出控制电路,如果写入的是1,则N-MOS管关闭,由于N-MOS管截止,所以最后输出的电平不会由写入的1来决定,因此此时的输出为高阻态(类似浮空状态),真正的输出电压由外部的上下拉电阻来决定。它具有“线与”特性,也就是说,若有很多个开漏模式引脚连接到一起时,只有当所有引脚都输出高阻态,才由上拉电阻提供高电平,此电平的电压为外部上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当于短路接地,使得整条线路都为低电平0伏。若写入0,则N-MOS管处于开启状态,输出电流被拉到VSS,因此可以输出强低电平。输出的电平信号可以被输入数据寄存器读取。

    1.2.6开漏复用输出模式

    1.2.6开漏复用输出模式

    开漏复用输出和开漏输出的区别在于信号来源,复用的来源不是内部直接通过输出数据寄存器写的,而是由复用功能的外设决定的。

    1.2.7推挽输出模式

    1.2.7推挽输出模式

    推挽输出模式和开漏输出模式有一定的区别,其控制输出的寄存器是一样的,但是②部分的写1有效,即输出控制电路输出1的时候,P-MOS管导通,N-MOS管截止,这样I/O口电平就会被P-MOS管拉高,输出强高电平;相反,当输出控制电路输出0时,P-MOS管截止,N-MOS管导通,I/O端口电平被N-MOS管拉低,输出强低电平。同样,输出的电平信号可以被输入数据寄存器读取。

    1.2.8推挽复用输出模式

    1.2.8推挽复用输出模式

    推挽复用输出和推挽输出的区别在于信号来源,其信号来源是由复用功能相关的通信通道来控制。

    1.3GPIO端口复用

    1.3GPIO端口复用
    为了最大限度的利用端口资源,STM32的大部分端口都具有复用功能。

    所谓复用,就是一些端口不仅仅可以做为通用IO口,还可以复用为一些外设引脚,比如PA9,PA10可以复用为STM32的串口1引脚。复用情况可以查找数据手册。

    1.4GPIO端口重映射

    1.4GPIO端口重映射
    为了方便布线 ,STM32配有端口重映射功能,所谓重映射就是可以把某些功能引脚映射到其他引脚。比如串口1默认引脚是PA9,PA10可以通过配置重映射映射到PB6,PB7。

    端口的映射情况也可以通过查找数据手册来获得。

    2、GPIO相关寄存器

    2、GPIO相关寄存器
    STM32的每组GPIO都包含7个寄存器,分别是:

        -  GPIOx_CRL :端口配置低寄存器
    
        - GPIOx_CRH:端口配置高寄存器
    
        - GPIOx_IDR:端口输入寄存器
    
        - GPIOx_ODR:端口输出寄存器
    
        - GPIOx_BSRR:端口位设置/清除寄存器
    
        - GPIOx_BRR :端口位清除寄存器
    
        - GPIOx_LCKR:端口配置锁存寄存器
    

    每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问) 。

    3、GPIO库函数的配置

    3、GPIO库函数的配置

    1、初始化函数:
    void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

    作用:初始化一个或者多个IO口(同一组)的工作方式和速度。

    GPIO_Init函数初始化样例:

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO模式:

    typedef enum

    { GPIO_Mode_AIN = 0x0, //模拟输入

    GPIO_Mode_IN_FLOATING = 0x04, //浮空输入

    GPIO_Mode_IPD = 0x28, //输入下拉

    GPIO_Mode_IPU = 0x48, //输入上拉

    GPIO_Mode_Out_OD = 0x14, //开漏输出

    GPIO_Mode_Out_PP = 0x10, //推挽输出

    GPIO_Mode_AF_OD = 0x1C, //开漏复用输出

    GPIO_Mode_AF_PP = 0x18 //推挽复用输出

    }GPIOMode_TypeDef;

    GPIO输出速度:

    typedef enum {

    GPIO_Speed_10MHz,

    GPIO_Speed_2MHz,

    GPIO_Speed_50MHz

    }
    GPIOSpeed_TypeDef;

    2、4个设置输出电平函数:
    void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

    void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

    void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    作用:设置某个IO口输出为高电平(1)。实际操作BSRR寄存器

    void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    作用:设置某个IO口输出为低电平(0)。实际操作的BRR寄存器。

    3、2个读取输出电平函数:
    uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

    uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

    4、2个读取输入电平函数:
    uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

    uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
    作用:读取某组GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。

    作者:慕北449

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 GPIO端口全面解析

    发表回复