1,概览
STM32CubeMX是STM32Cube工具家族中的一员,从MCU/MPU选型,引脚配置,系统时钟以及外设时钟设置,到外设参数配置,中间件参数配置,它给STM32开发者们提供了一种简单,方便,并且直观的方式来完成这些工作。所有的配置完成后,它还可以根据所选的IDE生成对应的工程和初始化C代码。除此以外,STM32CubeMX还提供了功耗计算工具,可作为产品设计中功耗评估的参考。
2,特性
内嵌ST MCU Finder,直观的STM32 MCU&MPU选型,Board选型,例程选型和交叉对比选型
丰富易用的图形化接口满足多种配置,并生成相应C代码:
引脚配置,自动冲突处理
Arm Cortex-M内核、外设的参数配置及动态验证
中间件模块管理及配置
时钟树参数配置及动态验证
电源功耗评估
Arm Cortex-M内核MCU初始化C工程的自动生成,适用于IAR Embedded Workbench, MDK-ARM和 STM32CubeIDE (GCC 编译器) ,STM32CubeMX工程包含生成的初始化C代码,STM32驱动、依据配置的中间件和其他相关文档
下载或升级STM32Cube嵌入式软件资源(STM32Cube Packages、STM32Cue Expansion Packages)
Arm Cortex-A内核STM32微处理器部分Linux设备树的自动生成,DDR配置
通过打开已保存配置的工程切换MCU平台,易于MCU平台间移植
导出配置报告
集成STM32Cube Packages在项目中,
CAD资源下载(原理图符号、PCB封装和3D模型)
针对STM32U5系列优化功耗的LPBAM配置
TrustZone友好支持
中间件的参数配置USB、LwIP、FatFS、FreeRTOS、Mbed TLS等
针对所有系列可进行Thread-Safe设置;
基于STM32PackCreator可以开发更丰富的STM32Cube扩展包
独立软件运行于Windows, Linux , macOS操作系统,和64-bit Java 运行环境
3,从选择器开始新工程
如何开始一个新的STM32CubeMX工程?STM32CubeMX提供了四种方式,如下图。
• 从选择MCU/MPU型号开始
在“MCU/MPU Selector”标签页下,可以按照Flash/RAM大小,外设,封装,价格等条件来筛选符合应用需求的产品型号。对于人工智能的应用,可以使能AI筛选项后,选择要使用的神经网络模型,拓扑结构和压缩比,STM32CubeMX会计算大致需要的FLASH和RAM大小,同时在右侧的列表栏中列出满足要求的MCU型号。从STM32CubeMX5.5版本开始,“MCU/MPU Selector”标签页中,不再包含图形应用MCU选型工具,中间件中也不再包含“Graphics”项。TouchGFX Generator以X-CUBE-TOUCHGFX插件的形式集成到STM32CubeMX中,可以根据最新的STM32Cube固件库以及用户所选的图形设置和开发环境生成自定义的项目。
•从选择MCU开发板开始
在“Board Selector”标签页下,可以按照开发板类型,板载MCU/MPU的系列,MCU/MPU支持的外设和Flash/RAM大小选择某个开发板,新建一个基于该开发板的STM32CubeMX工程。STM32CubeMX将自动根据该开发板默认硬件配置,初始化对应的外设。比如,Nucleo-H743ZI板上默认用到了以太网接口,那么选择Nucleo-H743ZI板后新建的STM32CubeMX工程默认就已经配置好了以太网外设。
•从选择例程开始
在“Example Selector”标签页下,可以通过各个过滤项,来选择一个运行在某个具体开发板上的例程来创建一个工程。比如,选择运行在Nucleo-H743ZI板上的GPIO-EXTI例程后,STM32CubeMX可以自动帮你生成IAR,KEIL或者SW4STM32工程,直接编译就可以运行。从6.0.0版本开始提供该功能。
•从MCU交叉选择器开始
在“Cross Selector”标签页下,可以帮助开发者找到能够替换当前使用的MCU/MPU的STM32产品。并且可以选择多个型号进行比较。
4,例程选择器
以选择一个例程的方式来新建STM32CubeMX工程,是CubeMX V6.0.0推出的新功能,下面我们就来了解一下这个新功能。该功能将STM32Cube库里的例程,集成进了STM32CubeMX,用户可以在“Example Selector”标签页,通过左边一栏的过滤项,选择一个可以运行在指定开发板的例程,STM32CubeMX就可以帮我们创建该例程对应的IDE工程。对于部分例程还会创建对应的CubeMX工程(.ioc),用户可以基于STM32CubeMX工程进一步修改或者增加其他外设的配置。
下图是“Example Selector”标签页的界面,左边的过滤项栏,包括两大部分:第一部分是开发板相关的过滤项,有开发板类型和MCU系列的选择;第二部分是工程相关的过滤项,有IED的选择,工程类型选择(外设例程,应用例程和开发板的Demo。这三个类型分别对应STM32Cube库中Project下的Example,Applications和Demonstrations目录下的例程),以及中间件和外设驱动库的选择等。
右下方是满足当前设定条件的所有例程的列表,当选中某个例程后,在右上方就会显示对该例程的描述,需要的STM32Cube库版本,以及对应开发板的文档链接。点击例程列表第一列的五角星图标,还可以将该例程加入收藏,方便下次调出。
下面,我们将举例说明如何创建一个运行在Nucleo-H743ZI开发板上的GPIO_EXTI例程。
进入“Example-Selector”后,首先通过设定过滤项来缩小选择范围。我们通过关键字指定要搜索的是GPIO例程,并指定开发板类型为Nucleo-144,板载MCU为STM32H743ZI。然后在右侧的列表中就可以看到只有两个满足条件的例程,其中有一个GPIO_EXTI例程。
选中该例程,再点击上方的“Start Project”。
在STM32CubeMX创建工程的过程中,会跳出一个对话框,在该对话框里可以设置创建工程时需要使用的Cube库的源文件位置(一般使用Cube库默认安装的位置)和目标工程的路径,这里我们都使用它的默认设置,然后点击“OK”。
工程创建成功后,会跳出工程创建成功的对话框,并且在该对话框的下拉列表中显示:已经创建好IAR,KEIL和SW4STM32三个IDE工程(下拉菜单中的“explorer”指仅打开所创建的工程目录)。可以任选一个打开,我们选择IAR(EWARM)工程,点击OK,就会自动打开对应的IAR工程了。
对于一些较新的产品系列,CubeMX在创建所选择的例程时,还会创建STM32CubeIDE的工程,以及STM32CubeMX工程。可以直接打开创建好的STM32CubeMX工程,在其之上修改或添加其他功能。
是否支持同时创建STM32CubeMX工程,可以通过例程说明中的STM32CubeMX版本一项看出,如果标有具体的STM32CubeMX版本,则说明最后会生成STM32CubeMX工程,否则就不会生成STM32CubeMX工程。
5,CAD资源视图
SM32CubeMX CADT资源视图可帮助用户快速访问和下载1个或多个设计工具的Symbol原理图符号,PCB封装和3D模型。这个功能需要STM32CubeMX保持网络连接。
可以通过Help>Updater settings打开STM32CubeMX 更新设置窗口进行网络配置和检查连接。
CAD资源可以通过MCU选择器窗口或者STM32CubeMX Project页面进入。
通过MCU选择器窗口访问
1.从STM32CubeMX homepage打开MCU选择器
2.选择一个MCU型号(市场状态不能为“Coming soon”)
3.选择CAD Resources选项卡查看CAD资源
4.使用滚动条拉低页面,查看不同的资源视图(Symbol原理图符号,PCB封装和3D模型)
5.选择设计工具类型
6.选择CAD格式
7.同意条款
8.点击下载
9.选择下载路径
通过STM32CubeMX Project视图访问
1.打开一个STM32CubeMX工程2.从Tools面板打开CAD选项卡进行访问
Symbol视图反映了STM32CubeMX工程的引脚配置、可选功能及标注命名。下载后的CAD资源将和这些信息一致。
在STM32CubeMX的Pinout 中如果更改了管脚的名称,在对应的Symbol中也会对应修改,需要在最后下载之前点击refresh symbol previews更新一下, 再下载的内容就是修改之后的了。
6,引脚配置
通过前面所说的几种方式,创建一个新的STM32CubeMX工程后,就会打开下图中的这个配置窗口。配置窗口有四个标签页分别是:“pinout&Configuration”,“Clock Configuration”,“Project Manager”,“Tools“。
在” pinout&Configuration“标签下,可以使能需要的外设,并进行配置;“Clock Configuration”页提供了图形化的时钟配置工具;在” Project Manager“页可以对要生成的工程进行配置;”Tools “标签页提供了功耗评估工具,可以根据添加的运行模式及持续时间,计算出系统的平均功耗以及电池的寿命。此为理论计算值,可作为产品设计的参考。下面我们就来逐个了解其功能。
我们先来看一下“Pinout&Configuration”标签页,在该标签页的左边一栏,所有的外设被分成:系统内核,模拟,定时器,通信,多媒体,安全和计算几个组进行显示。比如,点开通信(connectivity)这个组,就可以串口,I2C这些外设。
freeRTOS, FATFS等协议栈在Middleware分组下。右边默认显示的一个MCU的引脚分配图,在左边栏使能了某个外设后,STM32CubeMx便会自动为这些外设分配管脚,并该图对应的引脚标记为绿色。也可以直接在这个引脚分配图中点击要配置的管脚,在下拉列表中手动为管脚选择功能。
7,时钟树初始化
在“Clock Configuration”标签页面,我们看到的是整个MCU的时钟树结构,包括系统的时钟源有哪些,时钟路径,分频和倍频过程等。
在这里,我们可以配置系统工作时钟和各个外设的时钟。如果使用PLLCLK作为系统时钟源,设置好HCLK总线时钟频率后,STM32CubeMX会自动计算分频因子。时钟配置异常时,还会有错误提示。
8,外设配置
在“Pinout&Configuration”标签页选中某个外设后,右侧就会出现对应的配置界面,可以对外设的运行参数,DMA和中断进行配置。比如图中的USART3,首先选择工作模式为异步(Asynchronous)模式,然后在下方的参数配置栏中,对波特率,数据长度,奇偶校验,停止位以及其他一些高级参数进行设置。
在”NVIC Setting”, “DMA Setting”标签页下,还可以设置中断和使能DMA。“GPIO Setting”标签页下可以看到当前分配给该外设的引脚以及配置情况。
左侧外设列表中,通过不同的颜色和图标提示当前外设的配置情况:绿色的对勾表示当前外设的所有参数已经配置完成,紫色的交叉图标,表示配置尚未完成。橘黄色的感叹号图标,表示由于引脚冲突等原因,当前外设至少有一个模式不可用。而紫色的禁止图标,表示当前外设的所有模式都不可用。
9,中间件配置
在“Pinout&Configuration”标签页的“Middleware”中,用户可以选择需要使用的中间件并进行配置,比如FreeRTOS,以太网协议栈Lwip,USB协议栈,文件系统等。
有可能你会看到某些中间件处于不可选状态,这是因为这些中间件的使用和一些硬件外设相关,需要先使能这些外设。将鼠标移到想使能的中间件名称上面,稍等几秒,就会出现一个灰色的文字框,其中就包含了需要使能哪些外设的提示。
10,LPBAM配置
在新的STM32CubeMX中,STM32U575/585产品线的工程下用户可以选择性的使用LPBAM Scenario&Configuration 界面创建LPBAM应用。通过这个界面用户可以:
添加或移除LPBAM应用
针对任意一个LPBAM应用,创建序列
针对任意一个序列,使用在Smart Run Domain下外设LPBAM 固件API创建功能节点
针对任意一个LPBAM应用,对Smart Run Domain下外设进行引脚、时钟树、HAL相关的配置
11,FreeRTOS配置
通过STM32CubeMX FreeRTOS配置窗口,用户可以配置一个实时操作系统应用所需要的所有资源并预留对应的堆栈资源。使用CMSIS-RTOS API函数定义和生成FreeRTOS相关部件。配置流程如下:
a.在Pinout&Configuration选项卡下,点击FreeRTOS打开Mode 和Configuration页面
b.在Mode面板内使能 FreeRTOS
c.在Configuration面板内配置FreeRTOS的原生参数等,比如任务,定时器,队列和信号量。在Config选项卡下配置内核和软件参数。在Include parameters选项卡下,选择应用需要的API函数,通过该方法可以优化代码大小。Config选项卡和Include parameters选项卡下的参数都是FreeRTOSConfig.h文件的一部分。
d.点击其他选项卡分别对FreeRTOS的任务,队列,定时器,信号量,堆栈等进行配置。
12,Thread-Safe配置
无论是前后台或者是基于RTOS的系统都可能在调用C库函数时存在线程安全Thread-Safe问题,例如下图对malloc()函数的调用。该类问题出现时,公用资源例如RAM数据出现冲突而应用程序仍能在一段正常运行后才出现问题。对工程师而言,难以调试,也难以查找到根本原因。STM32CubeMX针对EWARM, MDK-ARM和STM32CubeIDE工具链提供了对应的Thread-Safe解决策略,可以直接配置完成。
在Project Manager Settings tab选项卡下,Thread-safe Settings区域可以进行配置,如下图所示。适用于所有STM32 MCU,支持的IDE是EWARM,MDK-ARM和STM32CubeIDE,选中其他IDE时,则该区域灰色显示,不可配置。
13,代码生成
所有的参数配置完成后,就可以让STM32CubeMX来生成初始化的工程了。
在”Project Manager”标签页下,有三大类配置,分别在三个子标签页下。在“Project”页下,可以设定项目名称,项目位置,选择工具链和固件版本等;在“Code Generator”页下,可以设置生成代码的相关选项,比如是否拷贝相关的库文件,重新生成代码时,如何处理之前生成的文件等;
在“Advanced Settings”页面下,可以对要生成的初始化代码做进一步的设置,比如使用HAL还是LL驱动,生成的初始化代码是否是静态函数,是否在主函数里调用等。
所有的参数都设置好后,点击“GENERATE CODE”,STM32CubeMX就开始创建工程了。
下面我们来看一下在“Project Manager”标签页下需要注意的一些配置项。
1. 选择不同的项目结构
“Project”页的“Application structure”项可以设置两种不同的项目工程文件结构。
“Basic”结构:适合没有使用中间件或者只使用了一种中间件的项目。用户代码分为Src和Inc两个文件夹,和IDE文件夹位于同一层,这种结构跟Cube库中的例程的文件结构类似。
“Advanced”结构的构成如下图中所示,用户应用逻辑代码放在Core文件夹下,每个中间件的适配文件各自放在独立的文件夹内(比如图中的USB_HOST),并分为和硬件平台相关的Target部分以及和应用相关的App部分,这种结构适合使用了多个中间件的项目,使得项目的集成更加容易。
2. 选择不同的Cube库版本
STM32CubeMX生成工程的时候,默认会使用当前最新的Cube库。如果想使用不同的Cube库版本,可以取消勾选“Use Default Firmware Location”,然后,点击Browse,在本地电脑中选择另一个版本的Cube库。
3. 设置代码相关选项
下图是“Code Generator”标签页的默认设置。
STM32CubeMX默认会将Cube库中HAL文件夹的所有文件,和使用到的中间件文件都拷贝到用户项目中。如果不想拷贝这么多文件,可以选择“Copy only the necessary library files”,让STM32CubeMX仅拷贝必须的文件,比如用户代码只用到了SPI,就只拷贝HAL文件夹中的SPI驱动文件。甚至可以选择“Add necessary library files as reference in the toolchain project configuration file”,不拷贝任何文件,仅建立和Cube库中文件的链接。
在STM32CubeMX生成的工程中,添加用户自己的代码,必须将代码放在由/*USER CODE BEGIN */和/* USER CODE END */标识的用户代码区,这样当再次通过STM32CubeMX生成代码的时候,用户添加的代码才不会被清除,并且一定要保证“Keep User Code when re-generating”项处于勾选状态。
通过“Generate peripheral initialization as a pair of .c/.h files per peripheral”可以选择是否将所有外设初始化的代码放在一个文件,还是分开放在独立的.c/.h文件。
当修改配置后重新生成工程时,默认会删除不再需要的文件,也可以通过取消勾选“Delete previously generated files when not re-generated”,在下次重新生成工程时,保留这些文件。
为了优化系统的功耗,我们一般建议将MCU未使用的GPIO口初始化为模拟输入,在STM32CubeMX中,可以通过勾选“Set all free pins as analog to optimize power consumption ”,让其自动生成这部分代码。
4. 高级设置
STM32Cube库里提供有HAL和LL两类底层驱动接口,HAL驱动的移植性更好,但代码量大,而LL驱动提供高度优化,寄存器层面的访问,代码量小,效率高。使用LL驱动接口需要密切结合用户参考手册,与底层硬件结合度高,移植工作量也会增加。这两类驱动接口,可以在“Advanced Settings”标签页下进行选择。
在该标签页下,还列出了STM32CubeMX将会生成的初始化函数,可以在这里设置是否将该函数定义为静态函数,是否在main函数中调用该初始化函数。
在最右边一列中,还可以设置是否使用某个外设的callback函数,如果设置为enable,则stm32xxxx_hal_conf.h 文件中对应的宏定义为1。
14,功耗计算
STM32CubeMX还有一个有用的功能:功耗评估。在”Tools-PCC“标签页下,功耗评估工具页面中:选择电池的容量,添加运行模式及持续时间,CubeMX将会计算出系统的平均功耗以及电池的寿命。此为理论计算值,可作为产品设计的参考。