STM32CubeMX 新建工程详细步骤
1.MPU/CPU选择
step1: 打开CubeMX 软件, 在主页面上 点击如下按钮,进入芯片选择界面
step2: 在Part Number Search 栏搜索我们需要用到的芯片型号,比如这里我们选择 STM32F103C8
选中某一型号时,会在页面右边显示该芯片的详细参数和信息,其中 Features 可以查看该芯片的具体特点和外设, 还可以点击Datasheet 下载数据手册。在芯片选择页面的右下方有芯片的信息概要,比如这里包括该型号芯片的 引脚疯转,Flash, Ram, IO 数量, 主频等基本信息。确定了芯片型号之后,双击上图中我们选择的芯片,进入工程配置界面。
2.片内外设配置
在工程配置页面中有外设配置,时钟配置,和工程配置。这里我们先讲解如何配置这些片内外设CubeMX STM32所有外设都进行了分类,比如这里的 STM32F103C8T6 的所有外设就被分成了一共6类:系统内核、模拟、定时器、通信、计算、中间件.
上面的片内外设用户需要根据自己项目的使用情况而进行选择配置,但是对于绝大部分的项目来说 ,都需要配置时钟:
系统内核中的 RCC&SYS 项都必须要进行设置
RCC配置,如果需要用 LSE / HSE 就需要在这进行配置
SYS配置, 关于 debug 口子的配置,默认它是认为我们不需要 debug 口的,所以如果不更改的话生成代码下载进去后 debug 口就关闭了。
注意: STM32CubeMX 使用的 HAL 库有一个 delay 接口默认是使用 SysTick 定时器来实现的,如果我们选用了 FreeRTOS,它使用的心跳时钟在 Cortex 内核上的移植都是依赖于 SysTick 定时器,这里就会有冲突,这一点在点击生成代码按钮时 STM32CubeMX 也会发出警告,这里最好就把 HAL 库定时器使用的时基修改为 TIMER1 - TIMER4中的任一就行。
芯片引脚配置
一般根据需要对GPIO口进行相应配置,GPIO可配置为一般输入输出,复用为其他引脚功能等。绿色表示配置完成,橙色表示待配置。
3.时钟配置
选中时钟配置栏,进入时钟配置界面
首先我们在这里对单片机的系统时钟源做一个简单的解释,对于STM32来说总共有4个时钟源。
STM32的四个时钟源高速外部时钟(HSE):外部时钟源,晶振频率可取范围为4~16MHz,我们一般采用8MHz的晶振。低速外部时钟(LSE):外部时钟源,主要提供给实时时钟模块,所以一般采用32.768KHz。高速内部时钟(HSI):由内部RC振荡器产生,频率为8MHz,但不稳定。低速内部时钟(LSI):由内部RC振荡器产生,也主要提供给实时时钟模块,频率大约为40KHz。
对于单片机的系统主时钟。我们一般选用高速时钟 HSE或者HSI(系统默认), 上图中时钟配置为 HSE,HSE时钟配置流程主要分为以下几步:
1)HSE直接分频后作为 PLL Source Mux选择器的输入 ,
2)之后通过锁相环 9倍频 后输入到 System Clock Mux
3) System Clock Mux 直接输出得到系统主时钟 SYSCLK 72Mhz
4) SYSCLK 经过分频器得到高速时钟 HCLK (这里分频系数为1 所以HCLK也为72MHZ)
5) HCLK 后面又分为了5条路径
- a.直接作为 AHB总线时钟,作为 内核,内存,DMA等的时钟
- b. 分频后作为 Cortex 系统定时器的时钟源
- c.直接作为 FCLK时钟
- d.分频后作为 APB1总线的时钟 (包括分频后 作为APB1外设时钟 也叫做PCLK1 , 分频后再倍频作为 APB1总线上定时器的时钟)
- e.分频后作为 APB2总线的时钟 (包括分频后作为APB2外设时钟 也叫做PCLK2, 分频后再倍频作为APB2总线上定时器的时钟, 以及分频后再分频作为ADC的时钟)
通过上面配置就完成了从 HSE 到 系统主时钟全部过程的配置, 若板子上面没有提供外部高速晶振,我们就只有使用内部高速晶振了,其配置过程的原理也是类似的,这里就不再赘述了。
如果项目中还用到了 RTC,IWDG等外设,那就还需要另外配置低速时钟。至此我们时钟配置也就基本完成了。
4.工程管理器
最后通过工程管理器 Project Manager 来对整个CubeMx工程来进行最后的配置
STM32CubeMX的 Project Manager工程管理器包含:Project 工程管理、Code Generator 代码生成、Advanced Settings 高级设置。
4.1 Project
Project工程管理包含三部分内容:
Projcet Settings工程设置、
Linker Settings堆栈设置、
Mcu and Firmware Package MCU和固件包信息。
4.1.1 Project Setting
- A.Project Name:工程名称比如:MotorControl.uvprojx,以及对应工程里面目标名称。
- B.Project Location:工程存放路径这个容易理解。如:E:\Proteus
- C.Application Struture:应用程序结构这里包含两个选项:Basic 和 Advanced。Basic:是基础的结构,一般不包含中间件(RTOS、文件系统、USB设备等)。Advanced:相反就是包含中间件,一般针对相对复杂一点的工程。当然,这两种生成的结构都比较基础,一般实际项目都会重新整理一遍软件架构。
- D.Toolchain Folder Location:工具链文件夹路径这个是根据上面Project Name和Project Location得出来的,用户不能修改。
- E.Toolchain/IDE:工具链选择·EWARM ,MDK-ARM和TrueSTUDIO,STM32CubeIDE,Makefile等,如果配合使用Keil IDE,此处就选择MDK-ARM。
4.1.2 Linker Setting
这里的选项一看就明白,主要就是堆和栈大小的设置,默认缺省值:Heap堆为0x200,Stack栈为0x400.
4.1.3 Mcu and Firmware Package (MCU和固件包信息)
这里有三个选项,关于MCU类型和固件包版本信息,一般默认配置。
- A.Mcu Reference:MCU参考型号这个是根据你选择的MCU型号决定的,用户不能修改。
- B.Firmware Package Name and Version:固件包名称和版本信息这个容易理解,如:STM32Cube_FW_F1_V1.8.4.
- C.Use Default Firmware Location:使用默认固件包这里勾选上就会根据系统进行默认匹配固件包,一般建议默认。当然,不勾选,可以自己选择指定固件包。
4.2 Code Generator
如上图,主要包含四项内容:固件包拷贝、生成文件、HAL设置、模板设置。
4.2.1 STM32Cube Firmware Library Package固件包拷贝
- 1.Copy all used libraries into the project folder 将所有使用过的库复制到项目文件夹中不管你用,还是没有用到,都拷贝到你工程目录下。这样一来,你工程下文件就比较多,不建议使用。
- 2.Copy only the necessary library files 只复制必要的库文件。这个相比上一个减少了很多文件。比如你没有使用CAN、SPI…等外设,就不会拷贝相关库文件到你工程下。建议使用此项,这样工程路径改变不影响编译。
- 3.Add necessary library files as reference in the toolchain project configuration file 在工具链项目配置文件中添加必要的库文件作为参考。这里没有复制HAL库文件,只添加了必要文件(如main.c)。相比上面,没有Drivers相关文件。
4.2.2 Generated files 生成文件
这里可以多选,每项可选择:是or不是。
- 1.Generate peripheral initialization as a pair of’.c/.h’ files per peripheral 每个外设生成独立的’.c/.h’文件不勾:所有初始化代码都生成在main.c勾选:初始化代码生成在对应的外设文件。 如UART初始化代码生成在uart.c中。
- 2.Backup previously generated files when regenerating 在重新生成时备份以前生成的文件重新生成代码时,会在相关目录中生成一个Backup文件夹,将之前源文件拷贝到其中。
- 3.Keep User Code when re-generating 在重新生成时保留用户代码比如:我在main.c中添加了一段代码,重新生成时,会在main.c中保留你之前自己添加的这段代码。注意:前提是这段代码写在规定的位置。也就是BEGIN和END之间。否则同样会删除。
- 4.Delete previously generated files when not re-generated 删除以前生成,但现在没有生成的文件比如:之前生成了spi.c,现在重新配置没有spi.c,则会删除之前的spi.c文件
4.2.3 HAL Settings HAL库设置
- 1.Set all free pins as analog (to optimize the power consumption) 将所有空闲引脚设置为模拟(以优化功耗)这个做低功耗产品时这个选项有必要勾选。
- 2.Enable Full Assert 使能所有断言
4.2.4 Template Settings模板设置
1.Select a template to generate customized code
选择一个模板来生成自定义代码代码自定义生成模板。
第一项和第二项设置好,其他一般默认选项。
4.3 Advanced Settings
目前暂时只有两个选项:驱动选择和调用函数设置
4.3.1 驱动选择
目前主要就是针对工程中使用到的外设,选择HAL还是LL驱动(参看上图)。 提示:目前有些型号MCU的部分外设没有LL驱动。
注:ST公司提供了一套固件库函数包括ST标准库、LL库和HAL库,ST公司主推HAL库。
- ST标准库:ST官方首先推出对底层寄存器封装的库,库思想是面向过程的,仅对寄存器进行了一层封装操作,适于初学STM32的人群。
- LL库:操作底层硬件的库,配合CubeMX开发,适于追求效率需要加快开发周期的人群。(新推出,配合HAL库,可以认为是ST库移植到Cube下的实现。)
- HAL库:面向对象的,操作抽象层的,经过多层封装对功能进行集成,对硬件要求不高,适于开发应用人群。
4.3.2 调用函数
主要关心后面两个选项:Not Generate Function Call 和 Visibility (Static)。
- a. Not Generate Function Call不生成函数调用也就是你代码不调用对应初始化函数。比如:你GPIO项勾选Not Generate Function Call,你main.c函数中就不会调用MX_GPIO_Init这个函数。
- b. Visibility (Static)可见性(静态)这个就是初始化代码声明为static。
注意:A.有些选项是是默认值,不能修改。如SystemClock_Config配置不声明为ststic.
B.使用static是配合上面Code Generator代码生成章节中Generated files生成文件使用。如果都生成.c .h独立文件了,就不会生成static了。
参考:https://xw.qq.com/cmsid/20211108A05SFS00