HAL_Init()函数阅读记录

这篇博客详细记录了HAL_Init()函数的代码分析过程,包括条件编译、预取缓冲区设置、中断优先级分组配置以及SYSTICK初始化等内容。作者探讨了预取缓冲区的作用,中断优先级的设定,以及系统时钟和硬件初始化的细节,旨在帮助读者深入理解STM32的HAL库工作原理。

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

HAL_Init()函数阅读记录

1)代码展示:

HAL_StatusTypeDef HAL_Init(void)
{
   
   
  /* Configure Flash prefetch */
#if (PREFETCH_ENABLE != 0)
#if defined(STM32F101x6) || defined(STM32F101xB) || defined(STM32F101xE) || defined(STM32F101xG) || \
    defined(STM32F102x6) || defined(STM32F102xB) || \
    defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) || \
    defined(STM32F105xC) || defined(STM32F107xC)

  /* Prefetch buffer is not available on value line devices */
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif
#endif /* PREFETCH_ENABLE */

  /* Set Interrupt Group Priority */
  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

  /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
  HAL_InitTick(TICK_INT_PRIORITY);

  /* Init the low level hardware */
  HAL_MspInit();

  /* Return function status */
  return HAL_OK;
}

2)分析过程

首先是两层条件编译,宏PREFETCH_ENABLEstm32f1xx_hal_conf.h配置头文件中定义的,定义如下:

#define  PREFETCH_ENABLE              1U

说明条件为真,然后会判断下一层的条件编译语句。

defined(STM32F101x6)乍一看好像是一个带参宏,但是 go to definition后却发现,没有定义,如下图所示:

那到底怎么回事呢?

keil5IDE中,有这么一项,见下图:

第二个条件编译到底是什么含义呢?

就是判断你所使用的芯片类型,如果你是手动添加hal库到工程项目中,那么肯定需要将你所使用的芯片对应的宏放到上面的框框中。

使用CubeMX工具生成的代码,选择好所使用的芯片后,生成的工程中自动就有了,很是方便。

在正常情况下,条件编译为真。就会执行宏__HAL_FLASH_PREFETCH_BUFFER_ENABLE();

#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE()    (FLASH->ACR |= FLASH_ACR_PRFTBE)
#define FLASH_ACR_PRFTBE_Pos                (4U) 
#define FLASH_ACR_PRFTBE_Msk                (0x1UL << FLASH_ACR_PRFTBE_Pos)     /*!< 0x00000010 */
#define FLASH_ACR_PRFTBE                    FLASH_ACR_PRFTBE_Msk               /*!< Prefetch Buffer Enable */

FLASH_ACR_PRFTBE定义在stm32f103xe.h中。

就是操作flash中的ACR寄存器的bit4为1.

对应的含义是什么呢?对应的含义是使能预取缓冲区,但是复位后,默认是开启的,这里不知道为什么再次打开了。这个预取缓冲区根据我看的资料,应该类似于8086中的指令队列。能加快指令的执行。

那么为什么FLASH->ACR就操作了对应的寄存器呢,这是我一

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值