目前 STM32 的开发方式有 3 个层次:

  1. 基于寄存器方式。极少的人使用这种形式。这种方式最底层、最直接、效率更高,但 STM32 寄存器十分复杂,一般不建议采取这种方式。
  2. 基于标准库(库函数)方式。使用 ST 官方提供封装好的函数,通过调用函数间接配置寄存器。这种方式对开发人员比较友好,有利于提高开发效率。
  3. 基于 HAL 库方式。HAL 库是 ST 公司目前主力推的开发方式,全称就是 Hardware Abstraction Layer(抽象印象层)。可以使用图形化界面快速配置 STM32,隐藏底层的逻辑。

HAL 库的出现比标准库要晚,但其实和标准库一样,都是为了节省程序开发的时期。如果说标准库把实现功能需要配置的寄存器集成了,那么 HAL 库的一些函数甚至可以做到某些特定功能的集成。

HAL 库很好的解决了程序移植的问题,不同型号的 stm32 芯片它的标准库是不一样的,例如在 F4 上开发的程序移植到 F3 上是不能通用的,而使用 HAL 库,只要使用的是相通的外设,程序基本可以完全复制粘贴。

ST 公司研发的 STMcube 软件可以通过图形化的配置功能,直接生成整个使用 HAL 库的工程文件。但它同时也存在执行效率的低下的问题。

更多区别可参阅:STM32中HAL库与标准库的区别_stm32标准库和hal库有什么区别-CSDN博客

本篇文章介绍使用 STM32CubeMX 创建 STM32 工程的文章,并实现一个 LED 点灯的案例。如果打算使用寄存器或标准库方式创建项目,可移步这篇文章:STM32 工程的创建 - 基于寄存器或标准库。关于 Keil 的更多使用技巧可详看这篇文章:Keil 的使用技巧与问题解决

本文使用的工具材料有:

  • ST-Link
  • STM32(这里以 STM32F103C8T6 最小核心板为例)
  • 杜邦线若干

软件安装

  1. 安装 JRE(Java 运行环境)。选择 64 位的安装。官网:Download Java for Windows。以前装过就不用装。
  2. 安装 STM32CubeMX。官网安装:STM32CubeMX: Graphical tool - STMicroelectronics - STMicroelectronics。如果没有账号请提前注册 ST 公司的账号。
  3. 安装 Keil5 MDK。Keil5 是收费软件,使用需破解。安装和破解方法请自行搜索。

HAL 库安装

打开 STM32CubeMX。

image.png

建议改一下仓库路径,改到 C 盘以外的地方:

image.png

点击 OK 返回。然后继续点击 Help 下的软件包管理:

image.png

选择 F1 系列进行下载:

image.png

新建工程

点击按钮新建工程:

image.png

选择型号:

image.png

引脚选择

我们打算点亮最小核心板上 PC13 连接的 LED 灯。在可视化界面中点击 PC13 引脚,选择 GPIO_Output:

image.png

引脚的颜色说明:

  • 浅黄色:不可配置引脚。比如电源引脚。
  • 橙色:配置了一个 I/O 口的功能,但没有初始化对应的外设。引脚处于 NO MODE 状态。
  • 绿色:表示配置成功。

不要忘了设置这个:

image.png

否则烧录一次后就烧不了第二次了。(详看:在keil 5下ST-LINK无法识别问题的解决_keil5检测不到stlink-CSDN博客

时钟配置

RCC 配置:

image.png

充分利用最小核心板上的时钟,把配置拉满(72MHz)。

image.png

工程创建

进入工程管理界面:

image.png

注意不要存在中文路径。

代码生成选项:

image.png

一些选项的说明:image.png
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
  • 优点:体积小,比较节约硬盘空间
  • 缺点: 复制到其他电脑上或者软件包位置改变,就需要修改相对应的路径

点击生成按钮生成项目:

image.png

一个项目可以多次生成。这意味着我们可以中途重新配置引脚后重新生成。原项目的自己写的代码部分不会消失(前提是按规范写在指定位置。后面会讲。)

我们可以看到文件夹已经生成:

image.png

代码编写

image.png

在魔术棒中配置烧写后自动复位,比较方便:

image.png

打开 main.c 文件。大部分初始化函数已经自动生成了。我们的代码必须在注释提示的指定位置中编写,否则下次代码重新生成时,写在指定位置外的代码将被删除。

image.png

在 main 函数中 while 循环编写:

1
2
3
4
5
6
7
8
9
10
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,(GPIO_PinState)0);
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

编译通过后,将 ST-Link 连接到电脑。检查一下 ST-Link 是否检测到。

image.png

如未连接或链接了但无法烧写,请参考 在keil 5下ST-LINK无法识别问题的解决_keil5检测不到stlink-CSDN博客 进行解决。

检查完成后,将代码下载烧写即可。

后记

如果还想接着移植 FreeRTOS,可以继续阅读这篇文章:STM32 移植 FreeRTOS - 基于 HAL 库

本文参考