2、开发环境搭建:STM32CubeIDE安装、固件包获取、第一个LED工程

好,咱们正式开始动手了。

这一章我带你搭好开发环境。说白了,就是装好软件、拿到固件包、然后点亮一个LED。别小看这一步,我见过太多人卡在环境上,折腾半天连个灯都点不亮。咱们稳扎稳打,一步步来。

2.1 STM32CubeIDE安装——别选错版本

STM32CubeIDE是ST官方的一站式IDE。它集成了编辑器、编译器、调试器,还内置了CubeMX配置工具。我个人习惯用这个,省事。

下载地址:去ST官网搜“STM32CubeIDE”,找到对应你操作系统的版本。

安装要点

  • Windows用户记得勾选“添加环境变量”。我一开始没勾,后面命令行编译总报错,折腾了半天。
  • Linux用户注意权限问题。我曾经在Ubuntu上装完打不开,后来发现是缺少libgtk-3-dev库。
  • Mac用户?嗯,我建议你还是用虚拟机吧。ST官方对Mac的支持一直不太上心。
⚠️ 注意:安装路径不要有中文或空格。我有个学员路径写了“我的项目”,结果编译死活过不去,最后发现是编码问题。

安装完成后,第一次启动会提示你选择工作空间(workspace)。我建议单独建一个文件夹,比如 D:\STM32Workspace。别放桌面,也别放C盘。

2.2 固件包获取——版本匹配很重要

固件包就是ST官方提供的HAL库和中间件。咱们做STM32U5,需要下载对应的固件包。

获取方式有两种

  1. 在线下载:在CubeIDE里新建工程时,它会自动检测并下载。但速度嘛……你懂的。
  2. 离线包:去ST官网搜“STM32CubeU5”,下载最新版本。我建议用这个,一次下载,到处使用。
💡 我的经验:固件包版本一定要和IDE版本匹配。我曾经用CubeIDE 1.12配了旧版固件包,结果HAL库函数签名对不上,编译报了一堆错。后来老老实实全更新到最新版。

下载完成后,解压到某个固定目录。比如 D:\STM32Cube\Repository。然后在CubeIDE里设置路径:

Window → Preferences → STM32Cube → Firmware Updater
→ 添加本地仓库路径

嗯,这一步很多人会忘。你想想看,每次新建工程都去在线下载,多浪费时间。

2.3 第一个LED工程——从零开始

好,环境搭好了,咱们来点实际的。点亮一个LED,这是嵌入式界的“Hello World”。

步骤一:新建工程

File → New → STM32 Project
→ 在Board Selector里搜索“STM32U5”
→ 选择你手头的开发板型号(比如NUCLEO-U575ZI-Q)
→ Next → 输入工程名(比如“LED_Blink”)
→ Finish

这里要注意,如果你用的是自己画的板子,就选“Empty Project”,然后手动选芯片型号。我刚开始做项目时,就吃过这个亏——选了开发板型号,结果引脚对不上。

步骤二:配置引脚

工程创建后,会自动打开CubeMX的图形化配置界面。咱们要做的:

  1. 在Pinout视图里,找到LED对应的引脚。NUCLEO-U575上,LED是PB14。
  2. 右键PB14,选择 GPIO_Output
  3. 在左侧 System Core → GPIO 里,配置输出模式为 Push-Pull,速度选 Low
🔑 关键点:STM32U5的GPIO默认是模拟模式。你如果不手动改成输出模式,代码里怎么拉高拉低都没用。我有个同事就因为这个,查了一下午的bug。

步骤三:生成代码

点击右上角的 Generate Code。CubeIDE会帮你生成初始化代码。你只需要在 main.cwhile(1) 循环里加几行:

/* 用户代码开始 */
while (1)
{
  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
  HAL_Delay(500);  // 延时500ms
}
/* 用户代码结束 */

注意看,LED_GPIO_PortLED_Pin 是CubeMX自动生成的宏定义。你不需要自己记引脚号。这就是用CubeMX的好处。

步骤四:编译与下载

  1. 点击工具栏的锤子图标(Build),编译工程。第一次编译会慢一些,因为要编译整个HAL库。
  2. 连接开发板,点击绿色的虫子图标(Debug),或者直接点Run。
  3. 如果一切顺利,你会看到板子上的LED开始闪烁。
⚠️ 常见问题:下载时提示“No ST-Link detected”。别慌,检查一下:
  • USB线是不是数据线?有些线只能充电。
  • 驱动装了没?Windows下需要装ST-Link驱动。
  • 板子上的跳线帽是不是正确?NUCLEO板默认是好的,但自己画的板子要检查。

2.4 避坑指南——我踩过的那些坑

做这个实验,有几个地方容易出问题。我一个个说:

  • 引脚配置错误:我刚开始用STM32U5时,以为GPIO默认就是推挽输出。结果灯死活不亮。后来才发现,U5的GPIO复位后是模拟模式。你想想看,模拟模式下引脚既不输出高也不输出低,灯怎么会亮?
  • 时钟配置不对:如果你用的是外部晶振,记得在CubeMX里把HSE使能。我有个项目,板子上的LED闪得特别慢,查了半天发现是HAL_Delay的时钟源没配好。
  • 优化等级太高:调试阶段,我建议把优化等级设为 -O0。曾经我把优化开到 -Os,结果HAL_Delay被优化掉了,LED一直亮着不闪。嗯,从那以后我调试时都用 -O0
💡 小技巧:如果你手头没有开发板,也可以用Proteus或QEMU仿真。但说实话,仿真和实物还是有差距的。我建议有条件还是上真板子。

2.5 验证与调试——灯亮了然后呢?

LED闪烁了,恭喜你,环境搭建成功了。但咱们不能止步于此。我建议你做几个小实验:

  • 改变延时时间,看看闪烁频率的变化。
  • 用逻辑分析仪抓一下PB14的波形,看看是不是精确的500ms。
  • 试着用按键控制LED的亮灭(下一章会用到)。

这些实验能帮你熟悉CubeIDE的调试功能。比如设置断点、查看变量、单步执行。我刚开始做嵌入式时,就是靠这些基本功一点点积累起来的。

好,这一章就到这儿。下一章咱们开始接触TrustZone——这才是STM32U5的真正亮点。