初识 HAL
在比较漫长的汇编语言时代,很多程序员都习惯用位操作对底层硬件进行编写,其优点有以下等:
- 代码直观
- 代码执行效率高
- 代码体积小
缺点有以下等:
- 代码可读性差
- 代码移植性差
- 代码维护性差
- 代码复用性差
- 代码调试困难
在微控制器技术变得更加复杂和多样化之后, 人们开始将底层硬件和控制代码解耦合,让开发者所编写的应用代码与底层硬件无关, HAL 库的设计目的正是为此,从而使开发者更容易地移植和维护嵌入式软件。
CMSIS(Cortex Microcontroller Software Interface Standard)介绍
一个为 ARM Cortex-M 微控制器系列设计的标准化软件接口。它旨在为开发者提供一个统一的接口,使得在不同 ARM Cortex-M 微控制器之间移植和复用软件变得更加容易。CMSIS 的目的是减少为不同微控制器编写软件的复杂性,并允许开发者更容易地从一个微控制器迁移到另一个微控制器。
CMSIS 包括以下几个关键部分:
- CMSIS-Core:提供了一个基本框架,包括用于启动、中断处理、内存管理和异常处理的通用函数。
- CMSIS-DSP:提供了一个数字信号处理(DSP)的软件库,包含了用于信号处理操作的函数。
- CMSIS-RTOS:提供了一个实时操作系统(RTOS)接口,允许开发者选择并集成不同的 RTOS 实现。
- CMSIS-Device:为每个 ARM Cortex-M 微控制器定义了特定的寄存器映射和中断向量表。
- CMSIS-Driver:提供了一个设备驱动程序框架,用于访问微控制器的通用外设。
通过使用 CMSIS,开发者可以编写与硬件无关的代码,只需针对特定的微控制器进行一些小的修改或配置,就可以在不同的微控制器上运行。这极大地提高了开发效率,并简化了微控制器软件的维护和更新。
HAL 库介绍
ST 为了方便用户开发 STM32 芯片开发提供了三种库:
- 标准外设库(Standard Peripheral Libraries):
- ST 最早的库,现在还在用
- 目前只兼容 F0/F1/F3/F2/F4/L1 系列
- 目前已停止维护
- 硬件抽象层(Hardware Abstraction Layer):
- ST 目前主推的库
- 全系列兼容
- 兼容性好、移植方便,但效率不太高
- 低级抽象层(Low Layer):
- 与 HAL 库困捆绑发布
- 全系列兼容
- 轻量级、效率高
- 不匹配部分复杂外设,比如 USB
CMSIS 与 HAL 区别
- 目的:
- CMSIS 的目的是提供一套标准化的接口,以减少为不同微控制器编写软件的复杂性
- HAL 库的目的是提供一个更高层的接口,以简化对硬件的访问
- 抽象级别:
- CMSIS 提供的是低级别的抽象,直接映射到硬件寄存器和中断向量表
- HAL 库提供的是更高层的抽象,隐藏了硬件的细节,提供了一系列易于使用的函数
- 集成:
- CMSIS 可以与 HAL 库一起使用,以提供从启动到外设访问的完整软件栈,CMSIS 定义了硬件访问的框架
- 而 HAL 库提供了具体的实现
- 兼容性:
- CMSIS 定义的接口在不同的微控制器之间是兼容的
- HAL 库通常由微控制器的制造商提供,它们可能为特定微控制器提供定制化的实现。
总的来说,CMSIS 和 HAL 库都是为 ARM Cortex-M 微控制器设计的,但 CMSIS 提供了一套标准化的接口,而 HAL 库提供了一个更高层的抽象,以简化对硬件的访问。两者可以一起使用,以提供从启动到外设访问的完整软件栈。