第14章. GPIO简介

目录

0. 《STM32单片机自学教程》专栏

14.1 GPIO基本结构

14.1.1 保护二极管 

14.1.2 上拉、下拉电阻 

14.1.3 施密特触发器

14.1.4  P-MOS 管和 N-MOS 管

14.1.5 输出数据寄存器

14.1.6 输入数据寄存器

14.2 GPIO工作模式

14.2.1 输入模式

14.2.1.1 输入浮空模式

14.2.1.2 输入上拉模式 

14.2.1.3 输入下拉模式

14.2.1.4 模拟输入模式

14.2.2 输出模式 

14.2.2.1 推挽输出模式

14.2.2.2 开漏输出模式

14.2.3 复用功能

14.3 GPIO寄存器介绍 

14.3.1  端口配置寄存器(GPIOx_CRL 和 GPIOx_CRH)

14.3.2  端口输出数据寄存器(GPIOx_ODR) 

14.3.3 端口置位/复位寄存器(GPIOx_BSRR)

14.4 GPIO库函数

14.5 应用说明


0. 《STM32单片机自学教程》专栏

        本文作为专栏《STM32单片机自学教程》专栏其中的一部分,返回专栏总纲,阅读所有文章,点击Link:  

STM32单片机自学教程-[目录总纲]_stm32 学习-CSDN博客     

        从本章开始我们就要开始外设等相关模块的介绍。 我们首先要介绍的就是GPIO,因为我认为GPIO是最基础也是最重要的一个外设功能。那么后续针对每一个外设,我们大致都会从下面几个部分进行讲解:

        1.硬件结构及原理

        2.相关寄存器

        3.相关库函数

        4.实例练习

14.1 GPIO基本结构

        GPIO 有八种工作模式,为讲清楚这些模式的实现原理,我们需要先讲解GPIO的基本结构,总的框图如图14.1-1所示。右边I/O 引脚就是我们可以看到的芯片实物的引脚,其余部分均为GPIO 的内部结构。 

图14.1-1 GPIO的基本结构图

14.1.1 保护二极管 

        引脚的两个保护二级管可以防止引脚外部过高或过低的电压输入,当引脚电压高于VDD 时,上方的二极管导通,当引脚电压低于 VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。 虽然有二极管的保护,但这样的保护却很有限,大电压大电流的接入很容易烧坏芯片。

14.1.2 上拉、下拉电阻 

        上下拉电阻的阻值大概在30~50K欧之间,可以通过上、下两个对应的寄存器控制开关。当引脚外部的器件没有干扰引脚的电压时,即没有外部的上、下拉电压,引脚的电平由引脚内部上、下拉决定。内部上拉电阻工作时引脚电平为高电平,内部下拉电阻工作时,则引脚电平为低电平。如果内部上、下拉电阻都不开启,这种情况就是浮空模式。浮空模式下引脚的电平是不可确定的。引脚的电平可以由外部的上、下拉电平决定。由于上下拉电阻的阻值较大,STM32的内部上拉是一种“弱上拉”,这样的上拉电流很弱,如果有要求大电流还是得外部上拉。

14.1.3 施密特触发器

        图中的TTL肖特基触发器即为施密特触发器,当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变。也就是说输出由高电平翻转为低电平,或是由低电平翻转为高电电平对应的阈值电压是不同的。只有当输入电压发生足够的变化时,输出才会变化,因此将这种元件命名为触发器。这种双阈值动作被称为迟滞现象。我们软件开发种经常用到“滞环调节”,是一个道理,一个经常的应用场景是防止在边界附件来回震荡。施密特触发器可作为波形整形电路,能将模拟信号波形整形为数字电路能够处理的方波信号。

14.1.4  P-MOS 管和 N-MOS 管

        这种双MOS管结构,主要控制GPIO的开漏输出和推挽输出两种模式。这里我们只用记住,PMOS输入低电平时导通,NMOS输入高电平时导通即可。详细内容,后面还会介绍。

14.1.5 输出数据寄存器

        刚到的双MOS管结构电路的输入信号,是由GPIO“输出数据寄存器GPIOx_ODR”提供的,因此我们通过修改输出数据寄存器的值就可以修改GPIO引脚的输出电平。也可以通过“置位/复位寄存器GPIOx_BSRR”修改输出数据寄存器的值,来控制电路的输出。

14.1.6 输入数据寄存器

        GPIO引脚经过内部的上、下拉电阻,可以配置成上/下拉输入,然后再连接到施密特触发器,信号经过触发器后,模拟信号转化为0、1的数字信号,然后存储在“输入数据寄存器GPIOx_IDR”中,通过读取该寄存器就可以了解GPIO引脚的电平状态。

14.2 GPIO工作模式

        GPIO有八种工作模式,分别如下,我们分输入,输出和复用功能3个大类进行描述。

        1、输入浮空

        2、输入上拉

        3、输入下拉

        4、模拟输入

        5、开漏输出

        6、推挽输出

        7、开漏式复用功能

        8、推挽式复用功能

14.2.1 输入模式

        在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器GPIOx_IDR读取I/O状态。其中输入模式,可设置为上拉、下拉、浮空和模拟输入四种。

14.2.1.1 输入浮空模式

        上拉/下拉电阻为断开状态,施密特触发器打开,输出被禁止。输入浮空模式下,IO口的电平完全是由外部电路决定。如果IO引脚没有连接其他的设备,那么检测其输入电平是不确定的。该模式通常用于按键检测等场景。

图14.2-1 输入浮空模式 

14.2.1.2 输入上拉模式 

        上拉电阻导通,施密特触发器打开,输出被禁止。在需要外部上拉电阻的时候,可以使用内部上拉电阻,这样可以节省一个外部电阻,但是内部上拉电阻的阻值较大,所以只是“弱上拉”,不适合做电流型驱动。

图14.2-2 输入上拉模式 

14.2.1.3 输入下拉模式

        下拉电阻导通,施密特触发器打开,输出被禁止。在需要外部下拉电阻的时候,可以使用内部下拉电阻,这样可以节省一个外部电阻,但是内部下拉电阻的阻值较大,所以不适合做电流型驱动。  

图14.2-3 输入上拉模式 

14.2.1.4 模拟输入模式

        此模式下上下拉电阻断开,施密特触发器关闭,双 MOS 管也关闭。其他外设可以通过模拟通道输入输出。该模式下需要用到芯片内部的模拟电路单元单元,用于ADC/DAC等操作模拟信号的外设。  

        当GPIO引脚用于ADC采集电压的输入通道时,用作“模拟输入”功能,此时信号是不经过施密特触发器的,因为经过施密特触发器后信号只有0、1两种状态,所以ADC外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。同样,当GPIO引脚用于DAC作为模拟电压输出通道时,此时作为“模拟输出”功能,DAC的模拟信号输出就不经过双MOS管结构,模拟信号直接输出到引脚。

图14.2-4 模拟输入模式 

14.2.2 输出模式 

        输出模式主要是由双MOS管的开闭控制来实现的,画了一个示意图,如图14.2-5所示。在输出模式中,推挽模式时双MOS管以轮流方式工作,输出数据寄存器GPIOx_ODR可控制I/O输出高低电平。开漏模式时,只有N-MOS管工作,输出数据寄存器可控制I/O输出高阻态或低电平。输出速度可配置,有2MHz\10MHz\50MHz的选项。此处的输出速度即I/O支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求不严格,把速度设置成最大即可。

        在输出模式时施密特触发器是打开的,即可通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。

        下面我们分别进行介绍。

图14.2-5 输出模式控制示意图

14.2.2.1 推挽输出模式

图14.2-6 推挽模式等效电路 

        推挽输出模式,是根据这两个MOS管的工作方式来命名的。在该结构中输入高电平时,经过反向后,上方的P-MOS导通,下方的N-MOS关闭,对外输出高电平;而在该结构中输入低电平时,经过反向后,N-MOS管导通,P-MOS关闭,对外输出低电平。当引脚高低电平切换时,两个管子轮流导通,PMOS管负责灌电流-“推”,NMOS管负责拉电流-“挽”,使其负载能力和开关速度都比普通的方式有很大的提高。推挽输出的低电平为0伏,高电平为3.3伏,如上图所示推挽输出模式时的等效电路。 

        由于推挽输出模式下输出高电平时,是直接连接 V DD ,所以驱动能力较强,可以做电流型驱动,驱动电流最大可达 25mA,但是芯片的总电流有限,所以并不建议这样用,最好还是使用芯片外部的电源。 

14.2.2.2 开漏输出模式

图14.2-7 开漏输出等效电路 

        在开漏输出模式时,上方的P-MOS管完全不工作。如果我们控制输出为0低电平,N-MOS管导通,使输出接地,若控制输出为1(它无法直接输出高电平)时,则P-MOS管和N-MOS管都关闭,所以引脚既不输出高电平,也不输出低电平,为高阻态。为正常使用时必须外部接上拉电阻,等效电路如上图。它具有“线与”特性,也就是说,若有很多个开漏模式引脚连接到一起时,只有当所有引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当于短路接地,使得整条线路都为低电平0。 

        那么开漏输出模式的应用场景是什么的?总结下来主要有2个:

        1.电平不匹配的场合 

        STM32输出的高电平是3.3V,如果外部需要更高或者更低的电压,那么推挽输出就不合适了。此时就可以在外部接一个上拉电阻,上拉电源为外部需要的电压,如5V,并且把GPIO设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出5伏的电平,输出低电平时则输出低电平0V,如图14.2-8。

图14.2-8 开漏模式输出5V电压 

        2.需要“线与”功能的总线电路 

        如 I2C通讯等需要“线与”功能的总线电路中一般要用开漏模式。多个控制器全部输入1高阻态时则为1,只要有一个为低电平,那么整个电路就是0.此时推挽输出模式就不可以了,因为有的控制器输入1,PMOS导通,有的控制器输入0,NMOS导通,此时双MOS管都存在导通的情况,直接就短路了。

14.2.3 复用功能

        复用功能模式中,输出使能,输出速度可配置,可工作在开漏复用及推挽复用两种模式,但是输出信号源于其它外设,不再是ODR寄存器,输出数据寄存器GPIOx_ODR无效;此时输入可用,我们可以通过输入数据寄存器可获取I/O实际状态。但一般情况下我们是直接用外设的寄存器来获取该数据信号。 

        具体这2种模式参考前面推挽/开漏输出模式即可,区别是输出信号源的差异。如下图14.2-9所示。

图14.2-9 复用输出模式 

14.3 GPIO寄存器介绍 

        STM32F1每组通用GPIO口有7个32位寄存器控制,包括:

        2个32位端口配置寄存器(CRL和CRH)

        2个32位端口数据寄存器(IDR和ODR)

        1个32位端口置位/复位寄存器(BSRR)

        1个16位端口复位寄存器(BRR)

        1个32位端口锁定寄存器(LCKR)

        下面介绍一下主要的寄存器。大家还是要学会自己去看参考手册,寄存器太多,但原理都差不多。

14.3.1  端口配置寄存器(GPIOx_CRL 和 GPIOx_CRH)

        这两个寄存器前面也已经有介绍。都是GPIO口配置寄存器,CRL控制端口的低八位,CRH控制端口的高八位。寄存器的作用是控制GPIO口的工作模式和工作速度,寄存器描述如图14.3-1和图14.3-2。

图14.3-1 CRL寄存器说明 

图14.3-2 CRH寄存器说明 

        每组GPIO有16个IO口,一个寄存器共32位,每4个位控制1个IO,所以需要两个寄存器。这个寄存器的复位值0x44444444代表什么含义?说明如下:如GPIOA_CRL的复位值是0x44444444,4位为一个单位都是0100,首先位1:0为00即是设置GPIO端口为输入模式,位3:2为01即设置为浮空输入模式。所以假如GPIOA_CRL的值是0x44444444,那么PA0~PA7都是设置为浮空输入模式。

        这2个配置寄存器就是用来配置GPIO的相关工作模式和工作速度,通过不同的配置实现不同的8种工作模式。配置方式如图14.3-3.

图14.3-3 GPIO配置寄存器配置说明 

14.3.2  端口输出数据寄存器(GPIOx_ODR) 

        该寄存器用于控制 GPIOx 的输出高电平或者低电平,寄存器描述如图 14.3-4 所示。 

图14.3-4 ODR寄存器说明

        该寄存器低16位有效,分别对应每一组GPIO的16个引脚。当CPU写访问该寄存器,如果对应的某位写0(ODRy=0),则表示设置该IO口输出的是低电平,如果写1(ODRy=1),则表示设置该IO口输出的是高电平,y=0~15。此外,除了ODR寄存器,BSRR寄存器也是用于控制GPIO输出的。

14.3.3 端口置位/复位寄存器(GPIOx_BSRR)

        该寄存器也用于控制GPIOx的输出高电平或者低电平,寄存器描述如图14.3-5。 

图14.3-5 BSRR寄存器说明 

        为什么有了ODR寄存器,还要这个BSRR寄存器呢?我们先看看BSRR的寄存器描述,首先BSRR是只写权限,而ODR是可读可写权限。BSRR寄存器32位有效,对于低16位(0-15),我们往相应的位写1(BSy=1),那么对应的IO口会输出高电平,往相应的位写0(BSy=0),对IO口没有任何影响,高16位(16-31)作用刚好相反,对相应的位写1(BRy=1)会输出低电平,写0(BRy=0)没有任何影响,y=0~15。也就是说,对于BSRR寄存器,你写0的话,对IO口电平是没有任何影响的。我们要设置某个IO口电平,只需要相关位设置为1即可。而ODR寄存器,我们要设置某个IO口电平,我们首先需要读出来ODR寄存器的值,然后对整个ODR寄存器重新赋值来达到设置某个或者某些IO口的目的,而BSRR寄存器直接设置即可,这在多任务实时操作系统中作用很大。BSRR寄存器还有一个好处,就是BSRR寄存器改变引脚状态的时候,不会被中断打断,而ODR寄存器有被中断打断的风险。 

                                                                                                                【引自:正点原子】

14.4 GPIO库函数

GPIO库函数如图14.4-1所示:

图14.4-1 GPIO库函数 

        具体使用方法可查看代码或者参考《STM32F103xx固件函数库用户手册》 。

14.5 应用说明

        具体代码怎么写都是要看硬件怎么设计的,根据前面讲述的内容,我们以点亮LED为例,如图14.5-1.假如我们的LED不能靠3.3V点亮,是需要更高电压点亮,或者电流要求较大的时候,那我们可以设置个外部电路,并配置为开漏模式。

图14.5-1 LED点亮方式 

参考资料:

        【1】哔站江协科技STM32入门教程

        【2】《STM32单片机原理与项目实战》刘龙、高照玲、田华著

        【3】《ARM Cortex-M3嵌入式原理及应用》黄可亚著

        【4】《STM32嵌入式微控制器快速上手》陈志旺著

        【5】《STM32单片机应用与全案例实践》沈红卫等著

        【6】《野火STM32开发指南》

        【7】《正点原子STM32开发指南》

  • 33
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值