文章目录
- 一、STM32CubeMX 简介
- 二、STM32CubeMX 运行环境搭建
- 1.Java环境安装
- 2.STM32CubeMX 图形化工具安装
- 三、使用 STM32CubeMX 工具配置工程模板
- 1.工程初步建立和保存
- 2.RCC 设置
- 3.时钟系统(时钟树)配置
- 4.GPIO 功能引脚配置
- 5.生成工程源码
- 6.编写用户程序
stm32Cube 包含 2 个部分:一部分是嵌入式软件包(包括
HAL 库),另一部分是图形化配置工具
STM32CubeMX。
一、STM32CubeMX 简介
STM32CubeMX 是 ST 意法半导体近几年来大力推荐的 STM32 芯片图形化配置工具,允许用户使用图形化向导生成 C 初始化代码,可以大大减轻开发工作,时间和费用。STM32CubeMX几乎覆盖了 STM32 全系列芯片。它具有如下特性:
- 直观的选择
MCU型号,可指定系列、封装、外设数量等条件 - 微控制器图形化配置
- 自动处理引脚冲突
- 动态设置时钟树,生成系统时钟配置代码
- 可以动态设置外围和中间件模式和初始化
- 功耗预测
- C 代码工程生成器覆盖了
STM32微控制器初始化编译软件,如IAR,KEIL,GCC。 - 可以独立使用或者作为
Eclipse插件使用
STM32CubeMX 和STM32Cube 的关系:STM32Cube包含 STM32CubeMX 图形工具和 STM32Cube 库两个部分,使用 STM32CubeMX 配置生成的代码,是基于 STM32Cube 库的。也就是说,我们使用STM32CubeMX 配置出来的初始化代码和 STM32Cube 库兼容,例如:硬件抽象层代码就是使用的 STM32 的 HAL 库。不同的 STM32 系列芯片,会有不同的 STM32Cube 库支持,而 STM32CubeMX 图形工具只有一种。所以我们配置不同的 STM32 系列芯片,选择不同的 STM32Cube 库即可。
二、STM32CubeMX 运行环境搭建
STM32CubeMX 运行环境搭建包含两个部分:Java 运行环境安装与STM32CubeMX 软件安装。
1.Java环境安装
这里大家需要注意,
STM32CubeMX的Java运行环境版本必须是V1.7及以上,如果你的电脑安装过V1.7以下版本,请先删掉后重新安装最新版本。

安装完 Java 运行环境之后,为了检测是否正常安装,我们可以打开 Windows 的命令输入框,输入:java –version 命令,如果显示 Java 版本信息,则安装成功。提示信息如下图所示:

2.STM32CubeMX 图形化工具安装
双击 STM32CubeMX 安装包,根据提示信息安装即可。安装完成之后提示信息如下图所示:

安装完成之后,我们打开软件,如果软件安装成功,打开软件之后的界面如下图所示:

在安装好 STM32CubeMX 之后,接下来我们要在软件中指定 STM32Cube 软件包。在STM32CubeMX 操作界面,依次点击 Help->Updater Settings,弹出界面如下图所示:

三、使用 STM32CubeMX 工具配置工程模板
大多数情况下,我们都只使用STM32CubeMX 来生成工程的时钟系统初始化代码以及外设的初始化代码,因为用户控制逻辑代码是无法在 STM32CubeMX 中完成的,需要用户自己根据需求来实现。使用 STM32CubeMX 配置工程的一般步骤为:
- 工程初步建立和保存
RCC设置- 时钟系统(时钟树)配置
GPIO功能引脚配置- 生成工程源码
- 编写用户代码
1.工程初步建立和保存
工程建立的方法有两种方法,第一种方法是打开 STM32CubeMX 之后在主界面点击 New Project 按钮,第二种方法是在菜单栏依次点击 File->New Project。

点击新建工程按钮之后,会弹出 MCU 选择窗口。我们依次在选项卡 Series,Lines 和 Package之下选择与我们使用的芯片 STM32F429IGT 对应的参数,然后选择对应的芯片型号,最后点击OK 按钮。操作方法如下图所示:

为了避免在软件使用过程中出现意外导致工程没有保存,所以我们选择好芯片型号之后,先对工程进行保存。依次点击菜单栏 File->Save Project,然后保存工程到某个文件夹下面即可。操作过程如下图所示:

保存完成之后,进入Template 目录后发现目录中多了一个 Template.ioc 文件,下次我们点击这个文件就可以直接打开这个工程。
工程新建好之后会直接进入 Pinout 选项卡,这个时候界面会展示芯片完整引脚图,如下图所示:

在引脚图中,我们可以对引脚功能进行配置。图中黄色的引脚主要是一些电源和 GND 引脚。如果某个引脚被使用,那么会显示为绿色。
2.RCC 设置
对 STM32 芯片而言,RCC 配置的重要性不言而喻。在 STM32CubeMX 中,RCC 相关设置却非常简单,因为它把时钟系统独立出来配置。 在操作界面,依次点击选项卡Pinout->Peripherals->RCC 便可进入 RCC 配置栏,操作步骤如下图所示:

从上图可以看出,RCC 配置栏实际上只有 5 个配置项。选项 High Speed Clock(HSE)用来配置HSE,第二个选项 Low Speed Clock(LSE)用来配置 LSE,选项 Master Clock Output 1 用来选择是否使能 MCO1 引脚时钟输出,选项 Master Clock Output 2 用来选择是否使能 MCO2引脚时钟输出,最后一个选项 Audio Clock Input(I2S_CKIN)用来选择是否从 I2S_CKIN(PC9)输入I2S时钟。这里大家要注意,因为选项 Master Clock Output 2 和选项 Audio Clock Input(I2S_CKIN)都是使用的 PC9 引脚,所以如果我们使能了其中一个,那么另一个选项会自动显示为红色,也就是不允许配置,这就是 STM32CubeMX 的自动冲突检测功能。
本小节我们只使用到 HSE,所以我们设置选项 High Speed Clock(HSE)的值为Crystal/Ceramic Resonator(使用晶振/陶瓷振荡器)即可。这里还需要说明一下,值 Bypass ClockSource 的意思是旁路时钟源,也就是不使用使用晶振/陶瓷振荡器,直接通过外部提供一个可靠的 4-26MHz 时钟作为 HSE。配置好的 RCC 配置选项如下图所示:

从上图还可以看出,在我们打开了 HSE 之后,右边的引脚图中,相应的引脚会由灰色变为绿色,表示该引脚已经被使用。
3.时钟系统(时钟树)配置
点击 Clock Configuration 选项卡即可进入时钟系统配置栏,如下图所示:

进入Clock Configuration配置栏之后可以看到,界面展现一个完整的STM32F429时钟系统框图。这个时钟系统框图跟我们之前时钟系统章节讲解的时钟系统框图实际是一模一样的,只不过调整了一下显示顺序。从这个时钟树配置图可以看出,配置的主要是外部晶振大小,分频系数,倍频系数以及选择器。在我们配置的工程中,时钟值会动态更新,如果某个时钟值在配置过程中超过允许值,那么相应的选项框会红色提示。
这里,我们将配置一个和我们之前讲解的 Stm32_Clock_Init 函数实现的一模一样的配置。Stm32_Clock_Init 函数主要实现的是以 HSE 为时钟源,配置主 PLL 相关参数,然后系统时钟选择 PLL 为时钟源,最终配置系统时钟为 180MHz 的过程。同时,还配置了 AHB,APB1,APB2和 Systick 的相关分频系数。由于图片比较大,我们把主要的配置部分分两部分来讲解,第一部分是配置系统时钟,第二部分是配置 AHB,APB1 和 APB2 的分频系数。首先,我们来看看第一部分配置如下图所示:

我们把系统时钟配置分为 6 个步骤,分别用标号1-6表示,详细过程为:
- 时钟源参数设置:
HSE或者HSI配置。这里我们选择HSE为时钟源,所以我们之前必须在RCC配置中我们开启 HSE。 - 时钟源选择:
HSE还是HSI。这里我们配置选择器选择HSE即可。 PLL分频系数M配置。分频系数M我们设置为 25。- 主
PLL倍频系数N配置。倍频系数N我们设置为 360。 - 主
PLL分频系数P配置。分频系数P我们配置为 2。 - 系统时钟时钟源选择:
PLL、HSI还是HSE。这里选择PLL,选择器选PLLCLK即可。
经过上面的 6 个步骤,就会生成标准的 180MHz 系统时钟。接下来我们只需要配置 AHB,APB1,APB2 和 Systick 的分频系数,就可以完全实现函数 Stm32_Clock_Init 配置的时钟系统。配置如下图所示:

AHB,APB1 和 APB2 总线时钟以及 Systick 时钟的最终来源都是系统时钟 SYSCLK。其中AHB 总线时钟 HCLK 是由 SYSCLK 经过 AHB 预分频器之后的来,如果我们要设置 HCLK 为180MHz,那么我们只需要配置图中标号⑦的地方为 1 即可。得到 HCLK 之后,接下来我们将在图标号⑧~⑩处同样的方法依次配置 Systick, APB 以及 APB2 分频系数分别为 1,4 和 2 即可。配置完成之后,那么 HCLK=180MHZ , Systick 时钟为 180/1MHz=180MHz ,PCLK1=180MHz/4=45MHz,PCLK2=180MHz/2=90MHz,这和我们使用 Stm32_Clock_Init 函数配置的时钟是一模一样的。
4.GPIO 功能引脚配置
那么,怎么使用 STM32CubeMX 工具配置 STM32 的 GPIO 口。在阿波罗STM32F429 开发板的 PB0 和 PB1 引脚有连接两个 LED 灯,本小节将配置这两个 IO 口的相关参数。STM32CubeMX 可以直接在芯片引脚图上配置 IO 口参数。这里我们回到STM32CubeMX的Pinout选项,在搜索栏输入PB0和PB1即可找到PB0和PB1在引脚图中的位置如下图所示:

接下来,我们在上图引脚图中点击 PB0,在弹出的下拉菜单中,选择 IO 口的功能为 GPIO_Output。操作方法如下图所示:

同样的方法,我们配置 PB1 选择功能为 GPIO_Oput 即可。这里我们需要说明一下,如果我们要配置 IO 口为外部中断引脚或者其他复用功能,我们选择相应的选项即可。配置完 IO 口功能之后,还要配置 IO 口的速度,上下拉等参数。这些参数是在 Configuration 选项卡中配置的。配置步骤如下图所示:

GPIO output level:有low和high两种选择,一般选择low
GPIO mode:推挽输出和开漏输出两者模式,两者模式的区别在于推 挽输出中1代表VCC,0表示GND;开漏输出中1代表高阻态,0代表GND。
GPIO Pull-up/Pull-down:输入需要上下拉,输出一般没有上下拉
Maxinum output speed:最大的输出速度,一般选择low就可以了。
配置完成后即可。
5.生成工程源码
经过上面 4 个步骤,一个完整的系统已经配置完成。接下来,我们将使用 STM32CubeMX生成我们需要的工程源码。在 STM32CubeMX 操作界面,选择Project Manager,操作方法如下图所示:

设置工程名字,并且Toolchain/IDE选择MDK-ARM,Version选择V5。选择GENERATE CODE,就会生成相应的代码。
源码生产完成之后,就保存在我们 Project Location 选项配置的目录中,同时弹出生成成功提示界面,我们可以点击界面的“Open Folder”按钮打开工程保存目录,也可以点击界面的“Open Project”按钮直接使用 KEIL5 打开工程。提示界面如下图所示:

至此,一个完整的 STM32F429 工程就已经生成完成。生产后的工程目录结构如下图所示:

Drivers文件夹存放的是HAL库文件和CMSIS相关文件。Inc文件夹存放的是工程必须的部分头文件。MDK-ARM下面存放的是MDK工程文件。Src文件夹下面存放的是工程必须的部分源文件。Template.ioc是STM32CubeMX工程文件,双击该文件工程就会在STM32CubeMX中被打开。
6.编写用户程序
在编写用户程序之前,首先我们打开生成的工程模板进行编译,发现没有任何错误和警告。工程模板结构如下图所示:

我们直接打开 main.c 源文件可以看到,该文件定义了两个关键函数 SystemClock_Config 和MX_GPIO_Init,并且在 main 函数中调用了这两个函数。SystemClock_Config 函数用来配置时钟系统,和我们模板中的 Stm32_Clock_Init函数作用一样。MX_GPIO_Init 函数用来初始化 PB0 和 PB1 相关配置,这在我们的模板中,我们直接放在 main 函数中。接下来我们看看生成的工程模板的 main 函数,这里我们删掉了源码
注释,关键源码如下:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
}
}
在while语句中添加跑马灯实验核心代码,
/* USER CODE BEGIN 0 */
void Delay(__IO uint32_t nCount);
void Delay(__IO uint32_t nCount)
{
while(nCount--){}
}
/* USER CODE END 0 */
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //PB1 置 1
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //PB0 置 1
Delay(0x7FFFFF);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); //PB1 置 0
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET); //PB0 置 0
Delay(0x7FFFFF);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
这个时候,我们对工程进行编译,发现没有任何警告和错误。下载程序到阿波罗 STM32F429 开发板上,LED1与LED2循环闪烁。
- 这里我们需要说明一下,大多数情况下,我们使用 STM32CubeMX 主要用来配置时钟系统和外设初始化代码。


















