文章目录
- 一、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 主要用来配置时钟系统和外设初始化代码。