HAL库文件解析与MDK工程创建
前言
本文是基于正点原子新发布的HAL库学习教程的学习笔记,不明白的可以去看正点原子的视频。
HAL库获取
ST 为了方便用户开发 STM32芯片开发提供了三种库:
标准外设库 (Standard Peripheral Libraries)
HAL库(硬件抽象层):Hardware Abstraction Layer
LL库:Low Layer
目前标准库已停止维护,ST主推HAL库,使用CUBEMX生成的代码也是基于HAL库,LL库是与HAL库捆绑发布,是HAL库的轻量化版本。
我们可以在ST公司的官网获取HAL库,在官网搜索STM32Cube,找到对应的版本下载即可
HAL库文件讲解
HAL库结构
打开固件包是这样的:
我们需要的文件一般都在Drivers文件夹
CMSIS文件夹:
重要文件讲解
以stm32f103c8t6为例
./路径/文件名 | 描述 |
---|---|
\CMSIS\Device\ST\STM32F1xx\Include\stm32f1xx.h | 是所有F1系列的顶层头文件,通过条件编译来包含某个芯片的头文件,定义通用的枚举类型,定义通用的宏定义(固件库没用这个) |
\CMSIS\Device\ST\STM32F1xx\Include\stm32f103xb.h | 包含:中断编号定义、外设寄存器结构体类型定义、寄存器映射、寄存器位定义、外设判定。 |
\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\ system_stm32f1xx.c | 定义了系统初始化函数 SystemInit和系统时钟更新函数 SystemCoreClockUpdate |
\Drivers\CMSIS\Device\ST\STM32F1xx\Include\system_stm32f1xx.h | 定义了系统初始化函数 SystemInit和系统时钟更新函数 SystemCoreClockUpdate |
\CMSIS\Device\ST\STM32F1xx\Include\startup_stm32f103xb.s | 中容量F103系列芯片的启动文件 |
HAL库文件介绍
ps:v1.8版本的HAL库的stm32f1xx_hal_conf.h文件为stm32f1xx_hal_conf_template.h。根据文件内描述,移植的时候重新命名为stm32f1xx_hal_conf.h即可
CMSIS文件
在固件包\Drivers\CMSIS\Core\Include\路径下,定义了一些关于编译器 、内核、架构的头文件,根据需要移植即可。
工程创建
创建工程文件夹
先创建一个新的工程文件夹,打开后新建如下文件夹:
Middlewares文件夹:该文件夹用于存放其他第三方提供的中间层代码(组件/Lib 等),
如: USMART、MALLOC、 TEXT、 FATFS、 USB、 LWIP、各种 OS、各种 GUI 等
Drivers文件夹下新建如下文件夹
移植HAL库
建立完文件夹后:按上一章节介绍找到在固件包对应文件,复制到相应位置。
其中
stm32f1xx.hal.conf.h
stm32f1xx_it.c
stm32f1xx_it.h
stm32f1xx_hal_msp.c // 回调函数存放文件,不用可删除
放入User文件夹,后三个个文件可以去固件包的Projects文件夹的官方例程里找,也可以把中断服务函数定义在其他位置。
前一章节五个重要文件放入CMSIS
内核文件放入CMSIS
main.c也可以定义在User文件夹
MDK建立工程
工程新建到Project文件夹下的MDK-ARM文件夹
工程分组
建立如下分组:
Middlewares没用到可以先不加
添加对应.C文件即可
ps:外设库文件按需求添加,可以加快编译速度,全添加完可能会有重复定义的函数,导致编译错误。
魔术棒配置
Target选项卡
晶振按实际的设置
Output选项卡
点上面唯一的按钮,将hex文件输出设置为Output文件夹
C/C++选项卡
Define:USE_HAL_DRIVER,STM32F103xE
后面那个XE表示大容量,根据实际情况去设置
打开stm32f1xx.h文件
该选项是通过条件编译来包含对应芯片的头文件
Include Path选项
添加工程文件夹内所有的头文件路径
Debug选项卡
设置对应的下载器
点开Setting按钮:
Debug选项,设置接口和下载速度
Flash Dowload选项
根据实际设置芯片容量,选择的Flash符合容量范围即可
例如:stm32f103c8t6 为中容量产品 flash为64k ‘
可选择如下选项
64k-128k为中容量: