本文简短不看版:这个是头文件的头文件
这个文件是个头文件,它又包含了两个头文件(通过在 Keil 魔法棒工具定义两个宏 STM32F407xx 和 USE_HAL_DRIVER 开关)#include "stm32f407.h" //某一特定F4型号芯片寄存器定义
#include "stm32f4xx_hal.h"//HAL库函数(HAL库编程的API总集合)
![](/i/l/?n=23&i=blog/1536332/202310/1536332-20231023194805350-945841539.png)
因为不同的芯片寄存器映射不同,从而按道理程序也不同,但通过上述的映射,
F4 系列芯片的程序,都可以以 stm32f4xx.h 作为头文件。(无论是什么型号,是F407 还是 F429,是VET还是IGT)
相当于对芯片型号进行了抽象化。
详细介绍:
首先在文件开头,官方简介如下:
/*
* The file is the unique include file that the application programmer
* is using in the C source code, usually in main.c. This file contains:
* - Configuration section that allows to select:
* - The STM32F4xx device used in the target application
* - To use or not the peripheral抯 drivers in application code(i.e.
* code will be based on direct access to peripheral抯 registers
* rather than drivers API), this option is controlled by
* "#define USE_HAL_DRIVER"
*/
翻译为中文 *该文件是程序员在 C 源码中使用的唯一的包含文件(通常在 main.c 当中) *该文件包含了以下内容: *-配置部分,允许选择: *-目标应用程序中使用的 STM32F4XX 型号。 *-通过预编译宏:#define USE_HAL_DRIVER 来确定程序是寄存器编程方式,还是HAL库编程方式。 程序的主要架构: 第一部分:定义了芯片型号的宏STM32F4 、STM32F407xx(这部分推荐在编译器中定义,以防止一直修改这个文件)
#if !defined (STM32F4)
#define STM32F4
#endif /* STM32F4 */
#if !defined (STM32F407xx)
#define STM32F407xx
#endif
第二部分:定义 USE_HAL_DRIVER(这部分也推荐在编译器中定义,以防止一直修改这个文件)
#if !defined (USE_HAL_DRIVER)
/**
* @brief 如果想要寄存器编程,将其注释掉
*/
#define USE_HAL_DRIVER
#endif /* USE_HAL_DRIVER */
第三部分:由上面第一部分的宏定义,包含具体芯片的头文件
#if defined(STM32F405xx)
#include "stm32f405xx.h"
#elif defined(STM32F407xx)
#include "stm32f407xx.h" //假设第一部分定义了STM32F407xx,那么该文件包含 stm32f407xx.h 这个头文件
#elif ....
#include ...
#endif
第四部分:由上面第二部分的宏定义(USE_HAL_DRIVER),包含具体芯片的HAL库头文件
#if defined (USE_HAL_DRIVER)
#include "stm32f4xx_hal.h"
#endif /* USE_HAL_DRIVER */
第五部分:定义各种状态(用作各种函数的返回参数)
//Flag 和 中断标志: RESET 和 SET
typedef enum
{
RESET = 0U,
SET = !RESET
} FlagStatus, ITStatus;
//使能标志: DISABLE 和 ENABLE
typedef enum
{
DISABLE = 0U,
ENABLE = !DISABLE
} FunctionalState;
#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))
//错误标志: SUCCESS 和 ERROR
typedef enum
{
SUCCESS = 0U,
ERROR = !SUCCESS
} ErrorStatus;
第六部分:定义寄存器编程的相关读写操作
#define SET_BIT(REG, BIT) ((REG) |= (BIT)) //将寄存器REG与BIT掩码或,从而置1
#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT))//将寄存器REG和BIT掩码与非,从而置0
....
#define CLEAR_REG(REG) ((REG) = (0x0)) //清零
标签:文件,USE,HAL,DRIVER,BIT,解析,REG,stm32f4xx,define From: https://www.cnblogs.com/FBsharl/p/17783334.html