STM32学习—GPIO配置步骤(一个宏和四个函数)基于HAL库

本文详细介绍了STM32中通用外设驱动模型的四步法,包括时钟启用、GPIO初始化、IO操作和中断处理,以及使用HAL库提供的HAL_RCC_GPIOx_CLK_ENABLE()、HAL_GPIO_Init()、HAL_GPIO_WritePin()、HAL_GPIO_TogglePin()和HAL_GPIO_ReadPin()函数进行GPIO配置的操作和原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通用外设驱动模型(四步法)

1、初始化
时钟设置、参数设置、IO设置、中断设置(开中断、设NVIC)
2、读函数(可选)
从外设读取数据(可选)
3、写函数(可选)
往外设写入数据(可选)
4、中断服务函数(可选)
根据中断标志,处理外设各种中断事务(可选)

GPIO配置步骤

1.使能时钟

__HAL_RCC_GPIOx_CLK_ENABLE()
//小写的x代表A、B、C等等
//宏

2.设置工作模式(八种)

HAL_GPIO_Init()
//函数

3.设置输出状态(可选)

HAL_GPIO_WritePin()
HAL_GPIO_TogglePin()
//函数

4.读取输入状态(可选)

HAL_GPIO_ReadPin()
//函数
HAL库驱动函数主要寄存器功能
__HAL_RCC_GPIOx_CLK_ENABLE()F:RCC_APB2ENR
F4:RCC_AHB1ENR
F7:RCC_AHB1ENR
H7:RCC_AHB4ENR
开启GPIO时钟
HAL_GPIO_Init(…)F1:CRL、CRH、ODR
F4/F7/H7:MODER、OTYPER、
OSPEEDR、PUPDR
初始化GPIO
HAL_GPIO_WritePin(…)BSRR控制IO输出高/低电平
HAL_GPIO_TogglePin(…)BSRR每次调用IO输出电平翻转一次
HAL_GPIO_ReadPin(…)IDR读取IO电平

一、宏__HAL_RCC_GPIOx_CLK_ENABLE()

//stm32f1xx_hal_rcc.h
#define __HAL_RCC_GPIOA_CLK_ENABLE()   do { \
                                        __IO uint32_t tmpreg; \
                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);\
                                        /* Delay after an RCC peripheral clock enabling */\
                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);\
                                        UNUSED(tmpreg); \
                                      } while(0U)
//stm32f1xx.h
#define SET_BIT(REG, BIT)     ((REG) |= (BIT))
//第一个参数RCC->APB2ENR,主要寄存器
//第二个参数RCC_APB2ENR_IOPAEN, 1<<2   1左移两位
//stm32f103xe.h
#define RCC_APB2ENR_IOPAEN_Pos               (2U)                              
#define RCC_APB2ENR_IOPAEN_Msk               (0x1UL << RCC_APB2ENR_IOPAEN_Pos)  /*!< 0x00000004 */

// 寄存器 |= 1<<2,也就是将寄存器的位2设置为1
//APB2 外设时钟使能寄存器

查看手册中APB2第二个位,为1表示IO端口A时钟开启
在这里插入图片描述

二、void HAL_GPIO_Init(…)函数

声明

void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init)

函数描述
用于配置GPIO功能模式,还可以设置EXTI功能

函数形参
形参1是端口号,可以有以下的选择

#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)     //寄存器基地址
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)

形参2是GPIO_InitYypeDef类型的结构体变量,其定义如下:

typedef struct
{
 uint32_t Pin; /* 引脚号 */
 uint32_t Mode; /* 模式设置 */
 uint32_t Pull; /* 上拉下拉设置 */
 uint32_t Speed; /* 速度设置 */
} GPIO_InitTypeDef;

成员 Pin 表示引脚号,范围:GPIO_PIN_0 到 GPIO_PIN_15,另外还有 GPIO_PIN_All 和
GPIO_PIN_MASK 可选。
成员Mode是GPIO的模式选择,有以下选择项:

#define GPIO_MODE_INPUT (0x00000000U) /* 输入模式 */
#define GPIO_MODE_OUTPUT_PP (0x00000001U) /* 推挽输出 */
#define GPIO_MODE_OUTPUT_OD (0x00000011U) /* 开漏输出 */
#define GPIO_MODE_AF_PP (0x00000002U) /* 推挽式复用 */
#define GPIO_MODE_AF_OD (0x00000012U) /* 开漏式复用 */
#define GPIO_MODE_AF_INPUT GPIO_MODE_INPUT
#define GPIO_MODE_ANALOG (0x00000003U) /* 模拟模式 */
#define GPIO_MODE_IT_RISING (0x10110000u) /* 外部中断,上升沿触发检测 */
#define GPIO_MODE_IT_FALLING (0x10210000u) /* 外部中断,下降沿触发检测 */
/* 外部中断,上升和下降双沿触发检测 */
#define GPIO_MODE_IT_RISING_FALLING (0x10310000u) 
#define GPIO_MODE_EVT_RISING (0x10120000U) /*外部事件,上升沿触发检测 */
#define GPIO_MODE_EVT_FALLING (0x10220000U) /*外部事件,下降沿触发检测 */
/* 外部事件,上升和下降双沿触发检测 */
#define GPIO_MODE_EVT_RISING_

成员Pull用于配置上下拉电阻,有以下选择项:

#define GPIO_NOPULL (0x00000000U) /* 无上下拉 */
#define GPIO_PULLUP (0x00000001U) /* 上拉 */
#define GPIO_PULLDOWN (0x00000002U) /* 下拉 */

成员 Speed 用于配置 GPIO 的速度,有以下选择项:

#define GPIO_SPEED_FREQ_LOW (0x00000002U) /* 低速2M */
#define GPIO_SPEED_FREQ_MEDIUM (0x00000001U) /* 中速 10M*/
#define GPIO_SPEED_FREQ_HIGH (0x00000003U) /* 高速50M */

返回值

三、HAL_GPIO_WritePin(…)函数

HAL_GPIO_WritePin 函数是 GPIO 口的写引脚函数。其声明如下:

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

函数描述
用于设置引脚输出高电平或低电平,通过BDRR寄存器复位或置位操作。
函数形参
形参1是端口号,可以选择范围:GPIOA~GPIOG。
形参2是引脚号,可以选择范围:GPIO_PIN_0到GPIO_PIN_15。
形参3是要设置输出的状态,是枚举型有两个选择:GPIO_PIN_SET表示高电平,GPIO_PIN_RESET表示低电平。
返回值

四、HAL_GPIO_TogglePin(…)函数

HAL_GPIO_TogglePin函数是GPIO口的电平翻转函数。其声明如下:

void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

函数描述
用于设置引脚的电平翻转,也是通过BSRR寄存器复位或者置位操作。
函数形参
形参1是端口号,选择范围:GPIOA~GPIOG。
形参2是引脚号,选择范围:GPIO_PIN_0到GPIO_PIN_15。
返回值

五、HAL_GPIO_ReadPin(…)函数

声明

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

函数描述
读取指定GPIO端口和引脚号的电平状态。
函数形参
形参1是端口号,选择范围:GPIOA~GPIOG。
形参2是引脚号,选择范围:GPIO_PIN_0到GPIO_PIN_15。
返回值
GPIO_PIN_SET :高电平1
GPIO_PIN_RESER :低电平0

参考:《STM32F103 精英开发指南V1.3》正点原子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值