一、概述
无论是新手还是大佬,基于STM32单片机的开发,使用STM32CubeMX都是可以极大提升开发效率的,并且其界面化的开发,也大大降低了新手对STM32单片机的开发门槛。
本文主要面向初次接触STM32CubeMX的同学,大佬们可以跳过直接看单独的外设篇章。
二、软件说明
STM32CubeMX是ST官方出的一款针对ST的MCU/MPU跨平台的图形化工具,支持在Linux、MacOS、Window系统下开发,其对接的底层接口是HAL库,另外习惯于寄存器开发的同学们,也可以使用LL库。STM32CubeMX除了集成MCU/MPU的硬件抽象层,另外还集成了像RTOS,文件系统,USB,网络,显示,嵌入式AI等中间件,这样开发者就能够很轻松的完成MCU/MPU的底层驱动的配置,留出更多精力开发上层功能逻辑,能够更进一步提高了嵌入式开发效率。
演示版本 6.7.0
三、下载链接
官网链接:https://www.st.com/zh/development-tools/stm32cubemx.html
百度网盘链接:https://pan.baidu.com/s/1HsHTmnJPZMZD1reCkMiXew?pwd=eq5j
提取码:eq5j
四、软件使用
安装软件后双击打开软件,界面比较清晰,主要功能都放主界面上了。
New Project:新建工程,可以根据芯片型号、开发板类型、例程建工程。
Manage software installaions:软件包安装,"CHECK FOR UPDATES"是用于更新软件自身,"INSTALL/REMOVE"是用于芯片包的安装和移除(跟Keil一样,需要哪个系列的芯片就安装哪个芯片包)。
About STM32 & External Tools:前者是给ST自己打广告的,后者就是ST的一个工具生态链,一些相关工具可以在里面看到,比如ST的IDE工具——STM32CubeIDE。
我们先选择根据MCU型号新建一个工程。
-最上方可以切换MCU、开发板或例程。
-左边是一个搜索框,可以根据芯片型号直接搜索,也可以通过芯片资源或芯片信息来找到合适的芯片。
-右下则是具体的芯片型号及一其基本信息,搜索结果也会在这里体现,选中并双击芯片型号即确认并新建工程。
-右上的框是在选中芯片后,会显示芯片的一些具体信息。
新建一个工程,因为我手头上只有一块STM32F072RB的开发板,所以这里选这个芯片。
新建完工程后,根据选择的芯片型号,主界面会显示对应的芯片及其引脚分布。
每个引脚可以单独选择对应的功能,哪些端口能配哪些外设,这里面都可以直观地看出来,不用再去查芯片手册,省了不少时间。配置好一个功能后,引脚颜色会变绿色。如果选完功能后引脚变黄色(比如配置了定时器的某个通道),这说明功能配置不完全,需要到左边的外设窗口进行详细配置。
左边窗口对芯片外设做了一些分类,点击对应的外设,可以在详细配置的窗口中进行功能配置。
System Core:系统及内核相关的配置,比如系统时钟、GPIO、中断、内部看门狗等。
Analog:模拟量相关的外设,比如ADC、DAC、比较器等。
Timers:定时器相关的外设,比如定时器、RTC等。
Connectivity:通信相关的外设,比如I2C、SPI、UART等。
Multimedia:多媒体相关的外设,比如I2S、HDMI等。
Computing:算法相关的外设,比如硬件CRC等。
Middleware:中间件,比如FreeRTOS、FATFS等。
切换时钟配置窗口(Clock Configuration),可以对单片机的时钟树进行直观地配置,这里最方便的就是,修改主频后,工具会自动算出其他所有外设的时钟配置。如果需要对某个外设时钟进行分频处理,可以单独设置。
在生成工程代码之前,先进入工程配置界面(Project Manager)对工程进行一些配置,比如设置工程的路径,以及需要生成什么IDE的工程。另外针对于每一个外设,可以自主选择使用LL库或是HAL库。
配置完成后,点击"GENERATE CODE"生成工程及代码。在生成的工程里添加自己代码时需要注意一点,生成的代码里有很多"USER CODE BEGIN"和"USER CODE END"的备注,这些其实是提醒你应用代码要写在这个区间内,这样工具在重新生成工程时,可以通过识别这些备注进行选择性覆盖,避免每次改完配置又得重新键入应用代码。
查看工程文件.ioc的目录下,多了一个完整的工程,打开工程编译,是可以直接编译通过的。
至此,STM32CubeMX这个工具的一些常规使用功能就介绍完了,想了解具体外设的配置,请移步独立的外设篇章。
五、注意事项
1、配置完外设后,无论生成HAL库还是LL库的代码,基本都只是给你初始化好外设,但实际使能或者打开中断,则需要自己来操作。HAL库一般可能只需要调一个启动接口就行(不同外设有不同操作,不可一概而论),LL库则需要操作的寄存器会多一些,可以参考HAL的实现来操作和理解。
2、自动生成的代码也不完全是没问题的,要留点心眼。就比如之前遇到过,F103的芯片,配置ADC用DMA传输时,因为生成的代码ADC和DMA的初始化顺序反了,导致初始化出现异常。
3、添加应用代码时,尽量添加在工程代码里备注着用户代码起始到结束的区间内,这样后面使用CubeMX修改配置重新生成工程时,不会覆盖自己添加的应用代码。
六、相关链接
STM32CubeMX-Uart配置
STM32CubeMX-GPIO配置
STM32CubeMX-外部中断配置
STM32CubeMX-ADC配置
STM32CubeMX-CRC配置
STM32CubeMX-定时器定时配置
STM32CubeMX-定时器输入捕获配置
STM32CubeMX-定时器比较输出配置
STM32CubeMX-I2C配置
STM32CubeMX-SPI配置
STM32CubeMX-NandFlash/FMC总线配置