第5章通用输入输出
【导读】通用输入输出(General Purpose Input/Output, GPIO)是嵌入式微控制器最常用、最基础、灵活性最强的控制器,可以实现简单控制,也可以组合实现复杂时序,是嵌入式程序设计必须掌握的控制器。本章首先介绍GPIO的引脚内部构造,不同的输入输出模式的区别,然后对GPIO的寄存器定义进行了详细介绍,并结合ST的外围控制器库函数对典型API进行了介绍,最后以LED和按键为例阐述了利用库函数进行I/O控制的方法。
5.1GPIO原理〖1〗5.1.1GPIO功能GPIO是嵌入式开发里面最基本也最常用的硬件端口,STM32L1xx系列处理器可提供多达128个I/O,实现输入输出功能,并将其分为A~H 8组,每组称为一个端口(PORT),每个端口有16个I/O引脚(PIN),每个I/O的速度可单独配置,最快可在2个时钟周期进行I/O翻转,支持I/O锁定功能、I/O复选功能,每个引脚最多可有16个复选功能,最大程度的提供了灵活的I/O配置和使用。
I/O的使用由GPIO控制器管理,每个GPIO端口有四个32位配置寄存器(GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR 和 GPIOx_PUPDR),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个32位锁定寄存器(GPIOx_LCKR)和两个32位的复选功能选择寄存器(GPIOx_AFRH 和 GPIOx_AFRL)。
一个I/O端口引脚的结构如图51所示,主要由输入驱动器、输出驱动器、输入数据寄存器、输出数据寄存器和位设置/清除寄存器进行输入输出控制。
图51I/O引脚内部电路结构
GPIO端口的每个位可以由软件分别配置成多种模式: 输入、输出、复用和模拟四种模式,每种模式下,可以通过寄存器对输入输出方式进行配置,由输入驱动器和输出驱动器的开关电路控制,每个I/O端口位可以自由编程,以32位字访问I/O端口寄存器。
在每个AHB总线时钟周期,GPIO控制器采样I/O引脚的输入电平,并将输入数据存储到输入寄存器中。所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开;端口配置为输出模式时,GPIO输出寄存器中的值输出到对应的I/O引脚上。
为便于程序对I/O口的输出数据寄存器控制,GPIO控制器提供了单个或多个位的原子读写操作,通过对“置位/复位寄存器”(GPIOx_BSRR)中想要更改的位写1实现同时操作,无需软件进行开关中断的保护操作。
为保护I/O引脚配置的安全性,GPIO控制器提供了锁定机制允许冻结I/O配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将不能再更改端口位的配置。
第5章通用输入输出微机原理与接口技术——嵌入式系统描述所有的I/O端口及其引脚都具有复用功能,复用功能是将GPIO端口映射到某个外围控制器上,作为外围控制器的专用I/O通道,这样,可以对不使用的外围控制器的引脚当作普通I/O使用,当需要时配置成为专用I/O使用。当外围控制器功能不能满足时,我们通常使用I/O模拟专用控制器的时序用软件实现专用控制器的功能。每个I/O端口最多可以有16个复选功能AF0AF15,但只能使用一个复用功能。CPU上电复位后,所有的I/O都默认使用AF0功能。除了特殊I/O引脚外(比如JTAG调试口(PA15、PA14、PA13、PB4、PB3)对应的I/O引脚AF0功能为JTAG调试端口功能,因此每个引脚被置为输入上拉或下拉模式),I/O引脚的AF0功能都是GPIO,复位后的默认配置为浮空输入。为了使不同器件封装的外设I/O功能的数量达到最优,STM32L1xx系列处理器支持复用功能重映射,可以把一些复用功能的引脚重新映射到其他一些引脚上。
所有的GPIO端口都有外部中断能力,将端口配置为输入模式后,可以把引脚作为中断源的输入,例如按键、事件触发等,具体在中断控制器部分进行阐述。
5.1.2I/O模式配置1. 输入配置当I/O端口配置为输入时: 图51中的输出缓冲器被禁止,施密特触发输入被激活。根据输入引脚配置(上拉、下拉或浮空)的不同,弱上拉或下拉电阻被连接。出现在I/O引脚上的数据被采样到输入数据寄存器,对输入数据寄存器的读访问可得到I/O引脚的状态。
浮空输入: 浮空输入一般多用于外部按键输入,浮空输入状态下,I/O的电平状态是不确定的,完全由外部输入决定。
上拉输入和下拉输入分别对应图51中的上拉电阻开关和下拉电阻开关,将输入信号的默认值保持在高电平或者低电平。
2. 输出配置
当I/O端口被配置为输出时,图51中的输出缓冲器被激活,施密特触发输入被激活,弱上拉或下拉电阻被禁止。输出到I/O引脚上的数据在每个时钟周期同时被采样到输入数据寄存器,在开漏模式时,对输入数据寄存器的读访问可得到输出I/O状态。在推挽式模式时,对输出数据寄存器的读访问得到当前的输出状态。
输出类型可配置为两种方式: 开漏模式和推挽模式。开漏模式下,图51中的输出寄存器上的0激活NMOS,而输出寄存器上的1将端口置于高阻状态(PMOS从不被激活)。推挽模式下,图51中的输出寄存器上的0激活NMOS,而输出寄存器上的1将激活PMOS。
推挽输出: 可以输出高、低电平,连接数字器件;推挽一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止,形成推拉结构,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度,高低电平由电源决定。
开漏输出: 输出端相当于三极管的集电极,适合于做电流型的驱动,其吸收电流的能力相对强(20mA以内)。开漏电路利用外部电路的驱动能力,可以减少芯片内部的驱动电流,一般用来连接不同电平的器件。由于开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,上升沿的时延由上拉电阻的阻值决定,电阻小时延时就小,功耗大;反之延时大功耗小。在多个I/O口形成“线与”功能时,需要设置为开漏输出。
3. 复用功能配置
当I/O端口被配置为复用功能时,图51中,在开漏或推挽输出配置中,输出缓冲器被打开,输出缓冲器由内置外设的信号驱动输出(复用功能输出); 施密特触发输入被激活,弱上拉和下拉电阻由GPIOx_PUPDR寄存器确定,每个时钟周期采样I/O引脚上的数据,读输入数据寄存器时可得到I/O口状态。复用功能下I/O口的输入输出配置以及开漏、推挽由复用功能引脚规定。
对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动。对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式,引脚和输出寄存器断开,并和片上外设的输出信号连接。 如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。
4. 模拟配置
当I/O端口被配置为模拟时,图51中的输出缓冲器被禁止,施密特触发输入被禁止,I/O信号直接连接到处理器的模拟外围控制器电路,不经过GPIO控制器,施密特触发输出值被强置为0,弱上拉和下拉电阻被禁止,此时读取输入数据寄存器时数值为0。在低功耗休眠时,可将I/O设置为模拟输入状态,以降低功耗。
对于I/O引脚在不同应用情况下的配置如表51所示。表51I/O配置的典型配置应 用 场 景配置普通GPIO输入配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,不使能该引脚对应的所有复用功能模块普通GPIO输出根据需要配置该引脚为推挽输出或开漏输出,不使能该引脚对应的所有复用功能模块普通模拟输入配置该引脚为模拟输入模式,不使能该引脚对应的所有复用功能模块内置外设的输入根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,使能该引脚对应的复用功能模块内置外设的输出根据需要配置该引脚为复用推挽输出或复用开漏输出,使能该引脚对应的复用功能模块。5.2GPIO寄存器
GPIO控制器的寄存器如表52所示。续表表52GPIO控制器寄存器寄存器名称偏移量功能复位值端口模式寄存器(GPIOx_MODER)0x00配置端口的输入输出方向端口A: 0xA800 000
端口B: 0x0000 0280
其他: 0x0000 0000端口输出类型寄存器(GPIOx_OTYPER)0x04配置端口输出类型0x0000 0000端口输出速度寄存器(GPIOx_OSPEEDR)0x08配置端口输出输速率端口B: 0x0000 00C0
其他: Ox0000 0000端口上拉下拉寄存器(GPIOx_PUPDR)0x0C配置端口上拉和下拉电阻端口A: 0x6400 0000
端口B: 0x0000 0100
其他: 0x0000 0000GPIO 端口输入数据寄存器(GPIOx_IDR)0x10端口输入数据0x0000 XXXX (X表示不定态) GPIO端口输出寄存器(GPIOx_ODR) 0x14端口输出数据0x0000 0000端口位设置/清除寄存器(GPIOx_BSRR) 0x18端口输出寄存器设置为1或清为00x0000 0000GPIO端口配置锁定寄存器(GPIOx_LCKR) 0x1C锁定引脚的配置信息0x0000 0000复用功能低寄存器(GPIOx_AFRL) 0x20复用功能选择0~70x0000 0000复用功能高寄存器(GPIOx_AFRH)0x28复用功能选择8~150x0000 00001. GPIO端口模式寄存器(GPIOx_MODER) (x=A,…,H)
端口模式寄存器用于配置I/O的输入输出状态,其有效域定义如图52所示。