STM32CubeMX 是由 ST 公司开发的图形化代码自动生成工具,能够快速生成初始化代码, 如配置 GPIO,时钟树,中间件等,使用户专注于业务代码的开发。
一. STM32CubeMX 的作用
对于 STM32CubeMX 和 STM32Cube 的关系这里我们还需要特别说明一下,STM32Cube 包含 STM32CubeMX 图形工具和 STM32Cube 库两个部分,使用 STM32CubeMX 配置生成的 码,是基于 STM32Cube 库的。也就是说,我们使用 STM32CubeMX 配置出来的初始化代码, 和 STM32Cube 库兼容,例如硬件抽象层代码就是使用的 STM32 的 HAL 库。不同的 STM32 系 列芯片,会有不同的 STM32Cube 库支持,而 STM32CubeMX 图形工具只有一种。所以我们配 置不同的 STM32 系列芯片,选择不同的 STM32Cube 库即可。
当然,自动生成的驱动代码我们不去仔细专研其原理的话,对学习的提升很有限,而且在 出现 BUG 的时候难以快速定位解决,因此我们也要了解其背后的原理。
二. 安装 STM32CubeMX
STM32CubeMX 运行环境搭建包含两个部分。首先是 Java 运行环境安装,其次是 STM32CubeMX 软件安装。
三. 使用 STM32CubeMX 新建工程
通过上一步安装固件库后,我们就可以使用 STM32CubeMX 配置工程,步骤如下:
1. 工程初步建立
2. HSE 和 LSE 时钟源设置
3. 时钟系统(时钟树)配置
4. GPIO 功能引脚配置
5. 配置 Debug 选项
6. 生成工程源码
7. 用户程序
1. 工程初步建立
2. HSE 和 LSE 时钟源设置
3. 时钟系统(时钟树)配置
点击 Clock Configuration 选项卡即可进入时钟系统配置栏。
进入 Clock Configuration 配置栏之后可以看到,界面展现一个完整的 STM32F1 时钟系统框 图。从这个时钟树配置图可以看出,配置的主要是外部晶振大小,分频系数,倍频系数以及选 择器。在我们配置的工程中,时钟值会动态更新,如果某个时钟值在配置过程中超过允许值, 那么相应的选项框会红色提示。
这里,我们将配置一个以 HSE 为时钟源,配置 PLL 相关参数,然后系统时钟选择 PLLCLK 为时钟源,最终配置系统时钟为 72MHz 的过程。同时,还配置了 AHB,APB1,APB 和 Systick 的相关分频系数。
第一部分是配置 系统时钟,第二部分是配置 SYSTICK、AHB、APB1 和 APB2 的分频系数。
我们把系统时钟配置分为五个步骤,分别用标号①~⑤表示,详细过程为:
① 时钟源参数设置:我们选择 HSE 为时钟源,即使用外部晶振,所以我们要根据开发板 实际的晶振频率(这里我们是 8MHZ)填写。
② 时钟源选择:我们配置选择器选择 HSE 即可。
③ PLL 倍频系数 PLLMUL 配置。倍频系数 PLLMUL 我们设置为 9。
④ 系统时钟时钟源选择:PLL,HSI 还是 HSE。我们选择 PLL,选择器选择 PLLCLK 即可。
⑤ 经过上面配置以后此时 SYSCLK=72MHz。
经过上面的 5 个步骤,就配置好 STM32F1 的系统时钟为 72MHz。接下来我们还需要配置 AHB、APB1、APB2 和 Systick 的分频系数,为 STM32 的片上外设或 M3 内核设置对应的工作 时钟,为后续使用这些硬件功能做好准备。
AHB、APB1 和 APB2 总线时钟以及 Systick 时钟的来源于系统时钟 SYSCLK。其中 AHB 总线时钟 HCLK 由 SYSCLK 经过 AHB 预分频器之后得到,如果我们要设置 HCLK 为 72MHz(最 大为 72Mhz),那么我们只需要配置图中标号⑥的地方为 1 即可。得到 HCLK 之后,接下来我 们将在图标号⑦~⑨处同样的方法依次配置 Systick、APB1 和 APB 分频系数分别为 1、2 和 1。 注意!systick固定为72MHz,配置完成之后,那么HCLK=72MHZ,Systic=72MHz,PCLK1=36MHz, PCLK2=72MHz,这和之前例程配置的时钟是主频一样的。
4. GPIO 功能引脚配置
GPIO output level 是 IO 的初始值,由于 LED 一端接 VCC,另一端接 GPIO,故要点亮 LED 灯时,使 GPIO 输出低电平即可。为了一开始让 LED 灯熄灭,我们设置初始值输出高电平。
GPIO mode 默认是推挽输出,不需要更改。
GPIO Pull-up/Pull-down 默认是不上下拉,我们改为上拉。
Maximum output speed 输出速度配置,默认是低速,我们设置为高速。
User Label 用户符号,我们可以给 PB5 起一个别的名字 LED0。
PE5 也是按照这样的方法配置即可。
5. 配置 Debug 选项
由于 CubeMX 默认把 Debug 选项关闭了,这样会给我们带来麻烦:用 CubeMX 生成的工 程编译下载一次后,后续再次下载就会提示错误,因此我们要把 Debug 选项打开。
如果已经不小心关闭了 Debug 选项,那么下次下载的时候按住复位键,等到工程提示的时 候松开复位键即可,因为 STM32 的芯片默认复位上电时的 Debug 引脚功能是开启的。
6. 生成工程源码
勾选 Generate peripheral initialization as a pair of ‘.c/.h’files per peripheral,勾选这个选项的话将会将每个外设单 独分开成一组.c、.h 文件,使得代码结构更加的清晰
由于 CubeMX 默认勾选了复制所有的库,即工程中不使用到的代码也会复制进来,为了节 省 CubeMX 生成工程的空间,我们勾选生成工程时只复制用到的库
Drivers 文件夹存放的是 HAL 库文件和 CMSIS 相关文件。
Inc 文件夹存放的是工程必须的部分头文件。
MDK-ARM 下面存放的是 MDK 工程文件。
Src 文件夹下面存放的是工程必须的部分源文件。
Template.ioc 是 STM32CubeMX 工程文件,双击该文件就会在 STM32CubeMX 中打开。
7. 用户程序
生成的 MDK 工程位置是.\MDK-ARM\atk_f103.uvprojx
STM32CubeMX 生成的 main.c 文件中,有很多地方有“/* USER CODE BEGIN X */”和“/* USER CODE END X */”格式的注释,我们在这些注释的 BEGIN 和 END 之间编写代码,那么重新生成工程之后,这些代码会保留而不会被覆盖。
编写好程序后,编译没有任何警告和错误。可以直接下载程序到开发板中,使用 ST-Link 下 载,请注意设置 MDK 的下载选项
四. STM32CubeMX 新建工程使用建议
① 使用 CubeMX 的环境搭建工程,工程文件夹路径、文件名不要带任何中文及中文字符, 否则会遇到各种报错;
② 本书以新建工程-HAL 库版本为基准来展开,不对 CubeMX 的使用过多讲解。使用 CubeMX 可以帮助我们快速搭建工程,使用户专注于应用开发,但 STM32 的开发与硬件密切相 关,对 STM32 开发来说,抛开底层只专注做应用并不实际,毕竟无法使用一套通用设计来满足 不同用户的需求;