文章目录

  • 一 .初始化GPIO
  • (一)定义一个结构体变量GPIO_InitStruct,该变量类型是GPIO_InitTypeDef。
  • (二).使能时钟。
  • (三)配置引脚的初始化电平。
  • (四).通过结构体变量配置具体的引脚。
  • 二.GPIO相关寄存器
  • 1.**GPIO端口模式寄存器(GPIOx_MODER)(x=A...I)**
  • 2.**GPIO端口输出类型寄存器(GPIOx_OTYPER)(x = A...I)**
  • 3.**GPIO端口上拉/下拉寄存器(GPIOx_PUPDR)(x=A...I)**
  • 4.**GPIO端口输入数据寄存器(GPIOx_IDR)(x=A...I)**
  • 5.**GPIO端口输出数据寄存器(GPIOx_ODR)(x=A...I)**
  • 6.**GPIO端口置位/复位寄存器(GPIOx_BSRR)(x=A...I)**
  • 7.**GPIO端口配置锁定寄存器(GPIOx_LCKR)(x=A...I)**
  • 8.**GPIO复用功能低位寄存器(GPIOx_AFRL)(x=A...I)**
  • 9.**GPIO复用功能高位寄存器(GPIOx_AFRH)(x=A...I)**
  • 总结

前言:作为一个刚开始接触HALL库的小白,写了一点自己用hall库配置GPIO的方法以及GPIO的相关东西,供各位大佬看看。
废话不多说,进入主题。

一 .初始化GPIO

使用HAL库的优点在于不用手动添加初始化的代码了,CubeMX会根据软件设置自动生成,就在下图里面生成你想配置的GPIO及功能。

而这个就是自动生成的HAL库GPIO初始化代码:

static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;/* GPIO Ports Clock Enable */__HAL_RCC_GPIOH_CLK_ENABLE();__HAL_RCC_GPIOD_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);/*Configure GPIO pin : PD11 */GPIO_InitStruct.Pin = GPIO_PIN_11;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);/*Configure GPIO pins : PD12 PD13 PD14 PD15 */GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);}

首先定义结构体变量,接着使能时钟,然后配置初始化电平,最后通过结构体变量初始化GPIO。

(一)定义一个结构体变量GPIO_InitStruct,该变量类型是GPIO_InitTypeDef。

GPIO_InitTypeDef 定义如下:

   GPIO Init structure definition  typedef struct
{uint32_t Pin;       /*!< Specifies the GPIO pins to be configured.This parameter can be any value of @ref GPIO_pins_define */uint32_t Mode;      /*!< Specifies the operating mode for the selected pins.This parameter can be a value of @ref GPIO_mode_define */uint32_t Pull;      /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.This parameter can be a value of @ref GPIO_pull_define */uint32_t Speed;     /*!< Specifies the speed for the selected pins.This parameter can be a value of @ref GPIO_speed_define */uint32_t Alternate;  /*!< Peripheral to be connected to the selected pins. This parameter can be a value of @ref GPIO_Alternate_function_selection */
}GPIO_InitTypeDef;

主要配置的是哪个引脚(pin)、引脚工作模式(mode)、上拉还是下拉(pull-up/pull-down)、速度大小(speed),其实(go to defination)进行调用就可。

(二).使能时钟。

  GPIO Ports Clock Enable __HAL_RCC_GPIOH_CLK_ENABLE();__HAL_RCC_GPIOD_CLK_ENABLE();

**敲黑板划重点了: 这里使能时钟的方法与标准库不一样,HAL库其实是宏定义,标准库则是函数。**这个很关键!!!

(三)配置引脚的初始化电平。

Configure GPIO pin Output Level HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);

这里设置D口的pin12、pin13、pin14、pin15为高电平。如果最后一个参数是GPIO_PIN_RESET则为低电平。

(四).通过结构体变量配置具体的引脚。

 /*Configure GPIO pin : PD11 */GPIO_InitStruct.Pin = GPIO_PIN_11;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);/*Configure GPIO pins : PD12 PD13 PD14 PD15 */GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

PD11为输入,上拉。PD12-15为推挽输出。所以分开配置。
这样的话一个简单的GPIO口就配置好了。

二.GPIO相关寄存器

例如GPIOA 寄存器地址映射如下表:

从这个表我们可以看出, 因为 GIPO 寄存器都是 32 位,所以每组 GPIO 的 12 个寄存器中(GPIOX有12个寄存器), 每个寄存器占有 4 个地址(一个地址是8位的),一共占用 48 个地址,地址偏移范围为(0x00~0x2C)。这个地址偏移是相对 GPIOA 的基地址而言的。
所谓的一个地址通常是指字节地址,能存8位数据。如果是字地址,STM32字长32位,意味着CPU一次性从RAM或ROM中存取的数据是32位的。因此,STM32的地址必须是32位对齐的。

1.GPIO端口模式寄存器(GPIOx_MODER)(x=A…I)

GPIO port mode register

偏移地址:0x00

复位值:

0xA800 0000(端口A)

0x0000 0280(端口B)

0x0000 0000(其他端口)

位2y:2y+1 MODERy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)

                  这些位通过软件写入,用于配置I/O方向模式。00:输入(复位状态)01:通用输出模式10:复用功能模式11:模拟状态

2.GPIO端口输出类型寄存器(GPIOx_OTYPER)(x = A…I)

GPIO port output type register

偏移地址:0x04

复位值:0x0000 0000

位31:16保留,必须保持复位值。

位15:0 OTY[1:0]:端口x配置位(PORT x configuration bits)(y=0…15)

这些位通过软件写入,用于配置I/O输出类型。

0:输出推挽(复位状态)

1:输出开漏

GPIO端口输出速度寄存器(GPIOx_OSPEEDR)(x=A…I)

GPIO port output speed register

偏移地址:0x08

复位值:

0x0000 00C0(端口B)

0x0000 0000(其它端口)

位2y:2y+1 OSPEEDRy[1:0]:端口x配置位(PORT x configuration bits)(y=0…15)

                  这些位通过软件写入,用于配置I/O输出速度。00:2MHZ(低速)01:25MHZ(中速)10:50MHZ(快速)11:30pF时为100MHZ(高速)(15pf时为80MHZ输出(最大速度))

3.GPIO端口上拉/下拉寄存器(GPIOx_PUPDR)(x=A…I)

GPIO port pull-up/pull-down register

偏移地址:0x0C

复位值:

0x6400 0000(端口A)

0x0000 0100(端口B)

0x0000 0000(其它端口)

位2y:2y+1 PUPDRy[1:0]:端口x配置位(PORT x configuration bits)(y=0…15)

 这些位通过软件写入,用于配置I/O上拉或下拉

00:无上拉或下拉

01:上拉

10:下拉

11:保留

4.GPIO端口输入数据寄存器(GPIOx_IDR)(x=A…I)

GPIO port input data register

偏移地址:0x10

复位值:0x0000 XXXX(其中X表示未定义)

位31:16保留,必须保持复位值

位15:0 IDRy[15:0]:端口输入数据(Port input data)(y=0…15)

这些位为只读形式,只能在字模式下访问。它们包含相应I/O端口的输入值

5.GPIO端口输出数据寄存器(GPIOx_ODR)(x=A…I)

GPIO port output data register

偏移地址:0x14

复位值:0x0000 0000

位31:16保留,必须保持复位值。

位15:0 ODRy[15:0]:端口输出数据(Port output data)(y=0…15)

这些位可通过软件读取和写入

注意:通过写入GPIOx_BSRR寄存器,可以分别对ODR位进行置位和复位(x=A…I)

6.GPIO端口置位/复位寄存器(GPIOx_BSRR)(x=A…I)

GPIO port bit set/reset register

偏移地址:0x18

复位值:0x0000 0000

位31:16 BRy:端口x复位位y(Port x reset bit y)(y=0…15)

                     这些位为只写形式,只能在字、半字或者字节模式下访问。读取这些位可返回值0x00000:不会对相应位的ODRx位执行任何操作1:对相应的ODRx位进行复位

位15:0 BSy:端口x置位位y(Port x set bit y)(y=0…15)

                 这些位为只写形式,只能在字、半字或字节模式下访问。读取这些位可返回值0x00000:不会对相应的ODRx位执行任何操作1:对相应的ODRx位进行置位

注意:如果同时对BSx和BRx置位,则BSx的优先级更高。

7.GPIO端口配置锁定寄存器(GPIOx_LCKR)(x=A…I)

GPIO port configuration lock register

当正确的写序列应用到第16位(LCKK)时,此寄存器将用于锁定端口位的配置。位[15:0]的值用于锁定GPIO的配置。在写序列期间,不能更改LCKR[15:0]的值。将LOCK序列应用到某个端口位后,在执行下一次复位之前,将无法对端口位的值进行更改。

注意:可使用特定的写序列对GPIOx_LCKR寄存器执行写操作。在此写序列期间只允许使用字访问(32位长)

每个锁定位冻结一个特定的配置寄存器(控制寄存器和复用功能寄存器)

偏移地址:0x1C

复位值:0x0000 0000

访问:仅32位字,读/写寄存器

位31:17保留,必须保持 复位值

位16 LCKK[16]:锁定键(Lock Key)

可随时读取此位。可使用锁定键写序列对其进行修改。

0:端口配置锁定键未激活。

1:端口锁定键已激活。直到MCU复位时,才锁定GPIOx_LCKR寄存器。

锁定键写序列:

WR LCKR[16] = ‘1’ + LCKR[15:0]

WR LCKR[16] = ‘0’ + LCKR[15:0]

WR LCKR[16] = ‘1’ + LCKR[15:0]

RD LCKR

RD LCKR[16]= ‘1’

注意:在锁定键写序列期间,不能更改LCK[15:0]的值。

锁定序列中的任何错误都将中止锁定操作

在任一端口位上的第一个锁定序列之后,对LCKK位的任何读访问都将返回‘1’,直到下一次CPU复位为止。

位15:0 LCKy:端口x锁定位y(port x lock bit y )(y = 0…15)

这些位都是读/写位,但只能在LCKK位等于‘0’时执行写操作

0:端口配置未锁定

1:端口配置已锁定

8.GPIO复用功能低位寄存器(GPIOx_AFRL)(x=A…I)

GPIO alterate function low register

偏移地址:0x20

复位值:0x0000 0000

位31:0 AFRLy:端口x位y的复用功能选择(Alternate function selection for port x bit y)(y=0…7)

这些位通过软件写入,用于配置复用功能I/O。

AFRLy选择:

0000:AF0 0001:AF1 0010:AF2 0011:AF3

0100:AF4 0101:AF5 0110:AF6 0111:AF7

1000:AF8 1001:AF9 1010:AF10 1011:AF11

1100:AF12 1101:AF13 1110:AF14 1111:AF15

9.GPIO复用功能高位寄存器(GPIOx_AFRH)(x=A…I)

GPIO alternate function high register

偏移地址:0x24

复位值:0x0000 0000

位31:0 AFRHy:端口x位y的复用功能选择(Alternate function selection for port x bit y)(y=0…7)

这些位通过软件写入,用于配置复用功能I/O。

AFRLy选择:

0000:AF0 0001:AF1 0010:AF2 0011:AF3

0100:AF4 0101:AF5 0110:AF6 0111:AF7

1000:AF8 1001:AF9 1010:AF10 1011:AF11

1100:AF12 1101:AF13 1110:AF14 1111:AF15

总结

以上配置GPIO和寄存器,需要查看寄存器手册,查找自己需要的寄存器,希望我的博客对您的学习有帮助。
谢谢大佬们的指正。

用HALL 库配置GPIO以及相关寄存器相关推荐

  1. HAL库配置GPIO

    HAL库配置GPIO HAL库与标准库不同的特点: 使用`CubeMX`配置GPIO底层参数: 总结HAL库中GPIO的相关功能: GPIO的寄存器: 总结 HAL库与标准库不同的特点: 标准库中初始 ...

  2. 【STM32】 相关寄存器总结

    前言 一.GPIO 端口模式寄存器 (GPIOx_MODER) 二.GPIO 端口输出类型寄存器 (GPIOx_OTYPER) 三.GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) 四.G ...

  3. STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置

    摘自:STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置 作者:自信且爱笑' 发布时间: 2021-05-01 12:08:32 网址:https://blog ...

  4. STM32 固件库外设 GPIO 讲解(关于 GPIO 寄存器讲解)

    GPIO 外设讲解 通过博主上一篇博客,相信大家已经初步了解到了对于 STM32 的控制原理,但是 STM32 到外设 / 引脚有这么多,是要一个一个的去记住它的地址?或者每一次使用一个外设都要看一下 ...

  5. 51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

    目录 1. 串口通信原理 2. 51单片机串口通信 2.1 串口简要模式图 2.2 相关寄存器 (1)PCON.SCON.SBUF (2)IE.IPH.IP (3)配置T1定时器 2.3 波特率和系统 ...

  6. hal库开启中断关中断_[STM32]HAL库下GPIO按键中断与去抖问题分析(分析源码解决问题)...

    自上篇文章STM32 非阻塞HAL_UART_ReceiveIT解析与实际应用,具体总结了HAL库下套娃函数中如何看清库函数的脉络,更细致的认识调用的过程,以解决潜在的问题.又又又遇到了新的问题(GP ...

  7. STM32H7时钟树RCC分析--- HAL库配置(二)

    上一讲我们说了H7时钟树的一些基本概念,现在的话我们来用HAL库和CubeMx配置一下 再次说明,本文耗时较久,如果您想搞懂RCC初始化流程,请认真阅读,刚开始可能看不懂,但是仔细阅读之后绝对会有收获 ...

  8. [Nucleo-F411RE] 第2篇--用stm32CubeMx创建工程配置GPIO的流程

    也是很多年没用过stm32,原来还有这么方便的东西,根本不用手动拷贝库,图形化配置直接搞定. 1.下载stm32f4的库 2. file-new project, 选择stm32F411RE,然后双击 ...

  9. STM32F4系列HAL库配置定时器实验——输入捕获

    STM32F4系列HAL库配置定时器实验--输入捕获 输入捕获简单讲解 输入捕获模式可以用来测量脉冲宽度或者测量频率.我们以测量周期和频率为例,用一个简图来说明输入捕获的原理 假定定时器工作在向上计数 ...

最新文章

  1. 漫画:垃圾男人分类图鉴
  2. 【微信小程序】java中类和对象的区别
  3. 如何为你的回归问题选择最合适的机器学习方法?
  4. 前端开发中的一些js小技巧
  5. ACM-数论 —— 一.整除的性质
  6. python多行注释符号_涨知识Python 为什么用 # 号作注释符?
  7. python3.5.2安装pygame_#Python3.6.2(32位) pip安装 和 pygame 环境配置
  8. python 图像的拉普拉斯变换中的数值问题_数字图像处理(第十章)
  9. 我的2008,专注而行
  10. Paste for mac(剪切板管理工具)
  11. 关于linux目录~ / .
  12. linux_安装_SecureCRT下载安装登陆ubuntu配色和文件传输
  13. Xcode图片素材Slicing处理(包括缩放和延伸)
  14. 抽象的数码艺术-分形艺术
  15. python3网络爬虫(堆糖网)
  16. C语言入门——常见数据类型取值范围
  17. 三位数求解:已知xyz+yzz=n,其中n是一个正整数,x、y、z都是数字(0-9),编写一个程序求出x、y、z分别代表什么数字。若无解,则输出“No Answer” 注意:xyz和yzz表示一个三
  18. 网上打印怎么那么便宜,网上打印平台哪家比较便宜
  19. 史上最全机器学习资源整理
  20. 《设计模式之禅》观后感

热门文章

  1. 驱动框架入门之LED-linux驱动开发第4部分-朱有鹏-专题视频课程
  2. 加入收藏 设为首页 代码
  3. neo4j,MongoDB
  4. 三星Q90 全景声回音壁 参数发布
  5. 覆盖20个主流Niche高DA可投稿的谷歌博客外链分享
  6. python逆序排序_python排序倒序
  7. Linux服务器域名配置
  8. FFA-Net: Feature Fusion Attention Network for Single Image Dehazing
  9. 世界上的第一台计算机什么样,世界上第一台计算机是什么样的
  10. c语言孩子兄弟法存储一棵树,树的孩子兄弟表示法