[STM32H7] STM32H743-学习HAL库

[复制链接]
72|0
Xiashiqi 发表于 2025-10-10 08:02 | 显示全部楼层 |阅读模式
实验平台
硬件:银杏科技GT7000双核心开发板-ARM-STM32H743XIH6,银杏科技iToolXE仿真器
软件:最新版本STM32CubeH7固件库,STM32CubeMX v6.10.0,开发板环境MDK v5.35

HAL库
  HAL库(Hardware Abstraction Layer,硬件抽象层)是意法半导体(ST)为STM32微控制器推出的官方软件库,是其STM32Cube软件生态系统的重要组成部分。
  它的核心目标是简化STM32程序的开发,让开发者无需深入钻研底层复杂的寄存器配置,就能快速、高效地驱动STM32的所有外设(如GPIO、UART、I2C、SPI、ADC等)。

STM32 HAL库初识
  在STM32开发中,我们常用到HAL库,HAL库固件包已经封装好C语言编写的驱动文件,利用这些驱动文件我们可以控制STM32内部和外部的电子元器件。但是单有HAL库还不能足以控制一个STM32芯片,还需要其他的组件,这些组件已经由ARM与众多芯片硬件、软件厂商制动的通用软件开发CMSIS标准实现了,下面简单介绍下CMSIS标准。

CMSIS标准
  CMSIS(Cortex Microcontroller Software Interface Standard)是ARM公司制定的一套软件接口标准。它的核心目标是:

为Cortex-M处理器提供一致的软件接口。
提高芯片厂商(如ST、NXP、TI等)软件库的可复用性和兼容性。
让嵌入式软件(尤其是中间件和应用程序)可以在不同厂商的Cortex-M芯片之间更容易地移植。
下面来看ARM官方提供的CMSIS规范架构图,如下图所示:

1.png

  你可以把CMSIS想象成,PC世界的“Windows API”:所有Windows程序都基于这套API来开发,无论你用的是哪家品牌的电脑(联想、戴尔、惠普)。建筑行业的“地基和钢筋混凝土标准”:所有建筑都必须基于这个标准来打地基和搭建主体框架,保证了建筑的稳定性和互通性。

CMSIS包含几个关键组件,其中与HAL库关系最密切的是:

CMSIS-Core:提供对Cortex-M内核处理器和外围设备的标准化访问接口。
CMSIS Device Header:比如 stm32f4xx.h。这个文件由芯片厂商(ST)提供,它包含了特定型号芯片的所有外设寄存器定义、地址映射、中断向量表等。HAL库严重依赖这个头文件来操作寄存器。
CMSIS-Driver:定义了一组通用外设(如USART, I2C, SPI)的API标准。旨在让中间件可以在不同厂商的、实现了此标准的驱动库上运行。(注意:ST的HAL库并没有完全遵循CMSIS-Driver标准,它是一套自己的实现)。
CMSIS-DSP:包含一个丰富的数字信号处理(DSP)函数库,高度优化用于Cortex-M内核。这个库可以和HAL库一起使用。
CMSIS-RTOS API:定义了一个实时操作系统的通用API(如线程、信号量、消息队列的创建和使用)。流行的RTOS(如FreeRTOS, Azure RTOS ThreadX)都提供了CMSIS-RTOS的封装层,使得基于这些API编写的应用程序可以轻松在不同RTOS间移植。HAL库可以与任何RTOS协同工作。
结合STM32H7的芯片来说,其CMSIS应用程序的简单结构框图,如下图所示:

2.png

HAL库介绍
  HAL库提供了一套统一的、标准化的API(应用程序接口)函数。例如,无论你用的是STM32F1、F4还是H7系列,初始化一个UART的函数都是HAL_UART_Init()。这大大增强了代码在不同STM32系列之间的可移植性。更换芯片时,通常只需修改少量底层配置(如时钟),而上层应用代码几乎不用改动。
  开发者可以在CubeMX中通过图形界面点击配置芯片引脚、时钟树、外设参数等,工具会自动生成完整的、基于HAL库的初始化代码工程,极大提升了开发效率,减少了手动编写底层代码的繁琐和出错。
  HAL库是STM32Cube生态的基础,在其之上可以无缝集成各种中间件(Middleware),如:
    FreeRTOS(实时操作系统)
    LwIP(轻量级TCP/IP协议栈)
    FatFS(文件系统)
    USB Host/Device库,等等。
这些中间件也都可以通过STM32CubeMX轻松添加和配置。

  标准外设库(Standard Peripheral Library, SPL):HAL库的前身,现已停止更新。它比HAL库更接近寄存器,效率稍高,但可移植性和配套工具远不如HAL。ST官方现已主推HAL/LL库。
  LL库(Low-Layer Library,底层库):与HAL库同属STM32Cube生态。LL库更轻量、更接近寄存器,效率极高,但使用起来更复杂。常见用法:在CubeMX中生成项目时,可以选择“HAL + LL”的组合,对性能关键的部分用LL库,其他部分用HAL库,兼顾效率和易用性。

  HAL库是ST官方推出的、为了简化STM32开发过程的硬件抽象层库。 它通过提供统一的API和与STM32CubeMX工具的深度集成,极大地提升了开发效率和应用代码的可移植性,是现代STM32开发的首选和主流。虽然它在绝对效率和代码体积上有所牺牲,但对于绝大多数应用来说,其带来的开发便利性是远远超过其缺点的。
  对于学习者,建议从HAL库入手快速做出项目获得成就感,同时也要逐步了解底层寄存器和LL库,从而更全面地掌握STM32。

HAL库固件包
HAL库固件包获取
  ST提供了多种获取固件包的方法。我们只介绍从ST官网获取方法:登陆ST官网,在搜索栏输入STM32CubeH7(我们要下载固件包型号),就能找到下载页面:

3.png

4.png

5.png

注:下载固件包需要注册账号,自行注册即可。
  在环境搭建章节,我们介绍了另一种下载方式,通过CubeMX下载,我们可以点击软件中的Help->Updater Settings查看下载路径:

6.png

7.png

我们这里用的是STM32Cube_FW_H7_V1.11.2版本,如果需要最新版本,可以用上述方法在官网获取。

STM32Cube固件包分析
  我们找到固件包下载路径,可以看到固件包所包含的文件:

8.png

  我们来对STM32CubeH7固件每个文件夹简单介绍下他的功能,Documentation文件夹里面是一个STM32CubeH7英文说明文档,不过的介绍。

Dirvers文件夹
Drivers/   包含所有与硬件驱动相关的代码。
↳ CMSIS/    ARM Cortex-M 软件接口标准。包含设备特定头文件(如stm32h7xx.h)、启动文件
      (startup_*.s)、系统初始化代码(system_stm32h7xx.c)以及内核访问函数。这是
      HAL库和应用程序的基础。
↳ STM32H7xx_HAL_Driver/    ST提供的硬件抽象层(HAL)和底层(LL)库。Inc/和Src/目录下分别是头
              文件和源文件,提供标准化的API来操作所有片上外设,如GPIO、
              UART、I2C、SPI、ADC等。
↳ BSP/      板级支持包,用于适配ST官方的开发板的硬件驱动程序。

Middlewares文件夹
Middlewares/  包含各种中间件库。这些是可选的软件组件,用于为应用添加高级功能。
↳ ST/       ST自研的中间件,如STemWin(图形界面库)、STM32_Audio
        TouchGFX(高级GUI)、USB Device/Host库(USB协议栈)。
↳ Third_Party/  第三方中间件,如FreeRTOS(实时操作系统)、FatFs(文件系统)、LwIP
        (TCP/IP协议栈)。ST会提供这些中间件与HAL库适配的端口文件(port.c)。

Projects文件夹
  基于官方评估板的示例项目集合,是极佳的学习参考资源。每个文件夹对应一个ST官方的Demo板,根据型号的不同提供MDK和IAR等类型的例程。比如我们要查看STM32H743相关工程,所以我们直接打开子文件夹STM32H743I-EVAL即可。里面有很多实例,我们都可以用来参考。这里大家注意,每个工程下面都有一个MDK-ARM子文件夹,该子文件夹内部会有名称为Project.uvprojx的工程文件,我们只需要双击它就可在MDK中打开工程。

Projects/     基于官方评估板的示例项目集合,是极佳的学习参考资源。
↳ Examples/    针对单一外设的基础示例(如LED闪烁、UART通信)。非常适合初学者学习特定
         外设的基本用法。
↳ Applications/  综合应用,通常结合多个外设和一种或多种中间件(如基于FreeRTOS和LwIP的
         Web服务器)。
↳ Demonstrations/ 功能复杂的展示性项目,通常是开发板出厂预装的程序,用于展示芯片的强大功
          能。
↳ Templates/    空项目模板,用于创建全新的用户项目。

Utilities文件夹
实用工具,如LCD字体、CPU示波器等特定于评估板的代码

其他文件夹
文件夹中还有几个单独的文件,用于声明软件版本或者版权信息。
**License.md:**用于声明软件版权信息的文件。
**package.xml:**描述固件包版本信息的文件。
**Release_Notes.html:**超文本文件,用浏览器打开可知它是对固件包的补充描述和固件版本更新的记录说明。

CMSIS文件夹关键文件
  前面我们对STM32Cube固件包进行了分析,这节我们针对其中的CMSIS文件夹做一个分析。由命名可知,该文件夹就是前面提到的CMSIS标准,CMSIS目录如下:

7298268e771e837a3b.png

  CMSIS文件夹中Device和Include两个文件夹是我们工程中常用到的,下面对这两个文件夹进行简单分析:

Device文件夹
  关键文件介绍:

stm32h7xx.h:最核心的设备头文件。它包含了STM32H7系列芯片所有外设的寄存器地址映射和结构体定义(例如 GPIO_TypeDef, USART_TypeDef),以及中断编号的定义。几乎所有工程都必须包含此文件。
stm32h743xx.h:STM32H743系列芯片通用的片上外设访问层头文件,只要我们使用 STM32H743 系列芯片,都需要包括这个头文件 。 这个文件的主要作用是定义声明寄存器以及封装内存操作 ,以结构 .体和宏定义标识符的形式 。
system_stm32h7xx.h:与system_stm32h7xx.c文件配对的头文件,声明了系统初始化函数。
startup_stm32h743xx.s:这是芯片上电后执行的第一段代码,负责初始化堆栈指针、设置中断向量表、调用 SystemInit() 函数初始化系统时钟,最后跳转到 main() 函数。务必根据你的具体芯片型号和编译器选择正确的启动文件。

Include文件夹
  这个目录包含由ARM提供的、与芯片厂商无关的Cortex-M内核通用访问文件。所有基于Cortex-M的芯片都通用。core_cm7.h / core_cm7.c:Cortex-M7内核外设访问层。提供了用于访问Cortex-M7核心外设(如 NVIC (中断控制器)、SCB (系统控制块)、SysTick (系统定时器))的API函数、结构体和宏定义。例如,函数 NVIC_EnableIRQ(IRQn_Type IRQn) 就定义在这里。
  cmsis_compiler.h:编译器抽象层。它将不同编译器(如GCC、IAR、ARM Compiler)特有的语法(如内联汇编、关键字)统一成CMSIS标准格式,确保了代码的跨编译器兼容性。cmsis_armclang.h, cmsis_gcc.h:针对特定编译器的具体实现,由 cmsis_compiler.h 调用。cmsis_version.h:定义当前的CMSIS版本号。stdint.h:标准整数类型定义(虽然搜索结果提到此文件由ARM编译器提供,并在core_cm7.h中被包含,用于定义如 uint32_t、int16_t 等类型,确保跨平台数据类型的一致性)。

HAL库架构
  HAL库头文件和源文件在STM32Cube固件包的STM32H7xx_HAL_Driver文件夹中,打开该文件夹,如下图所示。

9.png

STM32H7xx_HAL_Driver文件夹下的Src(Source的简写)文件夹包含所有外设API函数的具体实现代码。Inc(Include的简写)文件夹存放的是包含所有外设的API函数声明、宏定义、结构体类型定义、枚举类型等。

HAL文件介绍
HAL库关键文件:
stm32h7xx_hal.h/stm32h7xx_hal.c:总入口头文件。在你的应用程序中(如main.c)通常只需包含这一个头文件。它会自动包含所有其他必要的HAL模块和配置头文件。包含库初始化、调试控制、SYSTick配置等系统级函数。
stm32h7xx_hal_conf.h:HAL库配置文件。你可以通过定义或取消定义类似HAL_ADC_MODULE_ENABLED 这样的宏,来启用或禁用特定外设模块的编译,从而优化代码体积。此文件通常需要从模板复制到你的项目目录并自行修改。
stm32h7xx_hal_def.h:定义了HAL库通用的数据类型(如HAL_StatusTypeDef)、宏和常量。这是其他HAL头文件的基础。
外设特定头文件:每个外设都有对应的头文件,命名格式为 stm32h7xx_hal_ppp.h 或 stm32h7xx_hal_ppp_ex.h(其中 ppp 为外设缩写,如 uart, adc, spi)。
这些文件包含了该外设的初始化结构体(如 UART_InitTypeDef)、API函数声明(如 HAL_UART_Init(), HAL_UART_Transmit())、回调函数类型定义(如 HAL_UART_TxCpltCallback())以及控制宏。

HAL库 API文档
  ST官方给我们提供了快速查找API函数的帮助文档。

10.png

根据我们开发板主控芯片STM32H743XIH6我们没有找到直接可用的,可以查看信号相近的:STM32H735xx_User _Manual.chm。以GPIO为例,我们可以看到有关GPIO的所有API,包括函数的描述、源码位置。

11.png

学会查阅次文档,帮助我们使用HAL库,借助HAL库来进行编程,甚至可以修改HAL库来适配我们的项目,API大同小异,学会其中一个,其他的外设都是类似的。

HAL库用户配置文件
  STM32CubeH7的HAL库提供了一套名为用户配置文件的机制,让你能灵活地定制HAL库的编译和行为,以适应你的具体项目需求,避免编译未使用的代码,从而节省存储空间。可以在STM32CubeH7固件包的以下路径找到模板文件:Drivers/STM32H7xx_HAL_Driver 目录下stm32h7xx_hal_conf_template.h,我们可以直接复制这个文件重命名为stm32h7xx_ hal_conf.h,做一些简单的修改即可,也可以从在官方的例程中直接复制过来。
  stm32h7xx_hal_conf.h 文件允许你进行以下几类关键配置:

5391568e7721d978d2.png

HAL库stm32h7xx_hal.c文件
HAL_Init()函数

HAL_StatusTypeDef HAL_Init(void)
{
  /* 设置中断优先级分组 */
  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

  /* 使用滴答定时器做为默认时基,配置为1ms滴答,另外系统上电后默认使用的HIS时钟 */
  if(HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK)
  {
    return HAL_ERROR;
  }

  /* 初始化底层硬件 */
  HAL_MspInit();

  /* 返回函数状态 */
  return HAL_OK;
}


该函数是HAL库的初始化函数,程序运行时优先调用,功能入如下:

设置NVIC优先级分组是4。
设置滴答定时器的每1ms中断一次。
HAL库不像之前的标准库,在系统启动函数SystemInit里面做了RCC初始化,HAL库是没有做的,所以进入到main函数后,系统还在用内部高速时钟HSI,对于H7来说,HSI主频是64MHz。
函数HAL_Init里面调用的HAL_MspInit一般在文件stm32h7xx_hal_msp.c里面做具体实现,主要用于底层初始化。当前此函数也在文件stm32h7xx_hal.c里面,只是做了弱定义。
返回值,返回HAL_ERROR表示参数错误,HAL_OK表示发送成功,HAL_BUSY表示忙,正在使用中。
HAL_DeInit()函数
HAL_StatusTypeDef HAL_DeInit(void)
{
  /* 复位所有外设 */__set_PRIMASK
  __HAL_RCC_AHB3_FORCE_RESET();
  __HAL_RCC_AHB3_RELEASE_RESET();

  /* 省略未写 */

  __HAL_RCC_APB4_FORCE_RESET();
  __HAL_RCC_APB4_RELEASE_RESET();

  /* 复位底层硬件初始化 */
  HAL_MspDeInit();

  /* 返回值 */
  return HAL_OK;
}



函数用于复位HAL库和滴答时钟。

复位了AHB1,2,3,4的时钟以及APB1L,APB1H,APB2,3,4的时钟。
函数HAL_DeInit里面调用的HAL_MspDeInit一般在文件stm32h7xx_hal_msp.c里面做具体实现,主要用于底层初始化,跟函数HAL_Init里面调用的HAL_MspInit是一对。当前此函数也在文件stm32h7xx_hal.c里面,只是做了弱定义。
HAL_InitTick()函数
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
  /* Configure the SysTick to have interrupt in 1ms time basis*/
  if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U)
  {
    return HAL_ERROR;
  }

  /* Configure the SysTick IRQ priority */
  if (TickPriority < (1UL << __NVIC_PRIO_BITS))
  {
    HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
    uwTickPrio = TickPriority;
  }
  else
  {
    return HAL_ERROR;
  }

  /* Return function status */
  return HAL_OK;
}




此函数用于初始化滴答时钟,此函数相关问题如下:

此函数有个前缀__weak ,表示弱定义,用户可以重定义。
此函数用于初始化滴答时钟1ms中断一次,并且为滴答中断配置一个用户指定的优先级。
此函数由HAL_Init调用,或者任何其它地方调用函数HAL_RCC_ClockConfig配置RCC的时候也会调用HAL_InitTick。
调用基于此函数实现的HAL_Delay要特别注意,因为这个函数的时间基准是基于滴答定时器或者其他通用定时器实现,实现方式是滴答定时器或者其他通用定时器里面做了个变量计数。如此一来,结果是显而易见的,如果其他中断服务程序调用了此函数,且中断优先级高于滴答定时器,会导致滴答定时器中断服务程序一直得不到执行,从而卡死在里面。所以滴答定时器的中断优先级一定要比它们高。
形参TickPriority用于设置滴答定时器优先级。
返回值,返回HAL_ERROR表示参数错误,HAL_OK表示发送成功,HAL_BUSY表示忙,正在使用中。
Systick的相关函数
调用了函数HAL_Init后,Systick相关的函数就可以使用了。这些函数如下:
__weak void HAL_IncTick(void)
__weak uint32_t HAL_GetTick(void)
uint32_t HAL_GetTickPrio(void)
HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq)
HAL_TickFreqTypeDef HAL_GetTickFreq(void)
__weak void HAL_Delay(uint32_t Delay)
__weak void HAL_SuspendTick(void)
__weak void HAL_ResumeTick(void)



函数描述:

函数HAL_IncTick在滴答定时器中断里面被调用,实现一个简单的计数功能,因为一般滴答定时器中断都是配置的1ms,所以计数全局变量uwTick每毫秒加1。
函数HAL_GetTick用于获取全局变量uwTick当前的计数。
函数HAL_GetTickPrio用于获取滴答时钟优先级。
函数HAL_SetTickFreq和HAL_GetTickFreq是一对,前者用于设置滴答中断频率,后再用于获取滴答中断频率。
函数HAL_Delay用于阻塞式延迟,默认单位是ms。
函数HAL_SuspendTick和HAL_ResumeTick是一对,前者用于挂起滴答定时器,后者用于恢复。
函数有个前缀__weak ,表示弱定义,用户可以重定义。
HAL_SYSCFG_VREFBUF_VoltageScalingConfig()函数
void HAL_SYSCFG_VREFBUF_VoltageScalingConfig(uint32_t VoltageScaling)


此函数用于配置STM32H7内部电压基准大小。

当形参VoltageScaling = SYSCFG_VREFBUF_VOLTAGE_SCALE0时
输出基准是2.048 V,条件是VDDA >= 2.4V。
当形参VoltageScaling = SYSCFG_VREFBUF_VOLTAGE_SCALE1时
输出基准是2.5 V,条件是VDDA >= 2.8V。
当形参VoltageScaling = SYSCFG_VREFBUF_VOLTAGE_SCALE2时
输出基准是1.5 V,条件是VDDA >= 1.8V。
当形参VoltageScaling = SYSCFG_VREFBUF_VOLTAGE_SCALE3时
输出基准是1.8 V,条件是VDDA >= 2.1V。
H7自带电压基准相关函数
void HAL_SYSCFG_VREFBUF_VoltageScalingConfig(uint32_t VoltageScaling)
void HAL_SYSCFG_VREFBUF_TrimmingConfig(uint32_t TrimmingValue)
HAL_StatusTypeDef HAL_SYSCFG_EnableVREFBUF(void)
void HAL_SYSCFG_DisableVREFBUF(void)



函数描述:

函数HAL_SYSCFG_VREFBUF_VoltageScalingConfig
此函数用于配置STM32H7内部电压基准是否在芯片内部与VREF+引脚接通。

(1) 形参为SYSCFG_VREFBUF_HIGH_IMPEDANCE_DISABLE时,表示导通。
(2) 形参为SYSCFG_VREFBUF_HIGH_IMPEDANCE_ENABLE时,表示高阻,即不导通。

函数HAL_SYSCFG_VREFBUF_TrimmingConfig
此函数用于内部电压基准的校准调节。

函数HAL_SYSCFG_EnableVREFBUF和HAL_SYSCFG_DisableVREFBUF是一对,分别用于内部电压参考基准的禁止和使能。

以太网PHY接口选择函数
void HAL_SYSCFG_ETHInterfaceSelect(uint32_t SYSCFG_ETHInterface);


该函数用于以太网PHY接口的选择,可以是MII或RMII接口。

HAL_SYSCFG_AnalogSwitchConfig()函数
void HAL_SYSCFG_AnalogSwitchConfig(uint32_t SYSCFG_AnalogSwitch ,
uint32_t SYSCFG_SwitchState );


当PA0、PA1、PC2、PC3引脚复用为ADC的时候,还有一组对应的可选引脚PA0_C、PA1_C、PC2_C、PC3_C。该函数的作用就是切换这些可选的引脚。详解可以参考https://forum.anfulai.cn/forum.php?mod=viewthread&tid=87707

12.png

Booster的使能和禁止函数(用于ADC)
void HAL_SYSCFG_EnableBOOST(void)
void HAL_SYSCFG_DisableBOOST(void)


函数描述:

这两个函数用于使能或者禁止Booster。如果使能了booster的话,在供电电压低于2.7V时,可以减少模拟开关总的谐波失真,这样的话,模拟开关的性能跟正常供电电压时的全范围测量一样。
HAL_SYSCFG_CM7BootAddConfig()函数
void HAL_SYSCFG_CM7BootAddConfig(uint32_t BootRegister, uint32_t BootAddress)


该函数用于配置程序启动模式,BOOT=0或者BOOT=1,来选择启动地址。

IO补偿、低功耗、EXTI等相关函数
后续详细介绍
HAL库中断处理
  中断是STM32开发的一个很重要的概念,通俗来讲就是当你正在写作业时,做到一半又去吃饭,吃完饭后又回来接着原来的作业继续完成。 在STM32中:中断是指CPU正在处理某个事件A,发生了另一件事件B,请求CPU迅速去处理(中断发生);CPU暂时停止当前的工作(中断响应),转去处理事件B(中断服务);待CPU处理事件B完成后,再回到原来的事件A(断点)继续执行,这一过程称之为中断。
  HAL库的中断处理机制建立在CMSIS标准之上,并采用了一种分层、标准化的设计模式。其核心目标是让开发者更专注于应用程序逻辑,而不是繁琐的中断配置和管理。它主要通过 “中断服务程序(ISR)” 和 “回调函数(Callback)” 的分离来实现这一目标。为了更直观地理解这个流程,下图清晰地展示了从硬件中断发生到用户代码执行的完整路径:关于STM32中断的概念,我们会在中断例程的讲解再跟大家详细介绍。

13.png

总结
1.以STM32CubeMX为中心:永远使用CubeMX来生成工程框架和初始化代码,这是最可靠、最高效的方式。
2.不要修改库文件:切勿直接修改 Drivers/ 目录下的HAL库源文件。所有定制应通过重写回调函数或修改用户配置文件 (hal_conf.h) 来实现。
3.善用Examples:固件包中的 Projects/ 示例项目是学习HAL库用法的最佳参考,遇到问题先看示例。
4.保持回调函数简短:中断回调函数中应只做标记、通知等最小化工作,避免调用阻塞函数(如 HAL_Delay),快进快出。
5.H7系列特殊注意:
  *Cache管理:务必理解D-Cache和I-Cache的作用,并在使用DMA时处理好缓存一致性问题(清理/无效化缓存)。
  *内存分配:清楚不同内存块(DTCM, ITCM, AXI SRAM, SRAM1/2/3/4)的特性和用途,将关键数据(如DMA缓冲区)放到合适的内存中。
7. 混合编程:在对性能有极致要求的代码段,可以混合使用HAL库和LL库,兼顾开发效率和执行效率。
8. 关注版本:升级HAL库时,务必阅读 Release_Notes.html,了解变化和不兼容的更新。

  HAL库是现代STM32开发的“瑞士军刀”,它通过牺牲一部分执行效率,换来了巨大的开发效率提升。把你的精力从“如何操作寄存器”转移到“如何实现产品功能”上,这是HAL库最大的价值。对于大多数应用来说,HAL库带来的便利远超过其性能上的微小损耗。掌握HAL库,就意味着你掌握了利用STM32Cube生态系统进行高效开发的钥匙
————————————————
版权声明:本文为CSDN博主「GilgameshJSS」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/GilgameshJSS/article/details/151819923

您需要登录后才可以回帖 登录 | 注册

本版积分规则

97

主题

282

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部