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

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)

参数说明:

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);
        }
    }
}

上面代码初始化了俩个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);

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
  }
}

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

结束

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

  • 44
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张顺(Strange_Head)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值