文件stm32f4xx.h 解析

发布时间 2023-10-23 20:00:04作者: FBshark

本文简短不看版:这个是头文件的头文件

这个文件是个头文件,它又包含了两个头文件(通过在 Keil 魔法棒工具定义两个宏 STM32F407xx 和 USE_HAL_DRIVER 开关)
#include "stm32f407.h" //某一特定F4型号芯片寄存器定义
#include "stm32f4xx_hal.h"//HAL库函数(HAL库编程的API总集合)
 
然后在编程的时候,就只要包含stm32f4xx.h就可以了。
(这样一来,一样的程序不需要修改文件本身,只需要修改编译器定义的宏,就可以在所有 F4 系列芯片正确运行

因为不同的芯片寄存器映射不同,从而按道理程序也不同,但通过上述的映射,

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)) //清零