目录
__IO
__weak
具体内容:
语法内容
1. __IO 表示 volatile, 标准 C 语言中的一个修饰字,表示这个变量是非易失性的,编译器不要将其优化 掉。
2. __weak 在回调函数的时候经常用到。这样的好处是,系统默认定义了一个空的回调函数,保证编译器不会报错。同时,如果用户自己要定义用户回调函数,那么只需要重新定义即可,不需要考虑函数重复定义的问题,使用非常方便,在 HAL 库中__weak 关键字被广泛使用。
3.
#if !defined(UNUSED)
#define UNUSED(X) (void)X /* To avoid gcc/g++ warnings */
#endif /* UNUSED */
如它所代表的英文一样,unused,即无用的意思。即UNUSED()函数在程序中没有实质性的作用,用来避免编译器警告。
HAL库的惯例、轶事
1. HAL库中文件或函数 的 命名来历(由来):
1) stm32f4××_hal_conf.h,其中conf是configuratin的简写,故是stm32f4×× 的HAL configuration file 的头文件,HAL配置头文件。
里头包含了很多模块定义的头文件
2)看到很多以Msp为前缀的函数命名,如:void HAL_UART_MspInit(UART_HandleTypeDef *huart)
其中:Msp是指:MCU Specific Package MCU的外围模块的特别包,比如串口是处理器的一个特别接口,串口的初始化就属于 MSP:和MCU相关的一个特别模块的初始化。
stm32中的hal库 中MSP的含义_hal-msp-CSDN博客
stm32f4××_hal_msp.c,按照上面的说法: MCU Specific Package ,此文件就是MCU外围功能模块的初始化。
比如串口,串口管脚的配置,时钟的配置就放在 stm32f4××_hal_msp.c 文件中的 void HAL_UART_MspInit(UART_HandleTypeDef* huart)函数完成,而串口模块对应的stm32f4xx_hal_uart.c文件中的__weak void HAL_UART_MspInit(UART_HandleTypeDef *huart)为弱函数,具体实现在stm32f4××_hal_msp.c中完成。
3)和功能模块有关的软件结构组织:
a. ×××_HandleTypeDef(某模块句柄类型定义),比如UART_HandleTypeDef、DMA_HandleTypeDef,采用结构体定义的形式,里头封装了
i. 该模块相关的寄存器类型结构体实例化变量:×××_TypeDef(比如USART_TypeDef)
ii. 该模块初始化设置类型结构体实例化变量:×××_InitTypeDef,比如UART_InitTypeDef
iii. 该模块DMA句柄类型结构体实例化变量:DMA_HandleTypeDef
iv. 该模块的状态变量的枚举类型的变量:HAL_×××_StateTypeDef,比如HAL_UART_StateTypeDef;
v. 该模块的相关回调函数指针;
b. ×××_TypeDef (某模块相关的寄存器类型封装在一起的结构体的定义),比如USART_TypeDef;
c. ×××_InitTypeDef(某模块相关的初始化设置的参数封装在一起的结构体的定义),比如UART_InitTypeDef;