HAL库中各个文件的介绍:
startup_stm32l475xx.s
启动文件的主要作用是进行RAM中堆、栈内存的分配和初始化,中断向量表及中断函数的定义等,进行完这一系列工作后执行系统复位从而跳转至用户main函数开始执行。
stm32l4xx_hal_ppp.c/.h
基本外设的操作函数文件,ppp 代表外设名称。其中stm32l4xx_hal_cortex.c/.h 比较特殊,它是一些 Cortex 内核通用函数声明和定义,例如中断优先级 NVIC 配置,系统软复位以及Systick 配置等。
stm32l4xx_hal_ppp_ex.c/.h
扩展外设特性的操作函数文件。
stm32l4xx_hal.c
HAL库的通用函数文件,如HAL_Init,HAL_DeInit,HAL_Delay等。
stm32l4xx_hal.h
HAL库的通用函数文件的头文件。
stm32l4xx_hal_conf.h
HAL库的配置文件,使用宏定义选择某种外设是否使能,以及一些时钟参数的配置。
stm32l4xx_hal_def.h
HAL库中的通用数据类型定义和宏定义。
stm32l4xx_it.c/stm32l4xx_it.h
中断服务函数的定义和声明,放置的基本都是一些空函数,除SysTick_Handler函数外。
stm32l4xx.h
stm32l4xx.h文件会根据 C/C++选项卡里面定义的全局宏定义标识符选择程序中包含的头文件。
stm32l475xx.h
主要是该型号芯片寄存器定义声明以及封装的内存操作。
system_stm32l4xx.c/system_stm32l4xx.h
源文件中包含SystemInit函数和SystemCoreClockUpdate函数的定义,SystemInit 函数的作用是进行时钟系统的一些初始化操作以及中断向量表偏移地址设置,但它并没有设置具体的时钟值。SystemCoreClockUpdate 函数是在系统时钟配置进行修改后,调用这个函数来 更新全局变量 SystemCoreClock 的值,开放这个变量可以方便用户使用系统时钟进行一些计算时使用。
stm32l4xx_hal_msp.c
MSP,全称为MCU support package,即芯片支持包,表明该文件和芯片型号是强相关的。函数名字中带有 MspInit 的函数,它们的作用是进行MCU级别硬件初始化设置,并且它们通常会被上一层的初始化函数所调用,这样做的目的是为了把 MCU 相关的硬件初始化剥夺出来,方便用户代码在不同型号的 MCU 上移植。 stm32l4xx_hal_msp.c 文件定义了两个函数 HAL_MspInit 和 HAL_MspDeInit。这两个函数分别被文件 stm32l4xx_hal.c中的HAL_Init和 HAL_DeInit所调用。HAL_MspInit函数的主要作用是进行 MCU 相关的硬件初始化操作。例如我们要初始化某些硬件,我们可以硬件相关的初始化配置写在 HAL_MspDeinit 函数中。这样的话,在系统启动后调用了 HAL_Init 之后,会自动调用硬件初始化函数。
如main函数中调用MX_USART3_UART_Init()函数,
MX_USART3_UART_Init()函数调用HAL_UART_Init()函数进行串口初始化,
HAL_UART_Init()函数内部会判断若串口未初始化则调用HAL_UART_MspInit()函数进行初始化。
串口的初始化过程为MX_USART3_UART_Init()---->HAL_UART_Init()---->HAL_UART_MspInit()。为什么串口相关初始化不在 HAL_UART_Init 函数内部一次初始化而还要调用函数 HAL_UART_MspInit()呢?这实际就是 HAL 库的一个优点,它通过开放一个回调函数 HAL_UART_MspInit(),让用户自己去编写与串口相关的 MCU 级别的硬件初始化,而与 MCU 无关的串口参数相关的通用配置则放在 HAL_UART_Init。 我们要初始化一个串口,首先要设置和 MCU 无关的东西,例如波特率,奇偶校验,停止位等, 这些参数设置和 MCU 没 有 任 何 关 系 , 可 以 使 用 STM32F1 , 也 可 以 是 STM32F2/F3/F4/F7/H7 上的串口。而一个串口设备它需要一个 MCU 来承载,例如用 STM32L4 来做承载,PA9 做为发送,PA10 做为接收,MSP 就是要初始化 STM32L4 的 PA9,PA10,配置 这 两 个 引 脚 。 所以 HAL 驱 动 方 式 的 初 始 化 流 程 就 是 : HAL_USART_Init()—>HAL_USART_MspInit() ,先初始化与 MCU 无关的串口协议,再初始化 与 MCU 相关的串口引脚。在 STM32 的 HAL 驱动中 HAL_PPP_MspInit()作为回调,被HAL_PPP_Init()函数所调用。当我们需要移植程序到 STM32F1 平台的时候,我们只需要修改 HAL_PPP_MspInit 函数内容而不需要修改 HAL_PPP_Init 入口参数内容。