HAL_Init()函数阅读记录

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就操作了对应的寄存器呢,这是我一开始觉得最巧妙的地方。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
HAL_GPIO_Init 函数是一个在 STM32 系列单片机的 HAL 库中定义的函数,用于初始化 GPIO 口的配置。 其函数原型如下: ```c HAL_GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_Init) ``` 其中,GPIO_TypeDef* GPIOx 表示要初始化的 GPIO 口所在的 GPIOx 端口,例如 GPIOA、GPIOB 等,GPIO_InitTypeDef* GPIO_Init 表示 GPIO 口的配置信息,包括 GPIO 口的模式、输出类型、上拉下拉等参数。 在使用 HAL_GPIO_Init 函数初始化 GPIO 口时,需要先创建一个 GPIO_InitTypeDef 的结构体,然后根据需要设置 GPIO 口的各个参数,最后将结构体作为参数传入 HAL_GPIO_Init 函数中,即可完成 GPIO 口的初始化配置。 以下是 GPIO_InitTypeDef 结构体的定义: ```c 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 GPIOEx_Alternate_function_selection */ } GPIO_InitTypeDef; ``` 其中,Pin 表示要配置的 GPIO 口的引脚编号,Mode 表示 GPIO 口的工作模式,Pull 表示 GPIO 口的上拉/下拉模式,Speed 表示 GPIO 口的速度,Alternate 表示 GPIO 口的复用功能。 总之,HAL_GPIO_Init 函数是 STM32 系列单片机 HAL 库中一个非常重要的函数,它能够帮助我们实现 GPIO 口的初始化和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值