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

文章目录

  • 前言
  • GPIO
  • GPIO初始化
    • GPIO_InitTypeDef
    • 使用HAL库进行GPIO初始化的示例代码:
  • 结束

前言

我在学习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吧

结束

如果对你有帮助,点赞支持一下吧
转载联系作者。

你可能感兴趣的:(STM32,单片机,stm32,物联网)