stm32 hal库

1. STM32的不同库

标准库和 HAL 库、LL 库完全相互独立。

  1. 标准库
    主要是寄存器操作的一些封装。本质还是操作寄存器
  2. HAL库
    HAL 库更倾向于外设通用化,扩展组件中解决芯片差异操作部分,是硬件抽象层
  3. LL库
    LL 倾向于最简单的寄存器操作,属于是HAL的一些高效的补充

1.1 标准库

即类似使用宏定义和结构体进行裸机编程,其操作仍然是访问寄存器。

1.2 hal库(硬件抽象层)

即将应用软件功能和硬件分离,更方便移植到不同的平台。

1.3 LL库

比 HAL 库更接近于硬件底层的操作,代码更轻量级,代码执行效率更高的库函数组件

但 LL库不匹配复杂的外设,如 USB 等。所以 LL 库并不是每个外设都有对应的完整驱动配置程序。

1.4 hal库和ll库的框图关系

alt text

由图可见,总共有三层,上层是应用层User, 中层是Middlewares,下层是驱动层(硬件抽象层)(省略了CMSIS的底层芯片定义)

2. STM32工程项目结构

alt text

新建一个stm32的工程项目的步骤:

  1. 创建本地文件夹作为工程根目录,并拷贝准备好必须的全部文件。(芯片硬件相关)
  2. 用keil来指定好实际需要编译的对象。(实际编译环境需要相关)

下面逐一介绍

2.1 本地工程根目录

alt text
下面从下往上以此讲解每一层的作用

2.1.1 Drivers

这一层作为驱动底层可以具体细分为
alt text

2.1.1.1 CMSIS

存放最低层硬件相关资源
alt text

可以看到,CMSIS下一共两个文件夹:Device, Include.

CMSIS/Include
里面存放了底层定义的编译器相关工具

CMSIS/Device
里面,指定了ST芯片公司的F1系列芯片具体系列设备。
然后Device下又细分为Source/, Include/。

CMSIS/Device/Include:
存放该系列芯片的base基础芯片定义和e型号的芯片定义。(同时包含了f1系列芯片初始化的头文件)
CMSIS/Device/Source:
包含了f1系列芯片初始化的c文件。同时指明了项目名:Templates/
我们使用arm里面的startup启动汇编文件。

2.1.1.2 HAL

alt text
alt text

Drivers/HAL
文件夹里面包含了所有的hal驱动库,硬件抽象层,所有和硬件平台相关的都在CMSIS中定义。我们在之后的构建编译MDK中选择我们需要的驱动加入项目编译选项

2.1.1.3 SYSTEM

alt text

SYSTEM 文件夹中也是存放系统功能的一些驱动库,和HAL独立开来,以表示和系统最根本的功能强相关。

2.1.1.4 BSP

这个暂时不需要

2.1.2 Middlewares

这个存放一些中间件,包括FreeRTOS, uORB,等协议,组件等。

2.1.3 User

这个存放系统主程序

2.2 MDK

Keil
这个你可以把他理解为实际需要编译的一个编译选项。
我们已经把全部相关的资源都准备在本地的工程根目录,我们现在在这个根目录上开发,新建了一个项目。

选择我们需要的文件加入编译选项,比如
startup: 启动文件
user: 这是我们的用户主程序

下面两个是我们的驱动层代码
Driver/SYSTEM
Driver/HAL

(硬件相关的我们在魔棒的c++配置中加入头文件索引即可直接include)
alt text

最终编译文件结构为:
alt text

注意:
system_stm32f1xx.c 里面是定义SystemInit函数的,这个初始化函数是在start_up.s中调用,所以可以将system_stm32f1xx.c放到startup文件夹中也行。

另外,stm32f1xx_it.c是定义回调函数的,这里面我们只将SysTick的回调绑定成hal库的回调,实际就是计数加一。我试着将他在MDK中的位置放到Driver/HAL中也是一样的。