0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32基础知识:GPIO(通用输入输出接口)

CHANBAEK 来源:上下求索电子er 作者:上下求索电子er 2023-10-24 15:22 次阅读

GPIO(通用输入输出接口)

1 GPIO 功能概述

GPIO 是通用输入/输出(General Purpose I/O)的简称,主要用于工业现场需要用到数字量输入/输出的场合,例如:

  • 输出功能 :继电器、 LED、蜂鸣器等的控制
  • 输入功能传感器状态、高低电平等信息的读取
  • 复用功能 :片内外设的对外接口
  • 时序模拟 :模拟 SPI、I2CUART 等常用接口的时序

2 STM32 的 GPIO 特性

  • 多种工作模式:输出/输入/复用/模拟
  • 灵活的复用模式
  • 5V 电压容限
  • 外部中断功能

3 端口和引脚

  • 端口(PORT): 独立的外设子模块,包括多个引脚,通过多个硬件寄存器控制引脚。

GPIO 模块由端口 GPIOA、GPIOB、GPIOC 等多个独立的子模块构成。

例如:端口 GPIOA 包括 PA0 ~ PA15 这 16 个引脚,通过 10 个硬件寄存器控制引脚工作。

  • 引脚(PIN): 对应微控制器的一个管脚,归属于端口,由端口寄存器的对应位控制。

PA0,属于端口 GPIOA,输出电平由端口 GPIOA 的输出数据寄存器 GPIOA_ODR 的第 0 位决定。

4 GPIO 电路

图片

5 GPIO 工作模式

  • 输入模式:浮空输入/上拉输入/下拉输入
    • 浮空输入:按键识别
    • 上拉输入:IO 内部上拉电阻输入
    • 下拉输入:IO 内部下拉电阻输入
  • 输出模式:推挽输出/开漏输出
  • 推挽输出时,P-MOS 管和 NMOS 管轮流工作,可以输出高电平或低电平。主要用于连接数字器件,如指示灯和继电器等模块;
  • 开漏输出时,P-MOS 管关闭,只有 N-MOS 管工作,此时只能输出低电平。要输出高电平必须外加上拉电阻,主要用于 I2C 总线。
  • 模拟模式
  • 模拟状态:表示引脚功能选择为模拟模式,但不作为任何片内模拟外设的复用脚,只是为了减少系统功耗。
  • 模拟外设复用引脚:表示引脚作为片内模拟外设(A/D 转换模块、D/A 转换模块、模拟比较器等)的复用脚,用于完成相应的功能操作。图片
  • 复用模式
    在 CubeMX 软件的引脚分配图中点击引脚即可弹出引脚的复用功能
  • 复用推挽:片内外设功能(URAT 的 TX,RX,SPI 的 MOSI,MISO,SCK,SS );
  • 复用开漏:片内外设功能( I2C 的 SCL,SDA )。

6 基于 HAL 库控制 GPIO

6.1 GPIO 外设的数据类型

  1. 引脚初始化: 采用结构体类型实现,用于定义引脚的序号、工作模式、输出速度等基本特性。
  2. 引脚电平状态: 采用枚举类型实现,用于定义引脚的电平状态:高电平和低电平。
  3. 引脚所属端口: 采用结构体指针实现,用于访问该端口所对应的寄存器组。

引脚初始化数据类型

图片

  • 成员变量 Pin 的取值范围:GPIO_PIN_0 ~ GPIO_PIN15

  • 成员变量 Pin 的取值范围:

    GPIO_MODE_INPUT浮空输入模式
    GPIO_MODE_OUTPUT_PP推挽输出模式
    GPIO_MODE_OUTPUT_OD开漏输出模式
    GPIO_MODE_AF_PP复用功能下的推挽模式
    GPIO_MODE_AF_OD复用功能下的开漏模式
    GPIO_MODE_ANALOG模拟模式
  • 成员变量 Pull 的取值范围:

    GPIO_NOPULL没有上拉或下拉电阻激活
    GPIO_PULLUP上拉电阻激活
    GPIO_PULLDOWN下拉电阻激活
  • 成员变量 Speed 的取值范围:

    GPIO_SPEED_FREQ_LOW引脚输出速度 2MHz
    GPIO_SPEED_FREQ_MEDIUM引脚输出速度 12.5MHz ~ 50MHz
    GPIO_SPEED_FREQ_HIGH引脚输出速度 25MHz ~ 100MHz
    GPIO_SPEED_FREQ_VERY_HIGH引脚输出速度 50MHz ~ 200MHz
  • 成员变量 Alternate 的取值范围

    • Alternate 表示引脚的复用功能;
    • 由于不同型号的 STM32 微控制器片内集成的外设不同,因此该成员变量的取值范围由芯片型号决定。
    • 以 STM32F1 系列芯片为例,通过查阅stm32f1xx_hal_gpio_ex.h文件可以了解 Alternate 的取值范围;
    • 该成员变量的取值一般通过 CubeMX 软件分配,不需要用户手动设置;

引脚电平状态数据类型

图片

端口数据类型:指向端口寄存器组的结构体指针

GPIOA,GPIOB,GPIOC

  • 不同型号的 STM32 微控制器的端口数量各不相同;
  • 端口数据类型的定义是在以芯片型号命名的.h 文件中.

6.2 使用 HAL 库的引脚初始化步骤

  1. 定义变量: 利用引脚初始化结构体类型GPIO_InitTypeDef 定义一个结构体变量。
  2. 设置模式: 按照引脚的工作模式,依次对该结构体的成员变量赋值,如 pin、mode、pull 等。
  3. 调用函数: 调用初始化函数HAL_GPIO_Init将配置参数写入到对应的寄存器,入口参数为端口号和结构体变量。

6.3 GPIO 外设接口函数的概述

  1. 引脚初始化函数:HAL_GPIO_Init

    函数原型复位引脚到初始状态
    功能描述引脚初始化
    入口参数 1GPIOx:引脚端口号,取值范围是 GPIOA ~ GPIOK
    入口参数 2GPIO_Init:指向引脚初始化类型 GPIO_InitTypeDef 的结构体指针,该结构体包含指定引脚的配置参数
    返回值
    注意事项该函数可以由 CubeMX 软件自动生成
  2. 引脚复位函数:HAL_GPIO_DeInit

    函数原型void HAL_GPIO_DeInit (GPIO_TypeDef * GPIOx, uint32_t GPIO_Pin)
    功能描述复位引脚到初始状态
    入口参数 1GPIOx:引脚端口号,取值范围是 GPIOA ~ GPIOK
    入口参数 2GPIO_Init:指向引脚初始化类型 GPIO_InitTypeDef 的结构体指针,该结构体包含指定引脚的配置参数
    返回值
    注意事项该函数需要用户调用
  3. 读取引脚函数:HAL_GPIO_ReadPin

    函数原型GPIO_PinState HAL_GPIO_ReadPin ( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin )
    功能描述读取引脚的电平状态
    入口参数 1GPIOx:引脚端口号,取值范围是 GPIOA ~ GPIOK
    入口参数 2GPIO_Init:指向引脚初始化类型 GPIO_InitTypeDef 的结构体指针,该结构体包含指定引脚的配置参数
    返回值GPIO_PinState:表示引脚电平状态的枚举类型变量,可以是GPIO_PIN_SET 或 GPIO_PIN_RESET
    注意事项该函数需要用户调用
  4. 写入引脚函数:HAL_GPIO_WritePin

    函数原型void HAL_GPIO_WritePin( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState )
    功能描述设置引脚输出高/低电平
    入口参数 1GPIOx:引脚端口号,取值范围是 GPIOA ~ GPIOK
    入口参数 2GPIO_Init:指向引脚初始化类型 GPIO_InitTypeDef 的结构体指针,该结构体包含指定引脚的配置参数
    返回值GPIO_PinState:表示引脚电平状态的枚举类型变量,可以是 GPIO_PIN_SET 或 GPIO_PIN_RESET
    注意事项该函数需要用户调用
  5. 翻转引脚函数:HAL_GPIO_TogglePin

    函数原型void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
    功能描述翻转引脚状态
    入口参数 1GPIOx:引脚端口号,取值范围是 GPIOA ~ GPIOK
    入口参数 2GPIO_Init:指向引脚初始化类型 GPIO_InitTypeDef 的结构体指针,该结构体包含指定引脚的配置参数
    返回值
    注意事项该函数需要用户调用

任务实践

基于STM32F103C8T6,开发板原理图

图片

采用查询方式检测按键KEY1状态,按键按下后执行操作:翻转指示灯 LED1 的状态。

注:本任务例程使用的开发板,LED1与STM32的PA1相连接,KEY1与PA0相连接。KEY1原理图如下:

图片

使用按键时,需要设置PA0为输入上拉模式,这样在KEY1没有按下时,PA0可以读取到高电平,KEY1按下时PA0可以读取到低电平。

按键消抖:

通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。

抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。

下图为按键按下时,电压波形的变化。

图片

  • 前沿抖动 5 ~ 10ms,后沿抖动 5 ~ 10ms
  • 按键的抖动会导致一次按键动作被当成多次按键,为确保 MCU 对按键的一次闭合仅作一次处理,必须消除按键的抖动,在按键处于稳定状态时读取按键的状态。
  • 硬件消抖:利用 RC 低通滤波器滤掉抖动
    图片
  • 软件消抖:
    1. 检测出按键闭合后执行延时程序,延时时间为 5ms ~ 10ms,用于去掉前沿抖动;
    2. 再次检测按键状态,如果保持闭合状态,才认为按下,并执行相应的按键任务;
    3. 按键的释放可以采用延时或者循环检测的方式去掉后沿抖动。
  1. 配置 PA0 为 GPIO_Input,PA1 为 GPIO_Output
    图片
  2. PA1 保持默认 GPIO 输出模式即可
    图片
  3. PA0 配置为输入模式,上拉
    图片

以上步骤生成如下代码:

stm32f1xx_hal_gpio.c中生成 GPIO 引脚初始化函数MX_GPIO_Init,并在 main.c 中调用

  • 开启外设时钟 RCC
  • 配置 PA0,PA1 两个引脚结构
void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);

  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : PA1 */
  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}
  1. 编写程序

main.c中编写程序

/* USER CODE BEGIN 3 */
    if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
    {
      HAL_Delay(10);
      if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
      {
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
      }
      while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET);
    }
  }
  /* USER CODE END 3 */
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 继电器
    +关注

    关注

    131

    文章

    5027

    浏览量

    146050
  • 接口
    +关注

    关注

    33

    文章

    7639

    浏览量

    148483
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348738
  • GPIO
    +关注

    关注

    16

    文章

    1133

    浏览量

    50570
  • HAL库
    +关注

    关注

    1

    文章

    112

    浏览量

    5878
收藏 人收藏

    评论

    相关推荐

    GPIO通用输入输出接口

    I/O接口GPIO、IIC、SPI、UART、USB、HDMI(1)GPIO通用输入输出接口
    发表于 12-16 07:20

    通用输入输出端口GPIO配置说明

    STM32F0系列学习】之—通用输入输出端口GPIO1、GPIO端口配置说明1、GPIO端口配
    发表于 01-24 07:42

    STM32F2技术培训_通用输入输出端口_GPIO

    STM32F2技术培训_通用输入输出端口_GPIO
    发表于 12-03 17:34 0次下载

    通用输入输出(GPIO)

    I/O(Input/Output)接口是一颗微控制器必须具备的最基本外设功能。在 Stellaris 系列ARM 里,所有 I/O 都是通用的,称为 GPIO(General Purpose
    发表于 01-13 16:33 33次下载

    6.2 通用输入输出GPIO(神舟王207)

    此文档是关于神舟王开发板之输入输出GPIO的介绍和讲解;
    发表于 05-25 10:01 2次下载

    F2产品技术培训_8.通用输入输出端口(GPIO

    F2产品技术培训_8.通用输入输出端口(GPIO
    发表于 03-15 14:43 11次下载

    MCU学习笔记_GPIO工作原理

    purpose input output, 通用输入输出端,可通过程序软件配置成输入或者输出端。引脚与GPIO的区别和联系
    发表于 10-25 11:21 17次下载
    MCU学习笔记_<b class='flag-5'>GPIO</b>工作原理

    MCU通用输入输出端口(GPIO)输出模式

    对于常规MCU,通用输入输出GPIO)是其最基本、最常用的功能,用于实现最基本的数字量输入输出。 信号一般为:以3.3VDC为高电平的
    发表于 10-28 19:06 16次下载
    MCU<b class='flag-5'>通用</b><b class='flag-5'>输入输出</b>端口(<b class='flag-5'>GPIO</b>)<b class='flag-5'>输出</b>模式

    04、STM8通用输入输出口(GPIO)

    04、STM8通用输入输出口(GPIO)文章目录04、STM8通用输入输出口(GPIO)1、概述
    发表于 11-26 15:21 9次下载
    04、STM8<b class='flag-5'>通用</b><b class='flag-5'>输入输出</b>口(<b class='flag-5'>GPIO</b>)

    STM32的8种GPIO输入输出模式

    STM32的8种GPIO输入输出模式参考文章“STM32的8种GPIO输入输出模式深入详解”和“
    发表于 11-26 17:06 16次下载
    <b class='flag-5'>STM32</b>的8种<b class='flag-5'>GPIO</b><b class='flag-5'>输入输出</b>模式

    [STM32]STM32F407系列教程之二,gpio输入输出实验

    [STM32]STM32F407系列教程之二,gpio输入输出实验
    发表于 11-29 14:06 17次下载
    [<b class='flag-5'>STM32</b>]<b class='flag-5'>STM32</b>F407系列教程之二,<b class='flag-5'>gpio</b><b class='flag-5'>输入输出</b>实验

    GPIO通用输入输出

    GPIO通用输入输出一、GPIO的功能概述用途:GPIO通用
    发表于 12-20 18:58 6次下载
    <b class='flag-5'>GPIO</b><b class='flag-5'>通用</b><b class='flag-5'>输入输出</b>

    第二章 stm32 cubemx GPIO输入输出实验以及proteus仿真

    第二章 stm32 cubemx GPIO输入输出实验以及proteus仿真文章目录第二章 stm32 cubemx GPIO
    发表于 01-17 10:28 8次下载
    第二章 <b class='flag-5'>stm32</b> cubemx <b class='flag-5'>GPIO</b><b class='flag-5'>输入输出</b>实验以及proteus仿真

    通用输入输出GPIO是什么

    GPIO代表通用输入/输出。它是集成电路上的一种引脚,没有特定功能。虽然大多数引脚都有专用用途,例如向特定组件发送信号,但 GPIO 引脚的
    发表于 03-23 14:04 962次阅读
    <b class='flag-5'>通用</b><b class='flag-5'>输入输出</b><b class='flag-5'>GPIO</b>是什么

    树莓派GPIO(通用输入输出)讲解

    界面(GUI),网络通信等等。但目前的知识已经可以让我们使用Python编写简单程序了。我们先放下Python,开始学习树莓派最好玩的部分GPIO(通用输入输出)。
    的头像 发表于 07-02 15:00 4484次阅读
    树莓派<b class='flag-5'>GPIO</b>(<b class='flag-5'>通用</b><b class='flag-5'>输入输出</b>)讲解