1 HAL库和标准库区别

HAL库(Hardware Abstraction Layer,硬件抽象层)标准库(Standard Peripheral Library,标准外设库,又称为SPL) 都是STM32微控制器的固件库。它们的主要区别在于结构和抽象的级别。

  1. HAL 库: HAL 库是 STMicroelectronics(ST)提供的较新的库。它提供了一套统一的 API,用于访问 STM32 系列微控制器的外设。HAL 库的目的是简化固件开发,让开发者更加关注应用层逻辑,而无需深入了解底层硬件。

    HAL 库的特点:

    • 跨平台支持:支持 STM32 全系列微控制器。

    • 结构统一:为所有外设提供统一的 API 和驱动结构。

    • 易于使用:简化了许多硬件操作,使得开发者可以快速上手。

    • 与 STM32CubeMX 工具集成:STM32CubeMX 可以自动生成 HAL 库的初始代码,方便开发者配置硬件。

  2. 标准库(SPL):标准库是 STMicroelectronics(ST)较早推出的库,提供了访问 STM32 外设的底层驱动。它在设计上更接近寄存器操作,为开发者提供了更多的控制权,但是相对复杂一些。(已经停止维护)

    标准库的特点:

    • 针对特定平台:针对不同的 STM32 系列提供相应的库。

    • 底层驱动:为外设提供底层的驱动接口,更接近硬件操作。

    • 控制精细:提供了更多的硬件控制选项,但相应地要求开发者具备较高的硬件知识。

    • 学习曲线较陡:由于其底层性质,开发者需要花费更多的时间学习和理解。

总结: HAL 库和标准库都可以实现 STM32 的固件开发,但它们具有不同的抽象级别和设计哲学。HAL 库更加易于使用,与 STM32CubeMX 工具集成,并支持跨平台开发。相比之下,标准库提供了更底层的硬件控制,但学习曲线较陡。根据开发者的经验和项目需求,可以选择适合的库进行开发。

2 CMSIS

CMSIS 标准英文全称是 Cortex MicroControllerSoftware Interface Standard,意思就是ARM Cortex微控制器软件接口标准

由于基于 Cortex 核的芯片厂商很多,不只是 ST 公司,为了解决不同厂家的对 Cortex 芯片核心软件兼容问题,ARM制定公司就和这些厂家建立了这套 CMSIS 标准。

alt text

CMSIS 处于中间层,向上提供给用户程序和实时操作系统所需的函数接口,向下负责与内核和其他外设通信。我认为可以理解就是:库函数如何定义,寄存器操作定义,系统初始化函数定义

假如没有CMSIS 标准,基于Cortex 的芯片厂商就会设计出自己喜欢的风格库函数。因此CMSIS 标准就是要强制他们必须按照这个标准来设计

在CMSIS 框架内又分为3 个基本功能层:

  1. 核内外设访问层:ARM 公司提供的访问,定义处理器内部寄存器地址 以及功能函数。

  2. 中间件访问层:定义访问中间件的通用API,由ARM 提供,芯片厂商 根据需要更新。

  3. 外设访问层:定义硬件寄存器的地址以及外设的访问函数,比如ST 公司提供的固件库外设驱动文件(stm32f10x_gpio.c 等文件)就是在这个访问 层。

CMSIS 就是统一各芯片厂商固件库内函数的名称,比如在系统初始化的时候使用的是SystemInit 这个函数名,那么CMSIS 标准就是强制所有使用Cortex 核设计芯片的厂商内固件库系统初始化函数必须为这个名字,不能修改。又比如对GPIO 口输出操作的函数:GPIO_SetBits,此函数名也是不能随便定义的。

参考

参考1:STM32之CMSIS标准介绍

参考2:CMSIS到底是个什么东西