拓冰建站拓冰建站
首页 / 资讯中心 / 正文

STM32CubeMX2 HAL2, 与HAL有什么不同

摘要本文系统梳理了STM32 HAL2驱动与经典HAL的差异。文章首先解释了HAL2的诞生背景与目标随后对比了两者的架构通路最后以GPIO和USART为例对比了常用外设接口在HAL与HAL2下的API差异与实现路径帮助读者快速理解HAL2的设计思路与迁移要点。关键词 STM32CubeMX2、HAL2、STM32C5、HAL文章目录前言一、HAL VS HAL21.1 为什么要有HAL21.2 架构对比1.2.1 HAL通路1.2.2 HAL2通路二、常用外设接口HAL与HAL2对比2.1 GPIO2.2 USART2.2.1包含头文件2.2.2初始化反初始化函数2.2.3USART 运行函数2.2.4USART回调函数三、总结前言最近有幸参加了ST在北京举办的STM32C5培训。培训中提到了STM32C5采样了HAL2驱动并对HAL2驱动进行了简单介绍。HAL2是对HAL的完全颠覆吗HAL2与HAL常用外设如ADC、USART等API接口一样吗带着这些问题可以看一下我接下来的文章描述。我在这里记录一下我的理解方便小伙伴对HAL2有一个更深的认识。一、HAL VS HAL21.1 为什么要有HAL2STM32 HAL上线一来一直广受好评它的跨系列可移植性API编程模式外设多实例支持等特点让我们不必太过关心底层操作轻松的在ST的不同性能平台上进行移植代码使我们的产品拥有了更好的竞争力。然后随着工程代码量的增加所占FLASH和RAM硬件资源就需要变得更大项目工程的运行性能也会有所下降。为了解决这个痛点STM32 HAL2它来了HAL2目标是提升性能并降低代码占用。HAL2 相比 HAL1在保持功能的同时显著优化了代码体积并着重提升了性能、可维护性和跨平台能力。在HAL2中通过大量使用LL内联函数、对代码结构进行优化在提升代码性能的同时减少了对MCU硬件资源的占用。其次HAL2还增强了代码的可读性如在USART.h中对不同API的功能 通过注释划分更加细致。最后HAL2提高了代码的可移植性。1.2 架构对比先贴图这是培训中给出的HAL与HAL2架构的对比。HAL三条通路:Application - LL init functions - LL Low/Middle and High level funtionsApplication - LL Low/Middle and High level funtionsApplication - HAL Peripherals drivers - Core Drivers可选HAL2三条通路Application - LL Low/Middle and High level funtionsApplication -HAL Peripherals drivers - LL Low/Middle and High level funtionsApplication - HAL Peripherals drivers - Core Drivers 可选从架构来看两者相差不大。HAL2在HAL的基础上进行了改进。与HAL相比之下HAL2去掉了Application - LL init - LL Low/Middle and High level funtions这条通路增加了Application -HAL Peripherals drivers - LL Low/Middle and High level funtions这条路。下面简单介绍一下HAL与HAL2的三条通路1.2.1 HAL通路1. Application - LL init functions - LL Low/Middle and High level funtionsADC应用中ADC初始化函数调用LL_ADC_IsEnabled函数。2. Application - LL Low/Middle and High level funtions直接在main.c函数中调用LL_PWR_EnableVDDA()等函数。3. Application - HAL Peripherals drivers - Core Drivers这里对Core Drivers进行一下简单解释。CMSIS内核函数即 ARM CMSIS 提供的与 Cortex-M 内核相关的函数例如__disable_irq()__enable_irq()__set_PRIMASK()__get_PRIMASK()__set_BASEPRI()__get_BASEPRI()__WFI()__WFE()__DSB()__ISB()这些函数的本质是在操作CPU内核寄存器或者指令。在低功耗应用中进入Standby模式使用__WFI指令。1.2.2 HAL2通路1. Application - LL Low/Middle and High level funtionsmain.c中直接对LL功能函数进行操作。2. Application -HAL Peripherals drivers - LL Low/Middle and High level funtionsADC应用中在ADC配置函数值调用LL函数分辨率采样模式。3. Application - HAL Peripherals drivers - Core Drivers在低功耗应用时Sleep模式函数中用到了 WFI /WFE内核指令。1.LLLow/Middle and High level function二、常用外设接口HAL与HAL2对比接下来我将对比STM32C5 (HAL2 Cortex M33)与 STM32U3 (HAL Cortex M33) GPIO/ADC/ USART 外设看看HAL2与HAL之间的差别。2.1 GPIOHAL_GPIO_ReadPinAPI名称相同接口参数相同。使用LL函数提升代码性能的同时对代码进行了进一步的删减。HAL_GPIO_LockPinAPI名称相同接口参数相同。代码量明显减少。HAL_GPIO_TogglePinAPI名称相同接口参数相同。代码量进行了进一步的缩减。从上面三个函数分析其中HAL2走的通路为Application -HAL Peripherals drivers - LL Low/Middle and High level funtions在HAL函数内部调用了LL函数。HAL走的通路为Application - HAL Peripherals drivers。在HAL函数中主要是通过代码直接对寄存器进行操作。2.2 USARTHAL2的演进保留了HAL的基本特性。如2.2相同的编程模型基于对象基于轮询/中断/DMA的处理流程半完成、完成、错误中断回调。下面通过USART的示例来看一下上面描述到的内容。2.2.1 包含头文件对比.h中包含的头文件会发现HAL2中包含了 “stm32c5xx_ll_usart.h” 也就是说HAL2的HAL USART Peripherals drivers中会大量调用LL USART Low/Middle and High level funtions。2.2.2 初始化反初始化函数在初始化和反初始化函数中HAL2去掉了HAL_USART_MspInit和HAL_USART_MsDepInit这两个底层初始化函数保留了HAL_USART_Init和HAL_USART_DeInit函数。2.2.3 USART 运行函数在保留原来功能的基础中对USART功能API进行了更细部分的划分。2.2.4 USART回调函数保留了原来的功能。并对API函数注释进行了更细的划分提升了代码的可读性。三、总结在上面描述中系统梳理了STM32 HAL2驱动与经典HAL的差异。HAL2并非对HAL的完全颠覆而是在保持原有编程模型与API风格的基础上针对代码体积和运行性能进行深度优化。架构上HAL2去掉了LL init通路新增了HAL Peripherals drivers调用LL函数的通路使驱动内部更充分地复用LL内联函数。以GPIO和USART为例GPIO的API名称与参数完全一致迁移成本低USART则保留了轮询、中断、DMA及回调机制同时精简了底层初始化函数。整体来看HAL2在提升性能、降低资源占用和增强可维护性方面优势明显是STM32驱动发展的新方向。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门