STM32 工程的创建 - 基于 HAL 库
目前 STM32 的开发方式有 3 个层次:
- 基于寄存器方式。极少的人使用这种形式。这种方式最底层、最直接、效率更高,但 STM32 寄存器十分复杂,一般不建议采取这种方式。
- 基于标准库(库函数)方式。使用 ST 官方提供封装好的函数,通过调用函数间接配置寄存器。这种方式对开发人员比较友好,有利于提高开发效率。
- 基于 HAL 库方式。HAL 库是 ST 公司目前主力推的开发方式,全称就是 Hardware Abstraction Layer(抽象印象层)。可以使用图形化界面快速配置 STM32,隐藏底层的逻辑。
HAL 库的出现比标准库要晚,但其实和标准库一样,都是为了节省程序开发的时期。如果说标准库把实现功能需要配置的寄存器集成了,那么 HAL 库的一些函数甚至可以做到某些特定功能的集成。
HAL 库很好的解决了程序移植的问题,不同型号的 stm32 芯片它的标准库是不一样的,例如在 F4 上开发的程序移植到 F3 上是不能通用的,而使用 HAL 库,只要使用的是相通的外设,程序基本可以完全复制粘贴。
ST 公司研发的 STMcube 软件可以通过图形化的配置功能,直接生成整个使用 HAL 库的工程文件。但它同时也存在执行效率的低下的问题。
本篇文章介绍使用 STM32CubeMX 创建 STM32 工程的文章,并实现一个 LED 点灯的案例。如果打算使用寄存器或标准库方式创建项目,可移步这篇文章:STM32 工程的创建 - 基于寄存器或标准库。关于 Keil 的更多使用技巧可详看这篇文章:Keil 的使用技巧与问题解决。
本文使用的工具材料有:
- ST-Link
- STM32(这里以 STM32F103C8T6 最小核心板为例)
- 杜邦线若干
软件安装
- 安装 JRE(Java 运行环境)。选择 64 位的安装。官网:Download Java for Windows。以前装过就不用装。
- 安装 STM32CubeMX。官网安装:STM32CubeMX: Graphical tool - STMicroelectronics - STMicroelectronics。如果没有账号请提前注册 ST 公司的账号。
- 安装 Keil5 MDK。Keil5 是收费软件,使用需破解。安装和破解方法请自行搜索。
HAL 库安装
打开 STM32CubeMX。
建议改一下仓库路径,改到 C 盘以外的地方:
点击 OK 返回。然后继续点击 Help 下的软件包管理:
选择 F1 系列进行下载:
新建工程
点击按钮新建工程:
选择型号:
引脚选择
我们打算点亮最小核心板上 PC13 连接的 LED 灯。在可视化界面中点击 PC13 引脚,选择 GPIO_Output:
引脚的颜色说明:
- 浅黄色:不可配置引脚。比如电源引脚。
- 橙色:配置了一个 I/O 口的功能,但没有初始化对应的外设。引脚处于 NO MODE 状态。
- 绿色:表示配置成功。
不要忘了设置这个:
否则烧录一次后就烧不了第二次了。(详看:在keil 5下ST-LINK无法识别问题的解决_keil5检测不到stlink-CSDN博客)
时钟配置
RCC 配置:
充分利用最小核心板上的时钟,把配置拉满(72MHz)。
工程创建
进入工程管理界面:
注意不要存在中文路径。
代码生成选项:
一些选项的说明:
Copy all uesd libraries into the project folder:将 HAL 库的所有.c
和.h
都复制到所建工程中:
- 优点:这样如果后续需要新增其他外设又可能不再用 STM32CubeMX 的时候便会很方便
- 缺点:体积大,编译时间长
Add necessary library files as reference in the toolchain project configuration file:不复制文件,直接从软件包存放位置导入.c
和.h
- 优点:体积小,比较节约硬盘空间
- 缺点: 复制到其他电脑上或者软件包位置改变,就需要修改相对应的路径
点击生成按钮生成项目:
一个项目可以多次生成。这意味着我们可以中途重新配置引脚后重新生成。原项目的自己写的代码部分不会消失(前提是按规范写在指定位置。后面会讲。)
我们可以看到文件夹已经生成:
代码编写
在魔术棒中配置烧写后自动复位,比较方便:
打开 main.c 文件。大部分初始化函数已经自动生成了。我们的代码必须在注释提示的指定位置中编写,否则下次代码重新生成时,写在指定位置外的代码将被删除。
在 main 函数中 while 循环编写:
1 | /* Infinite loop */ |
编译通过后,将 ST-Link 连接到电脑。检查一下 ST-Link 是否检测到。
如未连接或链接了但无法烧写,请参考 在keil 5下ST-LINK无法识别问题的解决_keil5检测不到stlink-CSDN博客 进行解决。
检查完成后,将代码下载烧写即可。
后记
如果还想接着移植 FreeRTOS,可以继续阅读这篇文章:STM32 移植 FreeRTOS - 基于 HAL 库