STM32开发库介绍与比较
2021-06-30苏州大学工程学院邹霄贝
苏州大学工程学院 邹霄贝
目前,意法半导体公司就STM32的开发提供了数种开发工具,它们各有其优缺点和适用对象。本文将从使用方法、便携性、工具的抽象程度以及它们的局限性等方面对STM32Snippets,标准外设库以及基于STM32Cube的HAL APIs和Low-Layer APIs进行介绍,同时对它们的特点进行横向的比较和分析。
目前,STM32嵌入式的开发和使用主要依靠于STM32嵌入式软件提供的各种开发库及其配套的软件,选择合适的软件会让STM32的开发和使用事半功倍。而不同的开发库的便携性、抽象程度和适用的芯片系列等都各不相同,开发的需求与库的选择也息息相关。
因此,本文对目前SMT32官方提供的STM32Snippets、标准外设库、HAL APIs和Low-Layer APIs的内容和特点进行了整合研究,并对其适用范围进行了分析对比,从而获得对开发库的更全面的认识。
1 STM32Snippets
STM32Snippets是高度兼容的代码示例的集合,可以直接应用于文档和软件包,这些示例通过进行直接寄存器访问来减少代码量,从而STM32的MCU的性能最大化利用。
由于STM32Snippets是操作于最底层的,因此需要开发者对寄存器进行直接操作,开发者需要对底层结构和寄存器比较了解,同时需要对汇编程序有较深的理解。同时,因为STM32Snippets具有能进行寄存器级别的访问和调试的特点,在提供的开发库中它的优化程度最高。
但是,STM32Snippets仅使用于STM32系列,采取这种方式进行项目的开发很难实现不同系列之间的移植。同时,STM32并不涵盖例如USB之类的外设的代码段示例,如果要进行一些复杂的外设应用,可能需要额外耗费很多的时间。此外,STM32Snippets仅可在STM32 L0和F0系列上使用。
2 标准外设库
标准外设库(即Standard Peripheral Libraries,简称SPL),是涵盖STM32外设的C语言库,标准外设库将一些基本的寄存器操作封装成库函数使用,较HAL库而言,依旧接近于寄存器操作。
标准外设库目前几乎是使用者最多的库,在STM32Cube发布前,几乎所有的STM32用户均使用标准外设库。标准外设库覆盖了所有的外围设备,极大地方便了项目的开发,提高了编程效率。同时,标准固件库还涵盖许多复杂中间件的扩展,例如USB、TCPIP、Graphics等,进一步方便了使用者的开发。标准固件库的结构清晰,在调用上比较简单,且各系列的标准固件库差别不大,在不同固件库间进行程序移植时也比较简单。
图1所示为STM32F10xxx系列的文件基本架构,其他系列的文件架构基本与STM32F10xxx系列一致。
图1 STM32F10xxx标准外设库架构
但是,标准固件库仅适用于特定的STM32系列,并且没有通用的硬件抽象层应用程序接口,并不是每一个系列间都有统一的中间件库,在系列间的移植性较差。同时,在选择标准固件库时也要注意,标准固件库不支持从STM32 L0,L4和F7开始的STM32系列。
3 基于STM32Cube的开发库(图2)
图2 STM32Cube功能示意图
STM32Cube是一个功能齐全的软件包,它包含直接基于STM32外设寄存器的应用程序接口(API),因此在整个STM32内部都具有高度可移植性。同样,STM32Cube中包含和SPL外设相似的初始化API。
STM32Cube还提供了STM32CubeMX这个可视化配置软件,通过STM32CubeMX,用户可以通过图形向导实现生成初始化C代码,引脚多路复用,时钟树设置,外围设备配置和中间件设置等。STM32Cube软件包中包含调用标准化的API的可移植性硬件抽象层库(即HAL库)、轻量高效的底层API(即LL库)等内容。
3.1 HAL APIs
HAL库,即硬件抽象层,它涵盖一整套中间件,可以实现系列间的代码移植,同时,HAL库也支持通过STM32CubeMX可视化操作生成代码。
HAL库是基于一个非限制性的BSD许可协议而发布的开源代码。ST制作的中间件堆栈带有允许轻松重用的许可模式,只要是在ST公司的MCU芯片上使用,库中的中间件(USB主机/设备库,STemWin)协议栈即被允许随便修改,并可以反复使用。
相较于标准外设库,HAL库更加抽象化,可移植性更高,目前HAL库已经支持包括F7在内的全部产品。但是,HAL库较之其他开发库占用了更多的软件资源,执行代码的所需要的时间更长,优化程度较低。
3.2 Low-Layer APIs(图3)
图3 STM32Cube结构
Low-Layer库,简称为LL库,也是包含在STM32Cube中的库,就HAL库而言,它更加底层,进行直接寄存器操作。它可以与STM32CubeMX配合使用以生成STM32L0/F0/F3/L4的初始化代码。
相较于HAL库的低效率,在对低性能(M0)或者低功耗(L系列)的芯片编程时,LL库可以作为HAL库的一个很好的替代品进行使用。基于LL库的驱动程序,涵盖可指定参数的外围设备初始化函数,重置初始化数据结构的函数,内联函数可实现直接访问原子寄存器。同时LL库既可以独立运行,又可以和HAL库一起混合运行,更为优化的同时也更加适应多种情况。
尽管HAL库和LL库可以同时使用,但是LL不能与同一外围设备实例的HAL一起使用。不能同时使用两个API在同一IP上运行并行进程,但允许顺序使用。
4 各库比较
根据官方提供的数据,获得如表1的各开发库特征比较。
表1 各开发库特征比较
由表1可知,每个开发库都各有其长处和局限性。STM32Snippets作为代码段示例,MPU和存储器的使用效率很高,因此它的优化程度很高,但是它的可移植性、简易度等参数都很低,对开发者的总体要求很高。不同的开发库的特点要求开发者根据使用的STM32类型、开发项目对效率、性能、可移植性的要求来选择需要的库,从而实现更高效的开发。
结论:就目前STM32官方所提供的开发库而言,STM32Snippets代码效率极高但是对开发者对底层架构和汇编语言的理解程度有较高的要求;标准固件库硬件覆盖完备,提供对寄存器操作的库函数,但是目前只有部分STM32系列提供了固件库,不同系列之间的移植有一定困难;作为STM32公司大力推广的HAL库,覆盖了全部的硬件外设,可移植性极高,但是代码优化程度较低,占用软件资源;LL库接近底层,优化程度高,但是不能在系列间移植,同时也需要开发者对寄存器有一定的了解。