STM32 GPIO

GPIO(通用输入输出口,General Purpose Input Output)接口的功能是让嵌入式处理器能够通过软件灵活地读出或控制单个物理引脚上的高、低电平,实现内核和外部系统之间的信息交换。 GPIO是嵌入式处理器使用最多的外设,能够充分利用其通用性和灵活性,是嵌入式开发者必须掌握的重要技能。 作为输入时,GPIO可以接收来自外部的开关量信号、脉冲信号等,如来自键盘、拨码开关的信号。 作为输出时,GPIO可以将内部的数据传送给外部设备或模块,如输出到LED、数码管、控制继电器等。另外,理论上讲,当嵌入式处理器上没有足够的外设时,可以通过软件控制GPIO模拟UART、SPI、I2C、FSMC等各种外设的功能。

以STM32F103ZET6为例,它共有7个端口(PA、PB、PC、PD、PE、PF和PG),每个端口有16个GPIO,共7×16=112个GPIO。 几乎在所有的嵌入式系统应用中,都涉及开关量的输入和输出功能,例如状态指示、报警输出、继电器闭合和断开、按钮状态读入、开关量报警信息的输入等。这些开关量的输入和控制输出都可以通过GPIO接口实现。 GPIO接口的每个位都可以由软件分别配置成以下模式。

(1)输入浮空:浮空(floating)就是逻辑器件的输入引脚既不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚浮空时,相当于该引脚接了高电平。一般实际运用时,引脚不建议浮空,易受干扰。

(2)输入上拉:上拉就是把电压拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻钳位在高电平。电阻同时起限流作用。弱强只是上拉电阻的阻值不同,没有什么严格区分。

(3)输入下拉:下拉就是把电压拉低,拉到GND。与上拉原理相似。

(4)模拟输入:模拟输入是指传统方式的模拟量输入。数字输入是输入数字信号,即0和1的二进制数字信号。

(5)开漏输出:输出端相当于三极管的集电极。要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对较强(一般20mA以内)。

(6)推挽式输出:可以输出高低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通时另一个截止。

(7)推挽式复用输出:可以理解为GPIO接口被用作第二功能时的配置情况(并非作为通用I/O口使用)。STM32 GPIO的推挽复用模式,复用功能模式中输出使能、输出速度可配置。这种复用模式可工作在开漏及推挽模式,但是输出信号是源于其他外设的,这时的输出数据寄存器 GPIOx_ODR 是无效的;而且输入可用,通过输入数据寄存器可获取 I/O 实际状态,但一般直接用外设的寄存器获取该数据信号。

(8)开漏复用输出:复用功能可以理解为GPIO接口被用作第二功能时的配置情况(即并非作为通用I/O口使用)。 一个I/O接口的基本结构如图所示。

STM32的GPIO资源非常丰富,包括26、37、51、80、112个多功能双向5V的兼容的快速I/O接口,而且所有的I/O接口可以映射到16个外部中断,对于STM32的学习,应该从最基本的GPIO开始学习。 每个GPIO端口具有7组寄存器: 2个32位配置寄存器(GPIOx_CRL,GPIOx_CRH); 2个32位数据寄存器(GPIOx_IDR,GPIOx_ODR); 1个32位置位/复位寄存器(GPIOx_BSRR); 1个16位复位寄存器(GPIOx_BRR); 1个32位锁定寄存器(GPIC_LCKR I/O接口位的基本结构包括以下几部分。

输入通道

输入通道包括输入数据寄存器和输入驱动器(带虚框部分)。在接近I/O引脚处连接了两只保护二极管。 根据TTL 肖特基触发器、上拉电阻端和下拉电阻端两个开关的状态,GPIO的输入可分为以下4种: (1)模拟输入:TTL肖特基触发器关闭。 (2)上拉输入:GPIO内置上拉电阻,此时GPIO内部上拉电阻端的开关闭合,GPIO内部下拉电阻端的开关打开。该模式下,引脚在默认情况下输入为高电平。

输出通道

输出通道包括位设置/清除寄存器、输出数据寄存器、输出驱动器。 GPIO的输出驱动器主要由多路选择器、输出控制逻辑和一对互补的MOS管组成。

(1)多路选择器。 多路选择器根据用户设置决定该引脚是GPIO普通输出还是复用功能输出。 ① 普通输出:该引脚的输出来自GPIO的输出数据寄存器。

② 复用功能(Alternate Function,AF)输出:该引脚的输出来自片上外设,并且一个STM32微控制器引脚输出可能来自多个不同外设,即一个引脚可以对应多个复用功能输出。但同一时刻,一个引脚只能使用这些复用功能中的一个,而这个引脚对应的其他复用功能都处于禁止状态。

(2)输出控制逻辑和一对互补的MOS管。 输出控制逻辑根据用户设置通过控制P-MOS管和N-MOS管的状态(导通/关闭)决定GPIO输出模式(推挽、开漏还是关闭)。

STM32的GPIO功能

复位期间和刚复位后,复用功能未开启,I/O口被配置成浮空输入模式。 复位后,JTAG引脚被置于输入上拉或下拉模式。 (1)PA13:JTMS置于上拉模式。 (2)PA14:JTCK置于下拉模式。 (3)PA15:JTDI置于上拉模式。 (4)PB4:JNTRST置于上拉模式。

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

当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作中,可以只更改一个或多个位。这是通过对"置位/复位寄存器"(GPIOx_BSRR,复位是GPIOx_BRR)中想要更改的位写1实现的。没被选择的位将不被更改。

所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。

复用功能(AF)

使用默认复用功能前必须对端口位配置寄存器编程。

(1)对于复用输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动。

(2)对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。

(3)对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。此时,输入驱动器被配置成浮空输入模式。 如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。 如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,那么它的输出将不确定。

STM32F103微控制器的I/O引脚除了通用功能外,还可以设置为一些片上外设的复用功能。而且,一个I/O引脚除了可以作为某个默认外设的复用引脚外,还可以作为其他多个不同外设的复用引脚。类似地,一个片上外设,除了默认的复用引脚,还可以有多个备用的复用引脚。在基于STM32微控制器的应用开发中,用户根据实际需要可以把某些外设的复用功能从默认引脚转移到备用引脚上,这就是外设复用功能的I/O引脚重映射。

输入配置

当I/O口配置为输入时:

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

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

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

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

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

输出配置

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

(1)输出缓冲器被激活。 ① 开漏模式:输出寄存器上的0激活N-MOS,而输出寄存器上的1将端口置于高阻状态(P-MOS从不被激活)。 ② 推挽模式:输出寄存器上的0激活N-MOS,而输出寄存器上的1将激活P-MOS。

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

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

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

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

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

复用功能配置

当I/O口被配置为复用功能时:

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

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

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

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

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

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

(7)在推挽模式时,读输出数据寄存器时可得到最后一次写的值。 一组复用功能I/O寄存器允许用户把一些复用功能重新映像到不同的引脚。

模拟输入配置

当I/O口被配置为模拟输入配置时:

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

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

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

输出速度

如果STM32F103的I/O引脚工作在某个输出模式下,通常还需设置其输出速度,这个输出速度指的是I/O口驱动电路的响应速度,而不是输出信号的速度。输出信号的速度取决于软件程序。 STM32F103的I/O引脚的输出速度有3种选择:2MHz、10MHz和50MHz。下面,根据一些常见的应用,给读者一些选用参考:

(1)连接LED、蜂鸣器等外部设备的普通输出引脚:一般设置为2MHz。

(2)用作USART复用功能输出引脚:假设 USART工作时最大比特率为115.2Kb/s,选用2MHz的响应速度也足够了,既省电,噪声又小。

(3)用作I2C复用功能的输出引脚:假设I2C工作时最大比特率为400Kb/s,那么2MHz的引脚速度或许不够,这时可以选用10MHz的I/O引脚速度。

(4)用作 SPI复用功能的输出引脚:假设SPI工作时比特率为18Mb/s或9Mb/s,那么10MHz的引脚速度显然不够,这时需要选用50MHz的I/O引脚速度。

(5)用作FSMC复用功能连接存储器的输出引脚:一般设置为50MHz的I/O引脚速度。

外部中断映射和事件输出

借助AFIO,STM32F103微控制器的I/O引脚不仅可以实现外设复用功能的重映射,而且可以实现外部中断映射和事件输出。需要注意的是,如需使用STM32F103微控制器I/O引脚的以上功能,都必须先打开APB2总线上的AFIO时钟。

  1. 外部中断映射 当STM32F103微控制器的某个I/O引脚被映射为外部中断线后,该I/O引脚就可以成为一个外部中断源,可以在这个1/O引脚上产生外部中断实现对用户STM32 运行程序的交互。 STM32F103微控制器的所有I/O引脚都具有外部中断能力。每个外部中断线EXTI LineXX和所有的GPIO端口 GPIO[A..G].xx共享。为了使用外部中断线,该I/O引脚必须配置成输入模式。

  2. 事件输出 STM32F103微控制器几乎每个I/O引脚(除端口F和G的引脚外)都可用作事件输出。例如,使用SEV指令产生脉冲,通过事件输出信号将STM32F103从低功耗模式中唤醒。

GPIO的HAL驱动程序

GPIO引脚的操作主要包括初始化、读取引脚输入和设置引脚输出,相关的HAL驱动程序定义在文件stm32f1xx_hal_gpio.h中

  1. 初始化函数HAL_GPIO_Init() 函数HAL_GPIO_Init()用于对一个端口的一个或多个相同功能的引脚进行初始化设置,包括输入/输出模式、上拉或下拉等。其原型定义如下: void HAL_GPIO_Init(GPIO_TypeDef *GPIOx,GPIO_InitTypeDef *GPIO_Init); 其中,第1个参数GPIOx是GPIO_TypeDef类型的结构体指针,它定义了端口的各个寄存器的偏移地址,实际调用函数HAL_GPIO_Init()时使用端口的基地址作为参数GPIOx的值,在文件stm32f103xx.h中定义了各个端口的基地址。 第2个参数GPIO_Init是一个GPIO InitTypeDef类型的结构体指针,它定义了GPIO引脚的属性。

  2. 设置引脚输出的函数HAL GPIO_WritePin() 使用函数HAL_GPIO_WritePin()向一个或多个引脚输出高电平或低电平,其原型定义如下: void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin,GPIO_PinState PinState); 其中,参数GPIOx是具体的端口基地址;GPIO Pin是引脚号;PinState是引脚输出电平,是枚举类型GPIO_PinState。

  3. 读取引脚输入的函数HAL_GPIO_ReadPin() 函数HAL_GPIO_ReadPin()用于读取一个引脚的输入状态,其原型定义如下: GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin); 函数的返回值是枚举类型GPIO_PinState。常量GPIO_PIN_RESET表示输入为0(低电平),常量GPIO_PIN SET表示输入为1(高电平)。

  4. 翻转引脚输出的函数HAL_GPIO_TogglePin() 函数HAL_GPIO_TogglePin()用于翻转引脚的输出状态。例如,引脚当前输出为高电平,执行此函数后,引脚输出为低电平。其原型定义如下,只需传递端口号和引脚号: void HAL_GPIO_TogglePin (GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)

STM32的GPIO使用流程

根据IO端口的特定硬件特征,IO端口的每个引脚都可以由软件配置成多种工作模式。 在运行程序之前必须对每个用到的引脚功能进行配置。

(1)如果某些引脚的复用功能没有使用,可以先配置为通用输入输出GPIO。

(2)如果某些引脚的复用功能被使用,需要对复用的IO端口进行配置。

(3)IO具有锁定机制,允许冻结IO。当在一个端口位上执行了锁定(LOCK)程序后,在下一次复位之前,将不能再更改端口位的配置。

GPIO是最基本的应用,其基本配置方法为:

(1)配置GPIO时钟,完成初始化。

(2)利用函数HAL_GPIO_Init 配置引脚,包括引脚名称、引脚传输速率、引脚工作模式。

(3)完成HAL_GPIO_Init的设置。

IO复用功能AFIO配置

IO功能AFIO常对应到外设的输入输出功能。使用时,需要先配置IO为复用功能,打开AFIO时钟,然后再根据不同的复用功能进行配置。对应外设的输入输出功能有下述3情况:

(1)外设对应的引脚为输出:需要根据外围电路的配置选择对应的引脚为复用功能的推挽输出或复用功能的开漏输出。

(2)外设对应的引脚为输入:根据外围电路的配置可以选择浮空输入、带上拉输入或带下拉输入。

(3)ADC对应的引脚:配置引脚为模拟输入。

相关推荐
番茄灭世神5 小时前
STM32外设详解——ADC
stm32·单片机·嵌入式硬件
LCMICRO-133108477466 小时前
国产长芯微LUM6100高可靠性双通道双向I2C数字隔离器P2P替代ADUM1250 ADUM1251替代ISO1540 ISO1541
stm32·单片机·嵌入式硬件·fpga开发·硬件工程
黄小美3218 小时前
STM32(四)LED闪烁、流水灯及蜂鸣器操作
stm32·单片机·嵌入式硬件
王大锤43919 小时前
普中51单片机
单片机·嵌入式硬件·51单片机
五羟基己醛11 小时前
【小白向】VOFA+简明教程(快速上手一款强力的串口助手)
单片机·嵌入式硬件
一个人的嵌入式~12 小时前
停止模式下USART为什么可以唤醒MCU?
单片机·嵌入式硬件
OH五星上将14 小时前
OpenHarmony(鸿蒙南向开发)——轻量系统内核(LiteOS-M)【内核通信机制】
嵌入式硬件·物联网·harmonyos·openharmony·系统开发·鸿蒙嵌入式·liteos-m
夜间去看海15 小时前
基于单片机的书库环境监测
单片机·嵌入式硬件·温度
点灯的棉羊17 小时前
STM32 Hal库SDIO在FATFS使用下的函数调用关系
stm32·单片机·嵌入式硬件
盼海17 小时前
单片机原理与技术
单片机·嵌入式硬件