通用输入输出端口GPIO,及其初始化(HAL库)

这篇具有很好参考价值的文章主要介绍了通用输入输出端口GPIO,及其初始化(HAL库)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

我在学习STM32时候呢,是直接先接触的STM32CubeMX软件,更着网上各种教程迷迷糊糊学了一大堆没用的东西,于是先一步步来吧,我总结了很长时间,希望对正在学习相关知识的朋友们有帮助。

可以先去看看STM32CubeMX如何配置:传送门

读完以上我写的文章基本上是蒙的,因为我写文章时候也有这样的感觉,感觉学到了什么又感觉什么也没学到,虽然最后灯亮了,但原理什么的都不知道,于是开始学习GPIO口如何去操作的,就像51一样开始入手P0^0控制高低电平一个道理。

GPIO

STM32的GPIO是一种通用的输入/输出端口,可以配置为数字输入、数字输出或其他功能。每个GPIO引脚可以分配一个独立的功能或者作为另一个模块的输入或输出端口使用,例如UART、SPI或I2C总线等。

GPIO可以用于许多应用,例如控制LED、读取按键、测量模拟信号、驱动电机等等。在STM32中,GPIO具有以下特点:

  • 独立性:每个GPIO引脚可以配置为独立的输入或输出。

  • 高速性:GPIO引脚可以高速切换,速度高达100 MHz。

  • 低功耗:GPIO引脚可以配置为低功耗模式,在待机和休眠模式下仍然可以正常工作。

  • 配置灵活:每个GPIO引脚可以配置为不同的模式,例如输入、输出、复用功能等。

在STM32中,GPIO的配置包括以下几个方面:

  • GPIO模式:GPIO模式有四种,分别是输入模式、输出模式、复用功能模式和模拟模式

  • 输出类型:GPIO输出可以配置为推挽输出或开漏输出

  • 输出速度:GPIO输出速度可以配置为低速、中速或高速

  • 上拉/下拉:GPIO输入可以配置为上拉或下拉,以确保在没有外部信号的情况下保持高电平或低电平状态。

  • 中断:GPIO引脚可以配置为触发中断,例如在输入模式下配置为上升沿触发或下降沿触发。

在STM32中,GPIO的配置使用寄存器来实现。例如,通过配置GPIOx_MODER寄存器可以选择GPIO引脚的模式,通过配置GPIOx_OSPEEDR寄存器可以选择输出速度,通过配置GPIOx_PUPDR寄存器可以选择上拉/下拉等等。

总之,STM32的GPIO是一种非常灵活和功能强大的通用输入/输出端口,可以满足各种应用的需
求。

GPIO初始化

GPIO(General Purpose Input/Output)是嵌入式系统中常用的一个外设,它能够对外部数字信号进行输入和输出。在使用GPIO之前,我们需要对其进行初始化配置。在HAL库中,GPIO的初始化主要涉及到以下结构体:

GPIO_InitTypeDef:GPIO初始化配置结构体,包含了GPIO的各项参数,如引脚方向、输出类型、上下拉电阻等。

GPIO_PinState:GPIO引脚状态枚举类型,包含了GPIO引脚的状态值,可选值为GPIO_PIN_RESET(低电平)和GPIO_PIN_SET(高电平)。

GPIO_InitTypeDef

GPIO_InitStruct是在STM32微控制器中使用的一个结构体类型,用于配置GPIO(通用输入输出)端口的各种参数。下面是该结构体的详细说明:

typedef struct
{
   uint32_t Pin;   /*!< 指定要配置的 GPIO 引脚。
                             这个参数可以是@ref GPIO_pins_define 的任意值 */

   uint32_t Mode;  /*!< 指定所选引脚的操作模式。
                             这个参数可以是@ref GPIO_mode_define 的值 */

   uint32_t Pull;  /*!< 指定所选引脚的上拉或下拉激活。
                             这个参数可以是@ref的值 GPIO_pull_define */

   uint32_t Speed; /*!< 指定所选引脚的速度。
                             这个参数可以是@ref GPIO_speed_define 的值 */

   uint32_t Alternate; /*!< 要连接到所选引脚的外设。
                             这个参数可以是@ref的值 GPIO_alternate_function_define */

}GPIO_InitTypeDef;

下面是各个参数的详细解释:

Pin:指定需要配置的GPIO引脚,可以使用位运算符(|)将多个引脚进行组合。使用时需要参考GPIO的官方文档,查看具体支持的引脚和引脚编号。

Mode:指定GPIO的工作模式。常见的模式包括输入(GPIO_MODE_INPUT)、输出(GPIO_MODE_OUTPUT_PP)、开漏输出(GPIO_MODE_OUTPUT_OD)和复用模式(GPIO_MODE_AF_PPGPIO_MODE_AF_OD)。其中,PP表示推挽输出模式,OD表示开漏输出模式,AF表示复用模式。

Pull:指定GPIO的上拉或下拉电阻是否启用。常见的选项包括上拉(GPIO_PULLUP)、下拉(GPIO_PULLDOWN)和不启用(GPIO_NOPULL)。

Speed:指定GPIO的输出速度。常见的速度选项包括低速(GPIO_SPEED_FREQ_LOW)、中速(GPIO_SPEED_FREQ_MEDIUM)和高速(GPIO_SPEED_FREQ_HIGH)。

Alternate:指定GPIO的复用功能。当GPIO被设置为复用模式时,需要指定它所连接的外设。常见的复用功能包括USART、SPI、I2C等。

下面是一个示例代码:

// 初始化GPIO_InitStruct结构体变量
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0;        // 选择GPIO引脚0
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  // 设置为推挽输出模式
GPIO_InitStruct.Pull = GPIO_NOPULL;      // 不使用上下拉电阻
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;  // 设置GPIO速度为低速
GPIO_InitStruct.Alternate = 0;           // 不使用备用功能

// 调用HAL_GPIO_Init()函数,对GPIO进行初始化
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

接下来是GPIO的初始化步骤:(具体思路)

首先,需要使能GPIO时钟。在STM32中,每个GPIO都有一个对应的时钟控制寄存器,需要先使能相应的时钟才能使用该GPIO。例如,要使用GPIOA,需要先使能GPIOA的时钟,可以通过调用RCC_AHB1PeriphClockCmd()函数实现。

然后,需要初始化GPIO_InitTypeDef结构体,对GPIO进行配置。例如,对于一个输出引脚,需要设置引脚方向为输出,输出类型为推挽输出或开漏输出,上下拉电阻为上拉或下拉等。配置完毕后,将GPIO_InitTypeDef结构体作为参数,调用HAL_GPIO_Init()函数进行初始化。

在使用GPIO时,可以通过HAL_GPIO_ReadPin()HAL_GPIO_WritePin()函数读写GPIO引脚的状态。其中,HAL_GPIO_ReadPin()函数用于读取GPIO引脚的状态值,返回值为GPIO_PinState类型;HAL_GPIO_WritePin()函数用于设置GPIO引脚的状态值,参数为GPIO_PinState类型。

使用HAL库进行GPIO初始化的示例代码:

#include "stm32f4xx_hal.h"

/* 初始化GPIO */
void GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  
  /* 使能GPIO时钟 */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /* 配置GPIOA的引脚12为推挽输出模式 */
  GPIO_InitStruct.Pin = GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

/* 在GPIOA的引脚12上设置高电平 */
void set_GPIOA_Pin_12(void)
{
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);
}

/* 在GPIOA的引脚12上设置低电平 */
void reset_GPIOA_Pin_12(void)
{
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
}

/* 读取GPIOA的引脚12状态 */
GPIO_PinState get_GPIOA_Pin_12(void)
{
  return HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12);
}

这段代码初始化了,GPIOA的PIN12,顺着我的文章看下来应该是明白的。后面涉及到了俩个新函数HAL_GPIO_WritePin和HAL_GPIO_ReadPin,我打算放在后面单独拿一篇文章讲解一下。
这俩个函数看这个链接。
https://blog.csdn.net/qq_52749711/article/details/129712100?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22129712100%22%2C%22source%22%3A%22qq_52749711%22%7D
文章到这里大家应该知道了什么是GPIO和掌握了如何去初始化GPIO吧

结束

如果对你有帮助,点赞支持一下吧
转载联系作者。文章来源地址https://www.toymoban.com/news/detail-703496.html

到了这里,关于通用输入输出端口GPIO,及其初始化(HAL库)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 GPIO设置(GPIO初始化)学习笔记

    GPIO 都知道是 通用输入输出接口 的意思就不详细解释 那么我们就直接进入怎么设置GPIO接口: 这里我的编译软件是keil5,相信大家都应该知道stm32有各种的工作模式上拉、下拉、推挽、开漏等等。如果想要了解具体的工作模式原理这里我推荐大家看:推挽 开漏 高阻 这都是谁

    2024年03月28日
    浏览(59)
  • STM32的GPIO初始化配置-学习笔记

            由于刚开始没有学懂GPIO的配置原理,导致后面学习其它外设的时候总是产生阻碍,因为其它外设要使用前,大部分都要配置GPIO的初始化,因此这几天重新学习了一遍GPIO的配置,记录如下。         首先我们要知道芯片上的引脚,并不是只有GPIO的功能,还能复用成

    2024年04月17日
    浏览(56)
  • 【奇葩瑞萨-004】RX系列单片机的GPIO初始化

    以RX66T单片机和RX130单片机为例。 端口的配置,就是写入端口配置相关寄存器的过程。 就瑞萨RX系列单片机而言,包括PORT寄存器和MPC寄存器。 PDR:GPIO方向寄存器,读/写型 1:输出 0:输入(默认值) PORTm.PDR.BITn对应Pmn。 有些端口只内建了输入逻辑门电路,即便将其PDR位设置

    2024年02月14日
    浏览(41)
  • stm32 hal库 GPIO初始化函数MX_GPIO_Init()梳理分析、初步细致学习(二)

    目录 一、GPIO外设时钟初始化 二、配置GPIO 2.1 配置 GPIO_InitTypeDef结构体成员变量  2.2 把参数写到对应寄存器 2.2.1 io口的配置 2.2.2 外部中断的配置 三、相关知识分析 3.1 hal_gpio其他函数简单分析 3.1.1 HAL_GPIO_DeInit(); 3.1.2  HAL_GPIO_ReadPin(); 3.1.3  HAL_GPIO_WritePin(); 3.1.4  HAL_GPIO_Togg

    2024年02月04日
    浏览(78)
  • 物联网Lora模块从入门到精通(四)对某些端口的初始化

            由于程序设计开发具有的不确定性,我们常常需要初始化某些特定的引脚,并读取引脚电平状态或向引脚输出高低电平。         快速找到端口的初始化语句:         首先,找到board.c文件,在下图的位置,我们可以看到关于LED灯的端口的初始化语句。        

    2024年02月08日
    浏览(47)
  • 基于VUE3+Layui从头搭建通用后台管理系统(前端篇)一:项目规划及初始化

      使用vue3+Layui实现通用管理系统前端,使用vue3+layui搭建系统UI界面,使用nodejs搭建模拟web服务器,使用echarts实现系统可视化模块,可以此项目为基础进行扩展开发,快速搭建管理系统,具体内容如下:    1. 常见功能实现: 实现用户登录(用户名密码登录、手机验证码

    2024年02月13日
    浏览(58)
  • 【开篇】STM32F103C8T6 含义、命名规则、GPIO原理以及初始化(参考男神江科协,学习交流用)

    目录 目录 一,STM系列命名规则 二.引脚功能 三.电路以及寄存器 1.产品系列:         STM32代表意法半导体的Cortex-Mx系列内核(ARM)32位的MCU 2.产品类型: F-通用型,S-简单型,L-低功耗,H-高性能,AL-汽车应用低功耗型,AF-汽车应用通用型。 3.产品子系列: 103:ARM Cortex-M3内核

    2024年01月17日
    浏览(90)
  • stm32学习笔记-3GPIO通用输入输出口

    注:笔记主要参考B站 江科大自化协 教学视频“STM32入门教程-2023持续更新中”。 注:工程及代码文件放在了本人的Github仓库。 GPIO (General Purpose Input Output) 通用输入输出口 可配置为8种输入输出模式。 引脚电平范围为0V~3.3V ,部分引脚可容忍5V(图1-6中IO口电平为FT标识的)

    2024年02月15日
    浏览(118)
  • 【STM32教程】第二章 通用输入输出口GPIO

    资料下载链接: 链接:https://pan.baidu.com/s/1hsIibEmsB91xFclJd-YTYA?pwd=jauj  提取码:jauj    GPIO(General Purpose Input Output)意思是通用输入输出口可配置为8种输入输出模式,其引脚电平:0V~3.3V,部分引脚可容忍5V(容忍5V的意思是可以在这个端口输入5V,相当于输入一个高电平,而输

    2024年02月09日
    浏览(52)
  • 【数据结构】线性表(六)堆栈:顺序栈及其基本操作(初始化、判空、判满、入栈、出栈、存取栈顶元素、清空栈)

       堆栈Stack 和 队列Queue 是两种非常重要的数据结构,两者都是特殊的线性表: 对于堆栈,所有的插入和删除(以至几乎所有的存取)都是在表的同一端进行 对于队列,所有的插入都是在表的一端进行,所有的删除(以至几乎所有的存取)都是在表的另一端进行。    堆

    2024年02月07日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包