如何创建一个新的 STM32CubeIDE 项目

在 STM32CubeIDE 中创建一个新项目的最简单方法是使用 STM32 project wizard 。在默认情况下,这个工具会设置一个 STM32Cube 项目,其中包括几个驱动程序文件、系统文件和一个 .ioc 文件(即代码生成设置可通过集成的 STM32CubeMX 编辑器进行配置)。如果出于某种原因,开发人员希望从空白画布开始,他们可以创建一个空项目,其中只包含启动和运行 MCU 所需的文件。这些文件包括链接器脚本、启动代码和一个基本的 main.c 文件。

虽然在 STM32CubeIDE 中创建空白项目非常简单,但除非添加一些额外的驱动程序,否则很难在其中生成任何高质量的代码。至少,应该下载与目标设备相对应的 CMSIS 头文件,并将其包含在项目中,以提供设备的寄存器定义。在下面的程序中,选择 STM32L152RE MCU 作为目标 MCU 进行演示。但是,此程序将适用于 STM32家族 的任何成员。

创建一个空白项目

  1. 在 STM32CubeIDE 中,选择“File>New >STM32 Project ”。

  2. 使用目标选择器选择目标 STM32 设备。在本例中,从列表中选择 “STM32L152RE” 设备(可以使用MCU/MPU Selector 选项卡中的搜索栏轻松找到它)。单击 Next

  3. 为项目命名并将 Targeted project Type 更改为 Empty ,如图1所示。单击 Finish


1 : 使用 STM32 项目向导创建一个空白的 STM32 项目

添加 CMSIS 头文件

从技术上讲,这一步是可选的,因为此时项目将编译得很好。然而,如果没有任何额外的驱动程序和/或寄存器定义,编程器将被限制使用硬编码地址进行寄存器级编程,如下所示:

/* Set output pin PA5 high */
*((uint32_t*)0x40020014) |= (1 << 5);

显然,这不会产生高质量的代码,因为它是不可理解的、不可移植的、不可维护的。虽然编程器可以手动创建每个寄存器地址和位字段的定义,但这些已经在 STM32Cube MCU 包中提供的 CMSIS 头文件中提供。将这些头文件包含在项目中,可以将寄存器级代码写成如下方式:


/* Set output pin PA5 high */
GPIOA->ODR |= GPIO_ODR_ODR_5;

注意:对于每个STM32 MCU系列(STM32F4, STM32G0, STM32L1等),可以从ST网站和STGitHub存储库下载相应的MCU包。

这样的代码在不牺牲性能效率的情况下加强了前面提到的质量属性。此外,包括CMSIS头文件还允许将STM32Cube LL和/或HAL驱动程序的元素包含在项目中,因为这些高级抽象层是建立在CMSIS定义之上的。

下面以 STM32L152RE 设备为例进行说明。显然,如果选择了不同的目标设备,那么下面提到的包含 “STM32L1” 文本的任何目录或文件实际上都引用了目标设备的相应资源。

  1. 首先从 ST 网站或STGitHub存储库下载项目目标MCU的STM32Cube固件包。将软件包提取或克隆到合适的目录。在本例中,将STM32Cube_FW_L1_V1.10.3 目录复制到C:\Users\Matt 目录。

  2. 在 STM32CubeIDE 中,在项目资源管理器中右键单击项目名称并选择 Import

  3. 选择 “General ”类别下的 “File System” 导入向导。单击 Next

  4. 在“从目录 ”文本框中填充提取固件包的路径。在本例中,路径为C:\Users\Matt\STM32Cube_FW_L1_V1.10.3 ,如图2所示。

  5. 通过文件浏览窗口选择需要导入的CMSIS文件。勾选“STM32Cube_FW_L1_V1.10.3/Drivers/CMSIS/Core/Include ”和“STM32Cube_FW_L1_V1.10.3/Drivers/CMSIS/Device/ST/STM32L1xx/Include ”目录旁边的复选框。窗口应该出现如图2所示。单击 Finish

image
2 :使用文件系统导入向导导入CMSIS头文件

注意:在这一点上,复制并粘贴STM32Cube_FW_L1_V1.10.3/Drivers/CMSIS/Device/ST/STM32L1xx/Source/Templates/system_stm32l1xx.c 文件也是一个好主意。虽然 STM32L152RE 设备没有严格要求,但利用硬件 FPU 的设备将需要其 SystemInit() 的定义 。HAL驱动程序也依赖于这个文件。

  1. 将导入的目录添加到项目包含路径列表中。在项目资源管理器中,右键单击每个 Include 文件夹并选择 Add/remove Include path ,如图3所示。在弹出窗口中,确保选中了 DebugRelease 配置,然后单击 OK

image
3 :将 Drivers/CMSIS/Core/IncludeDrivers/CMSIS/Device/ST/STM32L1xx/Include目录
添加到包含项目的路径列表中

  1. 使用项目资源管理器展开“Drivers/CMSIS/Device/ST/STM32L1xx/Include ”目录。双击名为“stm32l1xx.h 的文件打开。向下滚动以找到目标设备列表(图4),并确定哪一个对应于项目的目标设备。在这种情况下,它是“STM32L152xE”设备。


4 :stm32l1xx.h 文件识别的 STM32L1 设备列表

将此设备定义添加到项目符号列表中。在项目资源管理器中,右键单击项目名称并选择 Properties 。在“属性”窗口的左侧,导航到 “C/C++ General > Paths and Symbols”。在 “Symbols ” 选项卡中,单击 “Add ”,在 “Name ”文本框中输入定义(即STM32L152xE )。点击 OK ,确认符号现在出现在列表中,如图5所示。单击Apply and Close


5 :将目标设备定义添加到项目符号列表中

  1. 最后,在需要使用寄存器定义的源文件中添加 #include stm32l1xx.h ,并开始编码!

还是习惯使用Keil和Vscode开发,STM32CubeIDE这种基于Eclipse的个人感觉比较难用,不过插件丰富这一点还是挺不错的

感谢您分享的使用感受。能具体聊聊Eclipse比起Keil和Vscode,难用在什么地方吗?

STM32CubeIDE创建新项目基本上个人只有编辑ST的新芯片才会用到,主要一些配置文件不熟,兼容性不好

这个可以用ST公式的CubeIDE来轻松搭建工程范本,不过设计的时候主频及分频配置要合理。

STM32CubeIDE有时钟配置方框图,这样对时钟配置更加的直观,stm32需要配置时钟,就可以把不需要那些功能的功耗去掉,这样降低功耗。