当前位置:   article > 正文

基于HAL库的GPIO端口三个基础函数HAL_GPIO_Init()、HAL_GPIO_ReadPin()和HAL_GPIO_WritePin()

hal_gpio_init

HAL_GPIO_Init():初始化GPIO引脚函数

HAL_GPIO_Init() 是 STMicroelectronics 为其 STM32 微控制器系列提供的 HAL(硬件抽象层)库中的一个函数。

HAL_GPIO_Init() 函数的目的是初始化 STM32 微控制器的 GPIO(通用输入/输出)引脚。 GPIO 引脚可配置为输入或输出引脚,并可用于连接各种组件,如传感器、显示器和其他设备。

HAL_GPIO_Init() 函数将要初始化的 GPIO 引脚以及各种配置参数作为输入,例如引脚模式(输入、输出、复用功能)、输出类型(推挽或开漏)、输出速度、 和上拉/下拉电阻。

这个函数我在其他文章中也写道了,具体参考这个文章:
https://blog.csdn.net/qq_52749711/article/details/129559234

HAL_GPIO_ReadPin():读取GPIO引脚的状态

HAL_GPIO_ReadPin() 是STM32 HAL库中用于读取GPIO引脚电平状态的函数。下面是该函数的详细说明和带中文注释的代码示例:

函数原型:

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  • 1

参数说明:

GPIOx:GPIO端口号,例如 GPIOA、GPIOB、GPIOC 等。

GPIO_Pin:GPIO引脚号,可以是单独的引脚号,例如 GPIO_PIN_0,也可以是多个引脚的按位或组合,例如 GPIO_PIN_0 | GPIO_PIN_1。
返回值说明:

  • GPIO_PIN_RESET:引脚为低电平。
  • GPIO_PIN_SET:引脚为高电平。

函数作用:
读取指定GPIO端口和引脚号的电平状态。

HAL_GPIO_ReadPin()代码示例

/* 以读取GPIOA的第0个引脚状态为例 */
/* 如果该引脚为高电平,则点亮LED灯,否则熄灭LED灯 */

#include "stm32f4xx_hal.h"

#define LED_PIN GPIO_PIN_5
#define LED_PORT GPIOA

int main(void)
{
    HAL_Init();

    /* 使能GPIOA时钟 */
    __HAL_RCC_GPIOA_CLK_ENABLE();

    GPIO_InitTypeDef GPIO_InitStruct;

    /* 配置GPIOA第0个引脚为输入引脚 */
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;	//设置为输入模式
    GPIO_InitStruct.Pull = GPIO_PULLUP;  // 内部上拉电阻
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* 配置GPIOA第5个引脚为输出引脚 */
    GPIO_InitStruct.Pin = LED_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  // 推挽输出
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);

    while (1)
    {
        /* 读取GPIOA的第0个引脚状态 */
        if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET)
        {
            /* 如果引脚为高电平,则点亮LED灯 */
            HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);
        }
        else
        {
            /* 如果引脚为低电平,则熄灭LED灯 */
            HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

上面代码初始化了俩个GPIO一个用做输出控制LED小灯,一个用作输入等待信号。while循环中不断读取GPIO_PIN_0管脚的数据,如果为高电平则将LED灯点亮,否则熄灭LED灯。

HAL_GPIO_WritePin():设置GPIO引脚的状态

HAL_GPIO_WritePin() 是一个由 STMicroelectronics 提供的函数,用于控制 GPIO 端口的输出状态。下面是该函数的详细说明:

函数原型:

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
  • 1

GPIOx:GPIO 端口号,例如 GPIOA、GPIOB 等;
GPIO_Pin:GPIO 端口对应的引脚编号,例如 GPIO_PIN_0、GPIO_PIN_1 等;
PinState:GPIO 端口输出的状态,可以是 GPIO_PIN_RESETGPIO_PIN_SET

函数作用:
该函数用于控制 GPIO 端口对应引脚的输出状态,将引脚输出电平设置为 PinState。

函数实现原理:
该函数的实现原理比较简单,它通过设置相应的寄存器来改变 GPIO 端口的输出状态。具体实现步骤如下:

读取 GPIO 端口的输出状态寄存器(ODR)的值;
根据 PinState 参数设置相应的 GPIO 引脚的状态;
将更新后的状态值写入 ODR 寄存器中。

HAL_GPIO_WritePin()示例代码:

下面是一个简单的示例代码,演示如何使用 HAL_GPIO_WritePin() 函数来控制 LED 灯的闪烁。

#include "stm32f4xx_hal.h"

int main(void)
{
  // 初始化GPIO引脚
  GPIO_InitTypeDef GPIO_InitStruct;
  __HAL_RCC_GPIOA_CLK_ENABLE();   // 打开GPIOA时钟
  GPIO_InitStruct.Pin = GPIO_PIN_5;    // 设置GPIO引脚5
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;   // 设置为推挽输出模式
  GPIO_InitStruct.Pull = GPIO_NOPULL;           // 不使用上下拉电阻
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;  // 设置GPIO速度为低速
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);      // 初始化GPIOA

  while (1)
  {
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);   // 将引脚5设置为高电平
    HAL_Delay(500);   // 延时500ms
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 将引脚5设置为低电平
    HAL_Delay(500);   // 延时500ms
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在这个示例程序中,首先我们使用GPIO_InitTypeDef结构体来初始化GPIO引脚。然后在无限循环中,我们使用HAL_GPIO_WritePin()函数来控制LED灯的闪烁,将GPIO引脚5设置为高电平,然后延时500ms,接着将GPIO引脚5设置为低电平,再次延时500ms。循环不断重复这个过程,从而使LED灯不断地闪烁。

结束

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/82829
推荐阅读
  

闽ICP备14008679号