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

这篇具有很好参考价值的文章主要介绍了【STM32 CubeMX】HAL库的本质读写寄存器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

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

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

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


一、HAL库的本质

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

其实点灯就是操作下面的output data register
【STM32 CubeMX】HAL库的本质读写寄存器,从0带你学会如何像人类一样写STM32程序,stm32,嵌入式硬件,单片机,c语言,mcu,点灯

比如我们之前点灯写的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为例子:
【STM32 CubeMX】HAL库的本质读写寄存器,从0带你学会如何像人类一样写STM32程序,stm32,嵌入式硬件,单片机,c语言,mcu,点灯
比如Port configuration配置寄存器,一个低位,一个高位
比如输入寄存器:Port input data,通过读他,可以得到引脚的状态/数据
比如输出寄存器:Port output data,我们可以通过写这个寄存器,让这个引脚输出高低电平
还有一些其他的

通过寄存器的操作点灯

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

【STM32 CubeMX】HAL库的本质读写寄存器,从0带你学会如何像人类一样写STM32程序,stm32,嵌入式硬件,单片机,c语言,mcu,点灯
比如说,举个例子:我们可以通过一个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即可
【STM32 CubeMX】HAL库的本质读写寄存器,从0带你学会如何像人类一样写STM32程序,stm32,嵌入式硬件,单片机,c语言,mcu,点灯

代码概况

/* 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到某一位就可以输出高电平/低电平
【STM32 CubeMX】HAL库的本质读写寄存器,从0带你学会如何像人类一样写STM32程序,stm32,嵌入式硬件,单片机,c语言,mcu,点灯
他是一个32位的寄存器

比如BRy
【STM32 CubeMX】HAL库的本质读写寄存器,从0带你学会如何像人类一样写STM32程序,stm32,嵌入式硬件,单片机,c语言,mcu,点灯
他写入1就把指定的GPIO reset
0就是没有任何作用

比如BSy
【STM32 CubeMX】HAL库的本质读写寄存器,从0带你学会如何像人类一样写STM32程序,stm32,嵌入式硬件,单片机,c语言,mcu,点灯
他写入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库的源码,我们可以更好地理解其内部实现细节,从而更好地利用这一工具来开发高效、可靠的嵌入式应用程序。文章来源地址https://www.toymoban.com/news/detail-828585.html

到了这里,关于【STM32 CubeMX】HAL库的本质读写寄存器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 i2c读写寄存器地址8位,16位的方法

    一般常用的寄存器地址是8位的,遇到一个寄存器地址为16为的器件。总结一下代码编写。 寄存器地址16位的为SY103,寄存器地址为8位的为LT7911. 测试代码 lt7911该位置寄存器参考手册 sy103该位置寄存器参考手册 仿真测试 可以看到把值写入到相对应的寄存器内,并且读出。

    2024年01月19日
    浏览(60)
  • STM32CubeMX教程10 RTC 实时时钟 - 周期唤醒、闹钟A/B事件和备份寄存器

    开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX软件配置STM32F407开发板 实现RTC周期唤醒、闹钟A/B事件功能 ,具体为在周期唤醒时利用串口输出当前RTC记录时间,当闹钟

    2024年02月03日
    浏览(50)
  • 【07】STM32·HAL库开发-新建寄存器版本MDK工程 |下载STM32Cube固件包 | 新建MDK工程步骤

    获取方式一 :ST官网搜索STM32Cube+回车   这里以F1系列为例,点击【STM32CubeF1】   点击【Get Software】即可进行下载,首次下载需要注册邮箱, 是免费的 。    这里下载最新的1.8.5版本为例进行后期章节编写。 获取方式二 :正点原子开发板A盘资料:A 盘→8,STM32 参考资料

    2024年02月11日
    浏览(60)
  • 寄存器内存读写指令(二) —— 多寄存器读写 LDM / STM

    有的时候,CPU可能会遇到 a++; b++; c++,这个时候为了提升效率,CPU可能会一次将多个寄存器里的变量保存到内存中。这个时候之前介绍的 LDR / STR 指令虽然也能实现,但只能操作一个寄存器的读写。 因此,考虑到这点,下面介绍多个寄存器的读写指令 将 多个寄存器 的数据写

    2024年02月07日
    浏览(58)
  • 【13】STM32·HAL库-正点原子SYSTEM文件夹 | SysTick工作原理、寄存器介绍 | printf函数使用、重定向

      下面函数都是以sys_开头,定义在sys.c中。正点原子函数现阶段命名规则如果是在led.c中,则以led_开头。在F7/H7系列中会存在Cache配置函数,I-Cache中存储指令,D-Cache中存储数据。   SysTick,即系统滴答定时器,包含在M3/4/7内核里面,核心是一个24位的递减计数器( 最大计

    2024年02月15日
    浏览(42)
  • stm32的BRR寄存器和BSRR寄存器

    1、BRR---   bit   RESET(置0)  register   //高16位无,低16位置1为0,不能写1 2 、BSRR---   bit   SET(设置1或0)       register   //低16位设置1为0 BSRR:用于低16位的作用是让指定的IO口置1;而高16位的作用是让指定的IO口置0。  

    2024年02月11日
    浏览(43)
  • STM32之寄存器

    在学习STM32之前有必要了解一下ARM架构,以下相关ARM架构的知识来自百度百科​:​ ARM架构,曾称进阶精简指令集机器(Advanced RISC Machine)更早称作Acorn RISC Machine,是一个32位精简指令集(RISC)架构。还有基于ARM设计的派生产品,重要产品包括Marvell的XScale架构和德州仪器的

    2024年02月22日
    浏览(46)
  • STM32 入门 —— 寄存器与 GPIO

    STM32 总线构图: 什么是寄存器 根据百度百科介绍,寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。简单来说,寄存器就是存放东西的东西,存放的东西是指令、数据或地址 存放数据的寄存器最容易理解,不同

    2024年02月04日
    浏览(46)
  • STM32寄存器点亮LED灯

     这个灯是 PB5引脚 看原理图可以看出 让GPIOB5输出低电平 就能点亮 那么我们得让 打开控制GPIOB5的时钟 让GPIOB5 输出模式 让GPIOB5低电平 时钟就相当于一个阀门开关,或者理解成水龙头,你打开了 才有水出来,也就是你打开才能工作。 看中文参考手册 系统架构 找到你的GPIO

    2024年02月07日
    浏览(48)
  • STM32 寄存器配置笔记——GPIO配置输出

           本文主要介绍GPIO 作为输出时的寄存器配置。包括时钟配置,输出模式配置。以STM32F10xxx系列为例,配置PA8、PD2端口作为输出,输出高/低电平。         1)GPIO外设时钟          通过查找STM32F10xxx中文参考手册得知,GPIO PORT口的时钟配置在RCC_APB2ENR寄存器的第2~6位,

    2024年01月24日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包