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_ENABLE
在stm32f1xx_hal_conf.h
配置头文件中定义的,定义如下:
#define PREFETCH_ENABLE 1U
说明条件为真,然后会判断下一层的条件编译语句。
defined(STM32F101x6)
乍一看好像是一个带参宏,但是 go to definition
后却发现,没有定义,如下图所示:
那到底怎么回事呢?
在
keil5
的IDE
中,有这么一项,见下图:第二个条件编译到底是什么含义呢?
就是判断你所使用的芯片类型,如果你是手动添加
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
就操作了对应的寄存器呢,这是我一开始觉得最巧妙的地方。