GPIO端口的结构与编程应用_第1页
GPIO端口的结构与编程应用_第2页
GPIO端口的结构与编程应用_第3页
GPIO端口的结构与编程应用_第4页
GPIO端口的结构与编程应用_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

GPIO端口的结构与编程应用4.1GPIO的硬件结构和功能4.2GPIO锁定与配置机制4.3I/O端口外设的映射4.4GPIO寄存器4.5GPIO编程应用4.1GPIO的硬件结构和功能

为了避免输入阻抗高时吸收杂散信号而损坏电路,STM32处理器在硬件设计上采用输入端上拉(电阻接电源正极)、输入端下拉(电阻接电源负极)和浮空(不接电阻)等技术。多个I/O接口中的一个端口位基本硬件结构如图4.1所示。

图4.1I/O端口位的基本结构

在复位期间和复位后,复用功能未开启,I/O端口被配置成浮空输入模式。JTAG调试口被置为输入上拉或下拉状态,即PA15脚(JTDI)置于上拉,PA14脚(JTCK)置于下拉,PA13脚(JTMS)置于上拉,PB4脚(JNTRST)置于下拉。

当I/O引脚作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有NMOS被打开)使用输出驱动器。输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。所有GPIO引脚都有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活,也可以被断开。

4.1.1GPIO复用与输入功能

1.GPIO复用功能

由于STM32的GPIO功能较多,因此设置非常复杂。作为片上外设的输入,应根据需要配置该引脚为浮空输入、上拉输入或下拉输入,同时使能该引脚对应的某个复用功能模块。作为片上外设的输出,应根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。注意,如果有多个复用功能模块对应同一个引脚,仅可使能其中之一,其他模块保持非使能状态。例如,要使用STM32F103VBT6的第47脚和第48脚的USART3功能,则需要配置第47脚为复用推挽输出或复用开漏输出,配置第48脚为某种输入模式,同时使能USART3并保持I2C的非使能状态。

2.GPIO输入功能

STM32处理器内部电路在读信号的控制下,可以实现表4.2中的功能。图4.2是简化的GPIO输入示意图。图4.2GPIO输入电路示意图

GPIO引脚模拟输入是在施密特触发器断开、上拉和下拉不接的情况下实现的。该方式可以在使用内部ADC功能时采用。高阻输入是在上拉、下拉不接和施密特触发器接通的情况下实现的。上拉、下拉则分别在接通各自的开关时实现。施密特触发输入的作用是将缓慢变化的或畸变的输入脉冲信号整形成比较理想的信号。执行GPIO引脚读操作时,在读脉冲(ReadPluse)的作用下,会把引脚的当前电平状态读到内部总线(InternalBus)上。在不执行读操作时,外部引脚与内部总线之间是断开的。4.1.2GPIO输出功能

STM32处理器内部电路在写信号的控制下,可以实现表4.1中的功能。图4.3是简化的GPIO输出电路示意图。图4.3GPIO输出电路示意图

1.推挽输出

1)推挽输出的基本功能

推挽输出的关键电路是两个参数相同的晶体管(NPN、PNP)或MOS管(PMOS、NMOS),它们分别受两个互补信号的控制,各负责正、负半周的波形的放大任务,在一个晶体管导通时,另一个截止。电路工作时,两个对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载送电流,也可以从负载吸(灌)电流。推挽式输出既能提高电路的负载能力,又可提高开关速度。

图4.3的电路中,“输出控制”由D触发器(锁存器)和三态门电路构成。如图4.4(a)所示,执行GPIO引脚写操作时,在写脉冲的作用下,数据被锁存到MOS管的栅极,并控制其导通或截止。由于两个管子是互补的,不管哪个管子导通都表现出较低的阻抗,使RC常数很小,逻辑电平转换速度很快。两个管子交替工作,可以降低功耗,并提高每个管子的承受负载能力。在推挽输出模式下,GPIO还具有回读功能(读修改写指令功能)。图4.4具有D触发器的驱动电路

2)通用推挽输出

通用推挽输出模式的信号框图如图4.1所示。当处理器通过端口位设置/清除寄存器或者输出数据寄存器写入数据后,该数据位将通过输出控制电路传送到编号I/O端口,如果处理器写入的是逻辑“1”,输出驱动电路的NMOS管将处于关闭状态,此时I/O端口的电平将由外部的上拉电阻决定。如果处理器写入的是逻辑“0”,则输出驱动电路的NMOS管将处于开启状态,此时I/O端的电平被NMOS管拉到了Vss的零电位。

在图4.1的上半部分(输入部分),施密特触发器处于开启状态,这意味着处理器可以在输入数据寄存器的另一端随时监测I/O端口的状态。通过这个特性,还可以实现虚拟的I/O端口双向通信,只要处理器输出逻辑“1”,由于输出驱动器NMOS管处于关闭状态,I/O端口的电平将完全由外部电路决定。

3)复用推挽输出

该模式下,片内驱动电路供外设引脚(如I2C的SCL、SDA等)使用。此模式的输出信号见图4.1中的“复用功能输出”。与通用推挽输出类似,输出驱动控制电路的信号与复用功能的输出端相连,此时输出数据寄存器与输出通道断开了。

2.开漏输出

开漏输出就是不输出电压,低电平时接地,高电平时不接地。如果外接上拉电阻,则在输出高电平时,电压会拉到上拉电阻的电源电压。这种方式适合连接的外设电压比单片机电压低或高的情况。

GPIO引脚在开漏输出模式下的等效示意如图4.4(b)所示。开漏输出和推挽输出的结构基本相同,但只有下拉NMOS,而没有上拉PMOS管。开漏输出的实际作用就是一个开关,输出“1”时断开,输出“0”时连接到GND(有一定等效内阻)。回读功能读到的仍是输出锁存器的状态,而不是外部引脚的状态,因此开漏输出模式是不能用于输入的。开漏输出结构没有内部上拉电阻,因此在实际应用时,通常都要外接合适的上拉电阻(通常为4.7~l0kW)。开漏输出能够方便地实现“线与”逻辑功能,即多个开漏的引脚可以直接并在一起(不需要缓冲隔离)使用,并统一外接一个合适的上拉电阻,就自然形成“逻辑与”关系。开漏输出的另一种用途是能够方便地实现不同逻辑电平之间的转换(如3.3~5 V),只需外接一个上拉电阻,而不需要额外的转换电路。典型的应用例子就是基于开漏连接的I2C总线。

1)通用开漏输出

通用开漏输出的信号流程与通用推挽输出类似,但GPIO输出“0”时引脚接GND,GPIO输出“1”时引脚悬空,即图4.1中的PMOS不起作用。该引脚需要外接上拉电阻,才能实现输出高电平。

2)复用开漏输出

复用开漏输出模式下,片内驱动电路供外设引脚使用。它的信号流程与复用推挽输出的类似,只是图4.1中的PMOS不起作用。4.1.3GPIO速度选择与输入保护功能

1.速度选择

在I/O口的输出模式下,有3种输出频率可选,分别为2 MHz、10 MHz和50 MHz。这里频率是指I/O口驱动电路的响应频率而不是输出信号的频率(输出信号的速度与程序有关)。芯片内部在I/O口的输出部分安排了多个响应频率不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路。通过选取输出频率来选择不同的输出驱动模块,达到最佳的控制噪声和降低功耗的效果。高频驱动电路噪声也高,当不需要高的输出频率时,应选用低频驱动电路,这样有利于提高系统的EMI性能。当然,如果要输出较高频率的信号,却选用了较低频率的驱动模块,很可能会得到失真的输出信号,因为GPIO的引脚频率是与应用匹配的。

2.输入保护功能

GPIO的引脚口上具有保护二极管,如图4.5(a)所示。其作用是防止从外部引脚输入的电压过高或过低。VDD正常供电是3.3 V,如果从Pin引脚输入的信号(假设任何输入信号都有一定的内阻)电压超过VDD加上二极管V1的导通压降(假定约为0.6 V),则二极管V1导通,会把多余的电流引到VDD,而真正输入到内部的信号电压不会超过3.9 V。同理,如果从Pin输入的信号电压比GND还低,则由于二极管V2的作用,会把实际输入内部的信号电压钳制在 -0.7 V左右。

假设VDD是3.3 V,GPIO设置在开漏模式下,外接l0 kW上拉电阻并将其连接到5 V电源,当输出“1”时,通过测量可以发现,GPIO引脚上的电压并不会达到5 V,而是约为4 V,这正是因为内部钳位二极管在起作用。虽然输出电压达不到满幅的5 V,但对于实际的数字逻辑,通常4 V以上就算是高电平了。如果确实想进一步提高输出电压,一种简单的做法是先在GPIO引脚上串联一只二极管V3(如1N4148),然后再接上拉电阻Rx,如图4.5(b)所示。向引脚写“1”时,NMOS管关闭,在Pinx处得到的电压约为4.5 V,电压提升效果明显。向引脚写“0”时,NMOS管导通,在Pinx处得到的电压约为0.7 V,仍属低电平。图4.5保护与电平变换电路 4.2GPIO锁定与配置机制

1.GPIO锁定机制

STM32的锁定机制允许冻结I/O配置。若在两个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将不能再更改端口位的配置。这主要用在一些关键引脚的配置上,防止程序跑飞引起灾难性后果,如在驱动功率模块的配置上,应该使用锁定机制,以冻结I/O口配置,即使程序跑飞,也不会改变这些引脚的功能。

2.输入配置

当I/O端口配置为输入时,图4.1所示的I/O端口位的基本结构图中会有如下变化:

(1)输出缓冲器被禁止。

(2)施密特触发输入被激活。

(3)根据输入配置(上拉、下拉或浮动)的不同,弱上拉和下拉电阻被连接。

(4)出现在I/O引脚上的数据在每个APB2时钟被采样到输入数据寄存器。

(5)对输入数据寄存器的读访问可得到I/O状态。

3.模拟输入配置

当I/O端口被配置为模拟输入配置时,图4.1所示的I/O端口位的基本结构图中会有如下变化:

(1)输出缓冲器被禁止。

(2)禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置为0。

(3)弱上拉和下拉电阻被禁止。

(4)读取输入数据寄存器时数值为0。

4.输出配置

当I/O端口被配置为输出时,图4.1所示的I/O端口位的基本结构图中会有以下变化:

(1)输出缓冲器被激活。在开漏模式时,输出寄存器上的“0”激活NMOS,而输出寄存器上的“1”将端口置于高阻状态(PMOS从不被激活)。在推挽模式时,输出寄存器上的“0”激活NMOS,而输出寄存器上的“1”将激活PMOS。

(2)施密特触发输入被激活。

(3)弱上拉和下拉电阻被禁止。

(4)出现在I/O引脚上的数据在每个APB2时钟被采样到输入数据寄存器。

(5)在开漏模式时,对输入数据寄存器的读访问可得到I/O状态。

(6)在推挽模式时,对输出数据寄存器的读访问得到最后一次写的值。

5.复用功能配置

当I/O端口被配置为复用功能时,图4.1所示的I/O端口位的基本结构图中会有如下变化,且一组复用功能I/O寄存器允许用户把一些复用功能重新映射到不同的引脚。

(1)在开漏或推挽式配置中,输出缓冲器被打开。

(2)内置外设的信号驱动输出缓冲器(复用功能输出)。

(3)施密特触发输入被激活。

(4)弱上拉和下拉电阻被禁止。

(5)在每个APB2时钟周期,出现在I/O引脚上的数据被采样到输入数据寄存器。

(6)在开漏模式时,读输入数据寄存器时可得到I/O口状态。

(7)在推挽模式时,读输出数据寄存器时可得到最后一次写的值。

4.3I/O端口外设的映射

1.将高速晶振引脚OSC_IN/OSC_OUT变为PD0/PD1端口

通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR),可实现将外部振荡器引脚OSC_IN/OSC_OUT作为GPIO的PD0/PD1引脚功能。这个重映射只适用于36、48和64引脚的器件封装,对于100、144引脚的器件封装,因有单独的PD0和PD1的引脚,不必重映射。

2.低速晶振引脚OSC32_IN/OSC32_OUT变为PC14/PC15端口

当LSE振荡器关闭时,LSE振荡器引脚OSC32_IN/OSC32_OUT可以分别用作GPIO的PC14/PC15,但LSE功能始终优先于通用I/O口的功能。需要注意:当进入待机模式或后备区域使用VBAT供电时,不能使用PC14/PC15的GPIO端口功能。

为了在调试期间可以使用更多GPIO口,通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)的SWJ_CFG[2:0]位,可以改变上述重映射配置。重映射调试配置后,相关I/O口(PA13、PA14、PA15、PB3和PB4)均不可用。

4.CAN复用功能重映射

CAN信号可以被映射到端口A、B或D上,如表4.4所示。对于端口D,在36、48和64器件引脚的封装上没有重映射功能。但重映射1,不适用于36引脚的器件封装。重映射2,当PD0和PD1没有被重映射到OSC_IN和OSC_OUT时,重映射功能只适用于100引脚和144引脚的器件封装。 4.4GPIO寄存器

STM32处理器的硬件驱动是经过一系列控制寄存器的写入操作实现的。这些控制寄存器就像一些精巧的控制装置,能够接收指令,并操纵相关设备完成指令规定的行为或动作。控制寄存器的作用与计算机的键盘、显示屏的作用完全相似,具有读取和写入这两种最基本的人机交互功能。

GPIO相关寄存器功能见表4.14。每个GPIO端口有两个32位配置寄存器(GPIOx_CRL和GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个32位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。I/O寄存器必须以32位字的形式访问。

表4.14中的寄存器可以分为以下4类。

(1)配置寄存器:选定GPIO的特定功能,最基本的如选择作为输入还是输出端口。

(2)数据寄存器:保存了GPIO的输入电平或将要输出的电平(信号“1”或“0”)。

(3)位控制寄存器:设置某引脚的数据为1或0,控制输出的电平(高或低)。

(4)锁定寄存器:设置某锁定引脚后,就不能修改其配置。

图4.6中各位信息的说明如下:

(1)位CNF15(31,30)、CNF14(27,26)、CNF13(23,22)、CNF12(19,18)、CNF11(15,14)、CNF10(11,10)、CNF9(7,6)和CNF8(3,2)的8组中各位是设置端口的不同功能。

(2)位MODE15(29,28)、MODE14(25,24)、MODE13(21,20)、MODE12(17,16)、MODE11(13,12)、MODE10(9,8)、MODE9(5,4)和MODE8(1,0)的8组中各位是设置端口频率等的不同功能。

(3) CNFx[1:0]和MODEx[1:0]中的x取值为8~15,表示端口(GPIO)的引脚号。如x=9,表示是Pin9(脚9)。即每4位配置(表示)一个引脚的属性。

(4) CNFx[1:0]、MODEx[1:0](x=8~15)2位是端口方式的控制位。见图4.7所示。图4.7CNFx[1:0]、MODEx[1:0]各位的配置功能

2.端口配置低寄存器(GPIOx_CRL,x=A~F)

端口配置低寄存器各位(32位)的定义信息见图4.8所示。该寄存器偏移地址为0x000,复位后其初始值为0x44444444。图4.8GPIOx_CRL各位信息

3.端口输入数据寄存器(GPIOx_IDR,x=A~F)

端口输入数据寄存器各位(32位)的定义信息中,高16位是保留位。只有低16位IDR[15:0]才是GPIO端口的输入数据。该寄存器偏移地址为0x008,复位后其初始值为0x0000。

4.端口输出数据寄存器(GPIOx_ODR,x=A~F)

端口输出数据寄存器各位(32位)的信息中,高16位是保留位。只有低16位ODR[15:0]才是GPIO端口的输出数据。该寄存器偏移地址为0x00C,复位后其初始值为0x0000。

5.端口位设置/清除寄存器(GPIOx_BSRR)(x=A~F)

端口位设置/清除寄存器各位(16位乘2)的信息见图4.9所示,它是只写寄存器。端口位设置/清除寄存器的偏移地址为0x010,复位后其初始值为0x00000000。图4.9设置/清除寄存器(GPIOx_BSRR)各位信息

图4.9中各位信息的说明如下:

(1)位31~16(BR15~BR0),BR[15:0]对应各位中写“0”使输出数据寄存器ODR[15:0]对应的位数值不变。BR[15:0]对应各位中写“1”使输出数据寄存器ODR[15:0]对应的位数值清零。

(2)位15~0(BS15~BS0),BS[15:0]对应各位中写“0”使输出数据寄存器ODR[15:0]对应的位数值不变。BS[15:0]对应各位中写“1”使输出数据寄存器ODR[15:0]对应的位数值置1。

(3)如果同时对BR[15:0]和BS[15:0]对应位中写了数据,则只有BS[15:0]起作用。

6.端口位清除寄存器(GPIOx_BRR,x=A~F)

端口位清除寄存器各位(低16位)的信息中,只有BR[15:0]有用。该清除寄存器的偏移地址为0x014,复位后其初始值为0x0000。

位15~0(BR15~BR0):BR[15:0]对应各位中写“0”使输出数据寄存器ODR[15:0]对应的位数值不变。BR[15:0]对应各位中写“1”使输出数据寄存器ODR[15:0]对应的位数值清零。可以看出,该寄存器的用法与(GPIOx_BSRR)的高16位用法相同。

7.端口配置锁定寄存器(GPIOx_LCKR)(x=A~F)

配置锁定寄存器各位(低16位)的信息中,只有LCK[15:0]有用。该寄存器的偏移地址为0x018,复位后其初始值为0x0000。

对于锁定寄存器的操作,要对锁定的位写入一定的序列:写1、写0、写1、读0、读1。最后一个读可省略,但可以用来确认锁定已被激活。

注:在操作锁定的写入序列时,不能改变LCK[15:0]的值。操作锁定写入序列中的任何错误将不能激活锁定。 4.5GPIO编程应用

4.5.1GPIO驱动的普通应用

1.无需上拉电阻的GPIO驱动

在STM32F103xx系列ARM处理器中,对绝大部分GPIO端口引脚的驱动都不需要上拉电阻,原因是在STM32F103xx系列器件中,工作在输出模式的GPIO端口引脚的内部已经集成了上拉电阻(见图4.1)。因此,对于这一类型的GPIO端口引脚的应用,大部分可釆用灌电流的方式来驱动外部设备。需要注意的是,在这种类型的GPIO引脚驱动过程中,需要外部串联一个合适的限流电阻(电流不超过50 mA为宜),以防止引脚上的电流过大损坏内部NMOS管。

同时,用户在使用GPIO驱动电路时,需要对相应的GPIO端口进行初始化操作,包括将对应的引脚设置为输出方式,以及设置端口的数据传输速度等。

在图4.10(a)中,STM32F103xx系列处理器使用灌电流的方式驱动LED发光二极管。从电路原理图中可以看出,GPIO端口在驱动LED发光二极管时,可将PA.2引脚设置为开漏输出模式。当GPIO端口引脚为低电平时,LED发光二极管点亮。当GPIO端口引脚为高电平时,LED发光二极管熄灭。

一般而言,只要使LED发光二极管中流过的电流达到5 mA左右即可使LED发光二极管正常工作。从工程角度出发,为了保护器件的GPIO引脚,可以适当选取较大的限流电阻,不仅可以保护芯片内部电路,同时还能降低系统功耗。

除此之外,用户还可以使用输出电流的方式来驱动外部LED发光二极管,不过要将引脚PA.2配置成推拉输出模式,硬件电路如图4.10(b)所示。图4.10STM32GPIO的普通应用

2.需要上拉电阻的GPIO驱动

当GPIO端口引脚作为数据输出端口时,由于端口结构内部已经集成了上拉电阻,所以绝大部分情况下都无须在外部硬件电路中附加上拉电阻。但是在GPIO端口引脚作为信号输入端口时,由于器件内部的上拉电阻为弱上拉,所以在外部硬件电路设计中,一般可加一个l0kW左右的上拉电阻。尤其是输入引线较长时,更要增加上拉电阻。如图4.11所示。图4.11STM32GPIO输入应用

3.外围电路不同电平的GPIO驱动

当外围电路的电平高于STM32处理器的供电电源(+3.3 V)时,GPIO端口的输入或输出应增加电平转换电路。常见的电平转换电路如图4.12所示。对于图4.12(a)主要是通过三极管(V1)进行输出驱动,该电路适合三极管的集极串接继电器等供电电压高于+3.3 V的许多负载情况。对于图4.12(b)电路,由于采用了输入分压电路,可根据VIx输入电压的大小适当改变Rx的值实现输入电平的变换。当然将R2保护电阻换成缓冲器也是很好的做法。图4.12GPIO接口的电平转换电路4.5.2流水灯的控制与编程

1.硬件电路的设计描述

流水灯,也叫跑马灯。通过这个例子使读者学习和体会STM32处理器GPIO口的最基本操作功能。将8个LED灯接到PA0~PA7上,从原理可知,当PA口用于I/O口时,原则上可接上拉电阻,但若将其接成灌电流方式就不需要上拉电阻,且由于灌电流较大,一般要接入限流电阻(如R1~R8),如果把相关器件换成三级管或MOS管,就可直接驱动需要电流较大的继电器等应用电路。

图4.13(a)是基本的流水灯控制电路,发光二极管可采用0.25 W以下的器件。

图4.13(b)是驱动电压大于+3.3 V以上的继电器接法,图中的V1续流保护二极管,可采用1N4148或1N4007等器件。

图4.13(c)是驱动光电耦合器的应用实例,该电路可实现驱动信号的隔离作用,是解决“弱电”控制“强电”的方法。图4.13GPIO基本应用电路

上面的程序例子只是控制8个灯的流水显示,改变延时函数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论