【STM32 CubeMX】HAL库的本质读写寄存器

文章目录

  • 前言
  • 一、HAL库的本质
    • 1.1 HAL库的本质是操作寄存器
    • 1.2 自己实现HAL_GPIO_WritePin
      • 寄存器
      • 通过寄存器的操作点灯
      • 代码概况
      • Port bit set/reset register寄存器
  • 总结


前言

在嵌入式系统开发中,HAL(Hardware Abstraction Layer)库是一个重要的概念,它提供了一个抽象层,使开发者可以更容易地编写可移植的代码,而不必担心底层硬件的细节。STM32CubeMX是一款由STMicroelectronics提供的工具,用于生成STM32微控制器的初始化代码,其中包括了HAL库的使用。

HAL库的本质与HAL库源码分析
HAL库的本质是一个由供应商提供的软件库,旨在提供一系列抽象接口,用于访问底层硬件资源,如GPIO、USART、I2C等。这些接口隐藏了底层硬件的细节,使得开发者能够以统一的方式进行开发,而不必担心不同型号或者不同系列的微控制器的差异。

HAL库的源码分析可以揭示其内部的工作原理和实现细节。通过分析源码,我们可以了解到每个函数的具体功能、调用关系以及与底层硬件交互的细节。HAL库通常包括了对不同硬件模块的驱动程序,这些驱动程序是与特定型号的微控制器兼容的。


一、HAL库的本质

1.1 HAL库的本质是操作寄存器

其实点灯就是操作下面的output data register
在这里插入图片描述

比如我们之前点灯写的HAL_GPIO_WritePin()他的源码如下:

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{/* Check the parameters */assert_param(IS_GPIO_PIN(GPIO_Pin));assert_param(IS_GPIO_PIN_ACTION(PinState));if (PinState != GPIO_PIN_RESET){GPIOx->BSRR = GPIO_Pin;}else{GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;}
}

他去设置某个寄存器等于某个值,这叫是HAL库的本质

1.2 自己实现HAL_GPIO_WritePin

寄存器

CPU可以发出地址,然后访问比如Flash、RAM、GPIOC
我们可以通过访问某一个地址区间去访问Flash
访问其他地址访问GPIOC等等等等

我们可以访问ram,写入val,读出仍是val
我们可以访问flash,使用读出指令,不能直接写

在GPIOC里面有很多的寄存器,但我们不能像操作ram和flash一样,这些寄存器的功能各有不同
比如说以我这个F103ZE为例子:
在这里插入图片描述
比如Port configuration配置寄存器,一个低位,一个高位
比如输入寄存器:Port input data,通过读他,可以得到引脚的状态/数据
比如输出寄存器:Port output data,我们可以通过写这个寄存器,让这个引脚输出高低电平
还有一些其他的

通过寄存器的操作点灯

我们可以在芯片手册中找到GPIOC的基地址,在看GPIOC的输出寄存器偏移地址可以得出,要访问输出寄存器就要访问0x400110C这个地址的寄存器

在这里插入图片描述
比如说,举个例子:我们可以通过一个C语言的指针指向这个要操作的寄存器
然后把里面的值给改变了是不是就操作了寄存器的值
他的每一个寄存器的大小都是2bytes

首先我们使用指针指向寄存器的位子

unsigned int *p;
p	= (unsigned int*)0x40010C0C;

接下来我们需要操作第十三个寄存器,即可点亮我们的灯
比如我们可以这样设置他为1:

unsigned int val = *p;
val = val | (1<<5);
*p = val;

我们可以这样设置他为0:

val = *p;
val = val & ~(1<<5);
*p = val;

这样我们就通过寄存器输出高低电平了

要注意的是,比如你要操作GPIOC里面的13,你就要移13,像下面这样,其他的也是一样
要操作哪个引脚就偏移他的引脚名称,我这里的灯是PB5,所以就把他的地址里面的值偏移5即可
在这里插入图片描述

代码概况

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 */unsigned int *p;p	= (unsigned int*)0x40010C0C;/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){unsigned int val = *p;val = val | (1<<5);*p = val;HAL_Delay(500);val = *p;val = val & ~(1<<5);*p = val;HAL_Delay(500);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */

Port bit set/reset register寄存器

像我们上面,我们需要把寄存器的内容拿出来,然后通过控制某一位的0/1来操作高低电平,这样稍微有点麻烦,那么我们可以使用下面这个寄存器Port bit set/reset register,他只需要写入1到某一位就可以输出高电平/低电平
在这里插入图片描述
他是一个32位的寄存器

比如BRy
在这里插入图片描述
他写入1就把指定的GPIO reset
0就是没有任何作用

比如BSy
在这里插入图片描述
他写入1就是指定GPIO set
0就是没有任何作用

那么我们就可以把代码变成这样:

unsigned int *p;p	= (unsigned int*)(0x40010C00 + 0x10);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){unsigned int val = *p;*p = (1 << 21);HAL_Delay(500);*p = (1 << 5);HAL_Delay(500);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */

通过写21位,把他变成reset状态
通过写5位,把他变成set状态,这样就实现了闪烁灯


总结

HAL库作为嵌入式系统开发中的重要工具,提供了一种方便、快捷的方式来访问STM32微控制器的硬件资源。通过使用HAL库,开发者可以更加专注于应用程序的开发,而不必花费大量时间去编写底层的驱动程序。通过深入分析HAL库的源码,我们可以更好地理解其内部实现细节,从而更好地利用这一工具来开发高效、可靠的嵌入式应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/680884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机服务器中了mkp勒索病毒如何解密,mkp勒索病毒解密流程

随着网络技术的不断发展与应用&#xff0c;越来越多的企业走向数字化办公模式&#xff0c;计算机极大地方便了企业的正常生产运营&#xff0c;但网络威胁的手段也不断增加。近期&#xff0c;云天数据恢复接到很多企业的求助&#xff0c;企业的计算机服务器遭到了mkp勒索病毒攻击…

Linux_进程间通信

管道 System V 共享内存 System V IPC 接口介绍 由于进程地址空间的存在&#xff0c;所以进程间有具有独立性&#xff0c;一个进程看不到另一个进程的数据。那么如果我们想让进程间通信&#xff0c;就必须先让它们先看到同一份资源。常见的进程间通信的方法有管道&#xff0c;…

前端学习的笔记第二篇

vscode如何快速生成代码 ! Tab 效果&#xff1a; 解析&#xff1a; <!DOCTYPE html>: 指定当前html版本5。 <html lang"en">: lang > language&#xff0c;en > english。指定当前页面内容是英文的。 <meta charset"UTF-8">:…

猫头虎分享:Win11系统家庭版组策略编辑器怎么打开? Windows11家庭版没有gpedit.msc如何解决?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

滑动小短剧影视微信小程序源码/带支付收益等模式

仿抖音滑动小短剧影视微信小程序源码&#xff0c;带支付收益等模式、支持无限滑动&#xff1b;高性能滑动、预加载、视频预览&#xff0c;支持剧情介绍&#xff0c;集合壁纸另外仿抖音滑动效果&#xff1b;支持会员模式&#xff0c;支持用户单独购买等等多功能。 丰富的后台设…

深度学习基础之《深度学习介绍》

一、深度学习与机器学习的区别 1、特征提取方面 机器学习&#xff1a;人工特征提取 分类算法 深度学习&#xff1a;没有人工特征提取&#xff0c;直接将特征值传进去 &#xff08;1&#xff09;机器学习的特征工程步骤是要靠手工完成的&#xff0c;而且需要大量领域专业知识…

Golang中的fmt包:格式化输入输出的利器

Golang中的fmt包&#xff1a;格式化输入输出的利器 在软件开发的世界里&#xff0c;fmt包就像是一位忠实的伙伴&#xff0c;始终陪伴着开发人员。它简化了格式化输入输出的过程&#xff0c;让打印和扫描数据变得轻松自如。无论是向控制台输出简单的消息&#xff0c;还是处理复杂…

Rust入门:如何在windows + vscode中关闭程序codelldb.exe

在windows中用vscode单步调试rust程序的时候&#xff0c;发现无论是按下stop键&#xff0c;还是运行完程序&#xff0c;调试器codelldb.exe一直霸占着主程序不退出&#xff0c;如果此时对代码进行修改&#xff0c;后续就没法再编译调试了。 目前我也不知道要怎么处理这个事&am…

数据结构——6.3 图的遍历

6.3 图的遍历 一、概念 图的广度优先遍历 树的广度优先遍历&#xff08;层序遍历&#xff09;&#xff1a;不存在“回路”&#xff0c;搜索相邻的结点时&#xff0c;不可能搜到已经访问过的结点&#xff1a; 若树非空&#xff0c;则根节点入队 若队列非空&#xff0c;队头元素…

C语言——oj刷题——调整数组使奇数全部都位于偶数前面

题目&#xff1a; 输入一个整数数组&#xff0c;实现一个函数&#xff0c;来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。 一、实现方法&#xff1a; 当我们需要对一个整数数组进行调整&#xff0c;使得奇数位于数…

python系统学习Day1

section1 python introduction 文中tips只做拓展&#xff0c;可跳过。 PartOne introduction 首先要对于python这门语言有一个宏观的认识&#xff0c;包括特点和应用场景。 特点分析&#xff1a; 优势 提供了完善的基础代码库&#xff0c;许多功能不必从零编写简单优雅 劣势 运…

C语言第二十三弹---指针(七)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 指针 1、sizeof和strlen的对比 1.1、sizeof 1.2、strlen 1.3、sizeof 和 strlen的对比 2、数组和指针笔试题解析 2.1、⼀维数组 2.2、二维数组 总结 1、si…

mysql经典4张表问题

1.数据库表结构关联图 2.问题&#xff1a; 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数3.查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩4、查询名字中含有"风"字的学生信息5、查询课程名称为"数学"&…

单片机学习笔记---AT24C02数据存储

目录 AT24C02数据存储 准备工作 代码讲解 I2C.c 模拟起始位置的时序 模拟发送一个字节的时序 模拟接收应答的时序 模拟接收一个字节的时序 模拟发送应答的时序 模拟结束位置的时序 I2C.h AT24C02.c 字节写&#xff1a;在WORD ADDRESS&#xff08;字地址&#xff…

「Linux」软件安装

MySQL5.7在CentOS安装 安装 配置yum仓库 更新密钥&#xff1a;rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022安装MySQL yum库&#xff1a;rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm使用yum安装MySQL&#xff1a;yum -y in…

WebSocket原理详解

目录 1.引言 1.1.使用HTTP不断轮询 1.2.长轮询 2.websocket 2.1.概述 2.2.websocket建立过程 2.3.抓包分析 2.4.websocket的消息格式 3.使用场景 4.总结 1.引言 平时我们打开网页&#xff0c;比如购物网站某宝。都是点一下列表商品&#xff0c;跳转一下网页就到了商品…

电动汽车上哪些部位用到了电机?

一、背景 电动汽车中除了主驱动电机之外的其他电机的控制复杂度因电机的种类和功能而异。 一般来说&#xff0c;助力转向电机、空调风扇电机、冷却水泵电机等辅助电机的控制相对较为简单。这些电机通常只需要进行简单的开/关控制或速度调节&#xff0c;以满足车辆的基本需求。…

【实战】一、Jest 前端自动化测试框架基础入门(中) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(二)

文章目录 一、Jest 前端自动化测试框架基础入门5.Jest 中的匹配器toBe 匹配器toEqual匹配器toBeNull匹配器toBeUndefined匹配器和toBeDefined匹配器toBeTruthy匹配器toBeFalsy匹配器数字相关的匹配器字符串相关的匹配器数组相关的匹配器异常情况的匹配器 6.Jest 命令行工具的使…

【Langchain Agent研究】SalesGPT项目介绍(三)

【Langchain Agent研究】SalesGPT项目介绍&#xff08;二&#xff09;-CSDN博客 上节课&#xff0c;我们介绍了salesGPT项目的初步的整体结构&#xff0c;poetry脚手架工具和里面的run.py。在run.py这个运行文件里&#xff0c;引用的最主要的类就是SalesGPT类&#xff0c;今天我…

ARP请求的构造过程

ARP请求的构造过程&#xff1a; ARP请求的构造&#xff1a; 当设备A&#xff08;发起者&#xff09;想要与设备B&#xff08;目标&#xff09;通信&#xff0c;但它只知道设备B的IP地址&#xff08;例如&#xff0c;192.168.1.2&#xff09;&#xff0c;而不知道其MAC地址。设备…