江科大基于标准库的GPIO八种模式在嵌入式Stm32中的应用

文章目录

  • 一:GPIO输入输出原理
  • 二:GPIO基本结构
  • 三:GPIO位结构
  • 四:GPIO的八种模式
  • 道友:相信别人,更要一百倍地相信自己。
  • (推荐先看文章:《
    嵌入式-32单片机-GPIO推挽输出和开漏输出》)

    下文图都是从参考手册借阅:STM32F10xxx(中文),大概页数是110/775左右

    一:GPIO输入输出原理

    GPIO(General Purpose Input Output)通用输入输出口
    可配置为8种输入输出模式
    引脚电平:0V~3.3V,部分引脚可容忍5V(有FT标识)
    输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
    输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

    二:GPIO基本结构

    GPIO的基本结构图

  • 上图是GPIO的基本结构图。在Stm32中,所有的GPIO都挂载在APB2外设总线上。每个GPIO模块内,包括有寄存器、驱动器、引脚等 寄存器就是一段特殊的存储器,内核可以通过APB2总线对寄存器进行读写,从而完成输出电平和读取电平的功能。该寄存器的每一位都对应一个引脚,由于STM32是32位的单片机,所以所有的寄存器都是32位的,也就是说只有寄存器的低16位对应上了相应的GPIO口(好多时候高16位置0,低16位才真正控制寄存器)

  • 驱动器就是增加信号的驱动能力的。

  • 注意:stm32F103c8t6芯片上48个引脚,除了基本的电源和晶振等维持系统外,分别包括PA0~PA15、PB0-PB15、PC0 ~PC15。

    三:GPIO位结构

    GPIO位结构
    上图分为输入部分和输出部分,看虚线框

    输入部分:

  • 整个框架从左往右依次是寄存器、驱动器、IO引脚,从上到下分为“输入”、“输出”。
  • 最右侧的IO引脚上两个保护二极管,其作用是对IO引脚的输出电压进行限幅在0~3.3V之间,进而可以避免过高的IO引脚输入电压对电路内部造成伤害。Vdd = 3.3V,Vss = 0V。
  • 过压保护:当I引脚输入10V时,电压从输入引脚到保护二极管再到Vdd,有电压差就能流通,这叫过压保护。
  • 低压保护:当I引脚输入低于0V时,这叫做负电压,此时,电流流向为:从Vss →I引脚,这叫低压保护。
  • 输入驱动器的上、下拉电阻(图中像弹簧那两根):相应的开关可以通过程序进行配置,分别有上拉输入模式(上开关导通,下开关断开)、下拉输入模式(下开关导通&上开关断开)、浮空输入模式(两个开关都断开)。
    下拉电阻的作用几时给引脚输入提供一个默认的输入电平,进而避免引脚悬空导致的不确定。都属于弱上拉,弱下拉。

  • 输入驱动器的触发器:这里是用肖特基管构成的施密特触发器。只有高于上限、低于下限电压才进行变化,作用是对输入电压进行整形,可以消除电压波纹、使电压的上升沿/下降沿更加陡峭。也就是说,stm32的GPIO的端口会自动对输入的数字电压进行整形。比如像那种方波在变化的那个瞬间进行消抖,20ms.

  • “模拟输入”、“复用功能输入”:都是连接到片上外设的一些端口,前者用于ADC等需要模拟输入的外设,后者用于串口输入引脚等需要数字量的外设。

  • 输出部分:

  • 输出数据:可以由输出数据寄存器(普通的IO口输出)、片上外设来指定,数据选择器控制数据来源。
  • 位设置/清除寄存器:单独操作输出数据的某一位,而不影响其他位。
  • 驱动器中的MOS管:MOS管相当于一种开关,输出信号来控制这两个MOS管的开启状态,进而输出信号。可以选择推挽、开漏、关闭三种输出方式(推荐先看文章:《嵌入式-32单片机-GPIO推挽输出和开漏输出》),P-MOS相当于Q1,N-MOS相当于Q2
  • 推挽输出模式:两个MOS管均有效,stm32对IO口有绝对的控制权,也称为强推输出模式。
  • 开漏输出模式:P-MOS无效。只有低电平有驱动能力,高电平输出高阻。
  • 关闭模式:两个MOS管均无效,端口电平由外部信号控制。
  • 补充说明:stm32如何将数据写入寄存器?

  • 通过软件的方式。由于stm32的寄存器只能进行整体读写,所以可以先将数据全部读出,然后代码中用&= 清零、|= 置位的方式改变单独某一位的数据,再将该写后的数据写回寄存器。此方法比较麻烦,效率不高,对于IO口进行操作不合适(这就是基于寄存器开发的麻烦之处,所以有了基于标准库的开发)

  • 通过位设置/清除寄存器。若对某一位 置1,只需对位设置寄存器的相应位值1;若对某一位 清零,则对清除寄存器相应位 清零。这种方式通过内置电路完成操作,一步到位。

  • 通过读写stm32中的“位带”区域。在stm32中,专门分配有一段地址区域,该区域映射了RAM和外设寄存器所有的位。读写这段地址中的数据,就相当于读写所映射位置的某一位。整体流程与51单片机中的位寻址作用差不多。本教程不涉及。

  • 四:GPIO的八种模式

    模式名称 性质 特征
    浮空输入 数字输入 可读取引脚电平,若引脚悬空则电平不确定,容易受外界影响所以需要连续驱动源
    上拉输入 数字输入 可读取引脚电平,内部连接上拉电阻,悬空时默认高电平
    下拉输入 数字输入 可读取引脚电平,内部连接下拉电阻,悬空时默认低电平
    模拟输入 模拟输入 GPIO无效,会关闭数字输入开启模拟输入,引脚直接接入内部ADC(ADC专属配置)
    开漏输出 数字输出 可输出引脚电平,高电平为高阻态,低电平接Vss
    推挽输出 数字输出 可输出引脚电平,高电平接VDD,低电平接Vss
    复用开漏输出 数字输出 由片上外设控制,高电平为高阻态,低电平接Vss
    复用推挽输出 数字输出 由片上外设控制,高电平接VDD,低电平接Vss

    上表给出了GPIO的八种模式,通过配置GPIO的端口配置寄存器即可选择相应的模式。

    1. 每一个端口的模式由四位进行控制,16个端口就需要64位,所以这里的配置寄存器有两个(一个是端口低配置寄存器,一个是端口配置高寄存器),也就是两个32位寄存器,即端口配置低寄存器、端口配置高寄存器。
    2. 输入模式下,输出无效;而输出模式下,输入有效。这是因为一个端口只能有一个输出,但可以有多个输入,所以直接将输出信号输入回去也没问题。
      3.端口配置低寄存器低16位对应16个引脚,高16位没有使用;端口配置高寄存器,同样是低16位对应16个引脚,高16位没有使用。

    端口位设置/清除寄存器的高16位进行位清除的,低16位是进行位设置的

    寄存器:暂时记录数据的模块。

    复用开漏/推挽输出:引脚的控制权转移到了片上外设
    stm32串口默认是半双工的。

    三极管可看成两个二极管构成(背靠背)

    参考:B站STM32江协自动化&【哈工大虎慕】

    道友:相信别人,更要一百倍地相信自己。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 江科大基于标准库的GPIO八种模式在嵌入式Stm32中的应用

    发表评论