前段时间,,同时硬件抽象层也对应的进行了升级,官方叫HAL2。
HAL:Hardware Abstraction Layer,翻译过来叫:硬件抽象层,是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化。
前面,我体验STM32CubeMX2并生成初始化代码时,大概看了一下生成代码的API(比如:HAL_GPIO_Init、HAL_GPIO_WritePin等),感觉和之前HAL库的API一样,当时也没细看具体源码,就觉得HAL库还是类似一样的。
而最近才细看了官方的描述、以及库对应的源码,发现还真有很大差异。就拿STM32同系列(C系列)C0和C5的HAL相比:
我发现了其中区别最大的一点:新的HAL2库(STM32C5库)调用了LL库的代码。
官方的描述:HAL2(V2.0.0版本),带来了许多增强功能,包括性能(运行速度)和Flash空间占用有很大改进,并与新的STM32CubeMX2兼容。
提高性能和减少占用空间,感觉是:HAL2整合并汲取了HAL(易于移植)和LL库(性能和空间)的优点。
HAL2和HAL有些API的名称相同,但参数不同,比如HAL_GPIO_Init,通过对比这个API,你会发现,HAL2多了状态返回值(枚举类型的hal_status_t),同时,传入参数的方式也不一样。
所以,最新的HAL2和之前的HAL库是不兼容的(虽然很多API名称相同,但参数不同)。
通过对比(同样外设)的源码,发现基本是“一片红”,可以说千差万别。
甚至对比工具都不知道怎么检索了,同一个API接口都不能匹配一起了。所以,我还特意单独把某些API(比如HAL_USART_Init)接口复制到另一个文件进行对比。
当然,源码有区别与底层硬件有关系,所以我专门找C系列(相近或同源的系列)进行对比,我重点还是把相同API进行一些简单对比。
为此,我还专门把跨系列的HAL进行了对比,发现C0和F4有很多地方都是相同的。
所以,我综合得出的结论就是:全新的HAL2库,和之前的HAL库完全不兼容。
------------ END ------------