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

2023-05-16

文章目录

    • 一 .初始化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)

                     这些位为只写形式,只能在字、半字或者字节模式下访问。读取这些位可返回值0x0000

                    0:不会对相应位的ODRx位执行任何操作

                    1:对相应的ODRx位进行复位

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

                 这些位为只写形式,只能在字、半字或字节模式下访问。读取这些位可返回值0x0000

                0:不会对相应的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和寄存器,需要查看寄存器手册,查找自己需要的寄存器,希望我的博客对您的学习有帮助。
谢谢大佬们的指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用HALL 库配置GPIO以及相关寄存器 的相关文章

  • 编程实现字符串连接函数strcat()

    按如下函数原型编程实现字符串连接函数strcat 的功能 void MyStrcat char dstStr char srcStr 输入提示信息 xff1a Input a string Input another string 输入字符
  • UDP通讯

    目录 利用DatagramSocket发送和接收UDP数据报 DatagramPacket构造方法说明 利用DatagramPacket和Datagramsocket简单实现服务器和客户端的通信 UDP协议通讯的用户状态跟踪 利用Datag
  • ubuntu 下C/C++文件编写

    1 Ubuntu下c cpp文件 1 1 cmake方式编译 cmake通常建立CmakeLists txt xff0c 通过cmake命令生成makefile文件编译工程 文件内容 xff1a span class token numbe
  • C语言基础入门:链表详解篇

    链表概述 链表是一种常见的重要的数据结构 它是动态地进行存储分配的一种结构 它可以根据需要开辟内存单元 链表有一个 头指针 变量 xff0c 以head表示 xff0c 它存放一个地址 该地址指向一个元素 链表中每一个元素称为 结点 xff
  • Linux c udp广播

    文章目录 1 对比2 代码2 1 服务端2 2 客户端 1 对比 服务端 xff1a 需要利用这个函数开发套接字的发广播权限 xff0c 并且需要客户端地址绑定为广播地址 span class token function setsocke
  • React—— HelloWorld

    React 学习笔记 Hello WorldJSX JavaScript XML 语法规则JavaScript 语法函数组件 类组件 amp 属性 props组合组件 生命周期函数 xff08 不全 xff09 amp 状态 state事件
  • Linux下makefile 编译项目

    文章目录 1 规划makefile编写2 makefile文件2 1 根目录下common mk2 2 config mk2 3 根目录makefile 2 4 其他目录下 1 规划makefile编写 a 根目录下放三个文件 xff1a
  • RPLIDAR激光雷达测试

    本文主要介绍PRLIDAR A2M8 R2激光雷达的的测试过程 关于该激光雷达的具体参数和描述 xff0c 可以直接去官网查询 本文的测试环境为Ubantu16 04 ROS xff08 kinetic xff09 关于Ubantu16 0
  • 【ROS机器人入门】1.1 ROS概念及环境配置

    文章目录 ROS设计目标系统要求配置步骤1 设置安装源2 设置ROS软件Key3 更新软件包4 安装完整版ROS Noetic软件5 配置ROS环境6 安装构建依赖7 1 安装rosdep 7 1与7 2任选其一 解决方法 7 2 安装ro
  • 纯C语言进行Get和Post请求(亲测)

    废话不多说 xff0c 直接上代码 span class token macro property span class token directive hash span span class token directive keywor
  • C++ 实现Get和Post请求(亲测)

    废话不多说 xff0c 直接上代码 span class token comment include lt stdlib h gt span span class token macro property span class token
  • php 接入海康平台

    php获取海康平台的监控流地址 先获取所有监控点 xff08 artemis api resource v1 cameras xff09 在根据监控点的cameraIndexCode请求 artemis api video v1 camer
  • [开源]一个面向数仓开发人员的低代码工具,零代码开发API服务

    一飞开源 xff0c 介绍创意 新奇 有趣 实用的免费开源应用 系统 软件 硬件及技术 xff0c 一个探索 发现 分享 使用与互动交流的开源技术社区平台 致力于打造活力开源社区 xff0c 共建开源新生态 xff01 一 开源项目简介 介
  • (14)Ubuntu 安装 velodyne 激光雷达的Ros驱动包

    1 安装ROS驱动 xff1a sudo apt get install ros kinetic velodyne 2 创建ROS工程 xff1a mkdir p catkin velodyne src cd catkin velodyne
  • (2)ROS终端出现没有那个文件或目录,解决每次都要source问题

    1 在创建完程序包后需要 source catkin ws devel setup bash 即解决每次都要source方法 在终端输入 xff1a gedit bashrc 在文件末尾添加一下这一行 xff0c 保存即可 xff1a so
  • (3)GNSS在ROS中数据获取与解析

    1 在ubuntu16 04中安装串口工具minicom 输入sudo minicom s进行串口配置 xff1a 弹出如下设置界面 xff1a 使用方向键 选择 Serial port setup xff0c 按Enter键 xff0c
  • 一篇文章搞定Github API 调用 (v3)

    收藏 segmentfault 作者 SolomonXie 文章 xff1a 一篇文章搞定Github API 调用 v3 xff09
  • (3)安装ROS报错sh: 0: Illegal option -h解决办法及国内源ROS安装教程

    从ROS官网安装ROS报错 sh 0 Illegal option h 可能是软件源的原因 xff0c 使用国内的软件源可以解决此问题 1 安装软件源 xff0c 建议采用国内软件源 xff0c 下面的为USTC的软件源 sudo sh c
  • (1)robot_pose_ekf扩展卡尔曼滤波功能包的使用方法

    这里写自定义目录标题 robot pose ekf功能包的编译安装如何使用机器人姿势EKF 编译运行robot pose ekf订阅的话题发布的话题机器人姿态ekf如何工作参考文章 robot pose ekf功能包的编译安装 ros wi
  • (15)sudo rosdep init报错的解决方式及rosdep update解决方案

    Ubuntu16 04下安装ROS时 xff0c 执行到sudo rosdep init这一步时会遇到问题 xff0c 如下图所示 xff1a 解决办法 xff1a 步骤一 xff1a 1 查询现有真实IP 输入网址 xff1a IPAdd

随机推荐

  • (16)Ubuntu下PCL库安装和测试程序

    安装PCL库 PCL库Github下载地址 xff1a https github com PointCloudLibrary pcl 安装依赖项 xff1a sudo add apt repository ppa v launchpad j
  • 【Vue】条纹进度条

    一 效果演示及使用 作为组件引入到项目 xff08 引入地址修改为自己实际的存放地址 xff09 xff0c 注册到components import stripeloading from 34 64 components LSUI loa
  • c++中 . 和 -> 的区别是什么

    c 43 43 中 和 gt 主要是用法上的不同 1 A B则A为对象或者结构体 xff1b 2 A gt B则A为指针 xff0c gt 是成员提取 xff0c A gt B是提取A中的成员B xff0c A只能是指向类 结构 联合的指针
  • rosdep update报错解决

    一 报错 reading in sources list data from etc ros rosdep sources list d ERROR error loading sources list 39 The read operat
  • 解决多个Ardupilot运行仿真环境冲突问题

    情况说明 分别安装了4 2和4 3两个版本的ardupilot工作环境 xff0c 出现运行4 3版本sim vehicle py时路径链接到4 2版本工作路径 解决 为防止文件识别错误 xff0c 更改sim vehicle py文件名为
  • yum、apt-get、curl、wget你了解吗?

    在这里整理一些自己想要了解的一些概念 内容来自网络博客 一般来说著名的linux系统基本上分两大类 xff1a RedHat系列 xff1a Redhat Centos Fedora等Debian系列 xff1a Debian Ubuntu
  • 2020电赛备战总结(一)

    你有多渴望 xff0c 就要有多努力 2020 xff0c 注定被载入史册的一个年份 xff0c 希望2020电赛也能让我永远记住 机会来的突然 xff0c 有一点小幸运吧 xff0c 在寒假回家的时候我带上了我的32 xff0c 然后在无
  • StringBuilder的容量capacity变化规则

    StringBuilder的容量capacity变化 xff0c 是每次2倍增长吗 xff1f xff08 jdk1 8 xff09 测试代码 1 StringBuilder sb 61 span class hljs keyword ne
  • Mavros Client md5sum Error

    ERROR Client mavros wants topic State to have datatype md5sum mavros msgs State 4048c9de2a16f4ae8e0538085ebf1b97 but our
  • Chrome安装Proxy SwitchyOmega插件&Ubuntu20.04安装Proxychains

    目录 1 Chrome浏览器1 1 安装Proxy SwitchyOmega插件1 2 安装Proxy SwitchyOmega插件 2 Ubuntu服务器2 1 安装2 2 配置2 3 测试2 4 异常处理 1 Chrome浏览器 1 1
  • ozone-1.1.0(最新版)单节点搭建教程

    目录 1 搭建环境说明2 Java环境配置 xff08 Linux xff09 2 1 jdk下载2 2 源码包解压2 3 配置jdk环境变量2 4 测试 3 Ozone配置 1 搭建环境说明 服务器 xff1a Ubuntu20 4 JA
  • aws: command not found

    安装aws前先要安装pip3 环境 xff1a centos 安装pip3 yum install span class token operator span y python3 span class token operator spa
  • Linux命令总结

    记录一下在工作中遇到的命令 xff0c 碰到一个就总结一个吧 xff01 uname i uname span class token operator span i 查看linux是多少位的 ps aux span class token
  • 【Windows安装pip全过程详解】

    1 Ctrl 43 A全选并复制get pip py文件官方链接地址 链接1 get pip py 2 在python文件中建立get pip py文件 2 1 进入python文件 2 2 新建一个 txt文档 xff0c Ctrl 43
  • 工作总结模板

    最近要准备中期答辩 xff0c 画了一张工作总结的思维导图 xff0c 供大家参考 xff01
  • Pycharm安装包报错【To search for alternate channels that may provide the conda package...】

    1 在Pycharm安装包 xff0c 命令行 conda install xx包名 xff0c 报错提示如下 xff1a 2 解决办法 xff1a 改用 pip install xx包名 安装成功 xff01
  • 【Python】照片批量命名

    1 照片批量命名代码如下 span class token comment 批量修改文件名 xff0c 默认操作为将图片按1 xff0c 2 xff0c 3 xff0c xff0c xff0c 顺序重命名 span span class t
  • Nexus Repository Manager 3 私服搭建 —— windows版

    nexus3 本文安装的是免费版 xff1a Nexus Repository OSS 下载 最新版本下载链接1 最新版本下载链接2 或到 https my sonatype com 可以下载nexus2和3两大版本 参考页面 xff1a
  • stm32f103在使用Free RTOS操作系統是遇到prvTaskExiterror解决办法

    1 检查已建立的线程中是否均有while xff08 1 xff09 2 是否含有break从而使程序跳出线程
  • 用HALL 库配置GPIO以及相关寄存器

    文章目录 一 初始化GPIO 一 定义一个结构体变量GPIO InitStruct xff0c 该变量类型是GPIO InitTypeDef 二 使能时钟 三 配置引脚的初始化电平 xff08 四 xff09 通过结构体变量配置具体的引脚