关于STM32的GPIO输入、输出模式与配置方法

文章目录

  • 前言
  • 一、GPIO的功能描述
  • 二、GPIO的四种输入模式
  • 1.GPIO浮空输入_IN_FLOATING
  • 2.GPIO上拉输入_IPU
  • 3.GPIO下拉输入_IPD
  • 4.GPIO模拟输入_AIN
  • 三、GPIO的四种输出模式
  • 1.GPIO开漏输出_OUT_OD
  • 2.GPIO推挽输出_OUT_PP
  • 3.GPIO开漏复用输出_AF_OD
  • 4.GPIO推挽复用输出_AF_PP
  • 四、GPIO的配置方法
  • 1.定义GPIO引脚的结构体变量
  • 2.配置引脚的速度
  • 3.初始化结构体的变量
  • 4.初始化对应的端口

  • 前言

    我们在学习STM32的过程中,有时候会遇到原理不清楚的问题,所以本篇文章将对GPIO的输入输出模式与配置方法进行简单的介绍,方便各位同学理解与使用。
    注:本文部分图片来自于*STM32F10xxx参考手册。

    提示:以下是本篇文章正文内容,下面案例可供参考

    一、GPIO的功能描述

    每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_ IDR和GPIOx_ ODR),一个32位置位/复位寄存器(GPIOx_ BSRR),一个16位复位寄存器(GPIOx_ BRR)和一个32位锁定寄存器(GPIOx_ LCKR)。
    根据数据手册中列出的每个I/O端口的特定硬件特征,GPIO端口的每个位可以由软件分别配置成多种模式。

    -输入浮空
    -输入上拉
    -输入下拉
    -模拟输入
    -开漏输出
    -推挽式输出
    -推挽式复用功能
    -开漏复用功能

    二、GPIO的四种输入模式

    当IO口配置为输入时:

  • 输出缓冲器被禁止
  • 施密特触发输入被激活
  • 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接
  • 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
  • 对输入数据寄存器的读访问可得到I/O状态
  • 输入浮空、上拉、下拉配置

    1.GPIO浮空输入_IN_FLOATING

    浮空模式下CPU可以读取到外部输入的高或低电平


    输入信号经过施密特触发器接入输入数据存储器。当无信号输入时,电压不确定。
    可以认为输入端口阻抗无穷大,这样可以方便检测到微弱的信号。此时输入高电平即高电平,输入低电平即低电平。但是外界没有输入时输入电平却容易受到外界电磁干扰的影响。

    如:按键采用浮空输入,则在按键按下时输入电平为低,但是当松开按键时输入端口悬空,外界有微弱的干扰都会被端口检测到。此时端口可能高,也可能低。

    2.GPIO上拉输入_IPU

    与上一部分的浮空输入模式相比,仅仅是在数据通道上面,接入了一个上拉电阻。

    根据STM32的数据手册,这个上拉电阻阻值介于30K~50K 欧姆。
    同样,CPU可以随时在“输入数据寄存器”的另一端,通过内部的数据总线读出I/O 端口的电平变化的状态。

    无输入信号时端口电平被拉到高电平
    例如按键信号,当按下时输入低电平,松开时电平被拉到高电平。这样就不会出现按键松开时端口电平不确定的情况。即不知道时按下还是松开。

    3.GPIO下拉输入_IPD

    对于下拉模式的输入,其实是在数据通道的下部,接入了一个下拉电阻。

    根据STM32的数据手册,这个下拉电阻阻值也是介于30K~50K 欧姆。

    浮空输入在外界没有输入时状态不确定,可能对电路造成干扰。为了使得电路更加稳定,不出现没有输入时端口的输入数据被干扰 (比如手碰一下电压就发生变化)。
    这时就需要下拉(上拉)电阻。此电阻与端口输入阻抗相比仍然较小。有输入信号时端口读取输入信号,无输入信号时端口电平被拉到低(高)电平。
    当单片机的IO口作输出时,如果不接上拉电阻只能提供灌电流。无法输出电流驱动外接设备。这时也需要考虑上拉电阻。这样才可以使IO输出高电平。

    4.GPIO模拟输入_AIN

    如果把STM32配置为模拟输入模式时,工作原理就十分简单了,信号从左边编号为1 的端口进从右边编号为2的一端直接进入STM32单片机的AD模块。

    输入信号不经施密特触发器直接接入,输入信号为模拟量而非数字量,其余输入方式输入数字量。

    以上分析的是GPIO的输入模式,下面分析它的输出模式。

    三、GPIO的四种输出模式

    当I/O端口被配置为输出时:

  • 输出缓冲器被激活
    ——开漏模式:输出寄存器上的‘0’激活N-MOS,而输出寄存器上的‘1’将端口置于高阻状态(P-MOS从不被激活)。
    ——推挽模式:输出寄存器上的‘0’激活N-MOS,而输出寄存器上的‘1’将激活P-MOS。
  • 施密特触发输入被激活
  • 弱上拉和下拉电阻被禁止
  • 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
  • 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态
  • 在推挽式模式时,对输出数据寄存器的读访问得到最后–次写的值。
  • 当I/O口被配置为复用时:

  • 在开漏或推挽式配置中,输出缓冲器被打开
  • 内置外设的信号驱动输出缓冲器(复用功能输出)
  • 施密特触发输入被激活
  • 弱上拉和下拉电阻被禁止
  • 在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器
  • 开漏模式时,读输入数据寄存器时可得到I/O口状态
  • 在推挽模式时,读输出数据寄存器时可得到最后一次写的值
  • 1.GPIO开漏输出_OUT_OD

    开漏输出即漏极开路输出。需要接上拉电阻才能输出1

    开漏输出高电平时是由外接电源输出的,因此可以实现高于输出端口电压的输出。可以实现电平的转换。开漏输出可以实现线与功能,方法是多个输出共接一个上拉电阻。但是漏极开路输出上升沿慢,因为上升沿是外接电源对上拉电阻以及外接负载充电。

    2.GPIO推挽输出_OUT_PP

    GPIO的推挽输出模式是在开漏输出模式的基础上,在“输出控制电路”之后,增加了一个P-MOS管

    当CPU输出逻辑“1 ”时,编号3 处的P-MOS管导通,而下方的N-MOS管截止,达到输出高电平的目的

    当CPU输出逻辑“0 ”时,编号3 处的P-MOS管截止,而下方的N-MOS管导通,达到输出低电平的目的

    在这个模式下,CPU 仍然可以从“输入数据寄存器”读到该IO端口电压变化的信号

    3.GPIO开漏复用输出_AF_OD

    GPIO的开漏复用输出模式与开漏输出模式的工作原理基本相同

    不同的是编号为2的输入源不同,它是和复用功能的输出端相连

    此时的“输出数据寄存器”被输出通道给断开了。

    同样,CPU也可以从“输入数据寄存器”读取到外部IO端口变化的电平信号。

    4.GPIO推挽复用输出_AF_PP

    编号2 “输出控制电路” 输入与复用功能的输出端相连

    此时“输出数据寄存器”被从输出通道断开了,片上外设的输出信号直接与“输出控制电路”的输入端想连接。

    在将GPIO配置成复用输出功能后,假如相应的外设模块没有被激活,那么此时IO端口的输出将不确定。

    四、GPIO的配置方法

    1.定义GPIO引脚的结构体变量

    GPIO_InitTypeDef GPIO_InitStructure;
    

    2.配置引脚的速度

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
    

    3.初始化结构体的变量

    (1)引脚

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    

    (2)速度

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    

    (3)模式

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    

    模式的配置介绍:

    一个IO口需要4个bit来控制:
    CNF MODE CNF MODE
    00 00 ~ 11 11
    也就是十六进制的 0x 0 ~ 0x F

    其中MODE是设置输入输出模式::

  • 00:输入(复位后的状态)
  • 01:输出,最大速度10MHz
  • 10:输出,最大速度2MHz
  • 11:输出,最大速度50MHz
  • 而CNF是在MODE的基础上选择更细分的模式:

    (1)当MODE为00,即输入模式下:

  • 00:模拟输入
  • 01:浮空输入
  • 10:上拉/下拉输入
  • 11:保留
  • (2)当MODE为01,10,11,即输出模式时:

  • 00:推挽输出
  • 01:开漏输出
  • 10:复用推挽输出
  • 11:复用开漏输出
  • 4.初始化对应的端口

     GPIO_Init(GPIOC, &GPIO_InitStructure);
     GPIO_Init(GPIOE, &GPIO_InitStructure);
    

    (1) 作为普通GPIO输入:
    根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。
    (2) 作为普通GPIO输出:
    根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。
    (3) 作为普通模拟输入:
    配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。(A/D模拟输入)
    (4) 作为内置外设的输入:
    根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。
    (5)作为内置外设的输出:
    根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 关于STM32的GPIO输入、输出模式与配置方法

    发表评论