平台:NUCLEO-H533RE(STM32H533RET6)|语言:C++
工具链:STM32CubeMX + CMake + VSCode
点灯是嵌入式的“Hello World”,却能把 建工程 → 读原理图 → 配时钟 → 写代码 → 下载调试 这条链路完整走一遍。本文沿用系列里的 C++ + CMake 开发方式,从空白工程开始,让 NUCLEO-H533RE 板上的绿色 LED 以 1 Hz 闪烁。
一、新建 CubeMX 工程
1.1 选择芯片
打开 STM32CubeMX,在 MCU/MPU Selector 中搜索 STM32H533RET6,确认右侧的封装、Flash、RAM 等信息后,点击 Start Project。

图 1:在 MCU/MPU Selector 中选中 STM32H533RET6(对应 NUCLEO-H533RE)
1.2 处理 TrustZone 提示
STM32H5 系列带 Arm TrustZone,新建工程时会询问是否启用安全隔离。本例不涉及安全分区,选择 without TrustZone activated,点击 OK。

图 2:TrustZone 选择“不启用”
1.3 保留 ICACHE / MPU 默认配置
紧接着会提示是否为 ICACHE 和 MPU 访问 OTP / RO 区域应用默认配置,直接点 Yes 即可,省去手动配置,性能也更好。

图 3:建议直接 Yes,启用默认的 ICACHE 与 MPU 配置
二、先读原理图,再动配置
配置外设之前,先确认两件事:LED 接在哪个引脚、外部晶振是多少。这两点都能在 NUCLEO-H533RE 的原理图里找到。
2.1 LED:PA5,低电平点亮

图 4:用户 LED(D2,GREEN)由 PA5 经三极管 Q1 驱动,低电平点亮
从原理图可以读出:
控制引脚是 PA5;
采用低电平点亮,PA5 输出低电平时 LED 导通;
相比高电平点亮,这种接法下 GPIO 以灌电流方式工作,驱动能力更好,LED 也更亮。
因此 PA5 的初始电平应设为高:复位后 LED 保持熄灭,等程序里主动拉低再点亮。
2.2 外部晶振:24 MHz

图 5:HSE 使用 24 MHz 晶振(X1),LSE 为 32.768 kHz(本例不使用)
HSE 接的是 24 MHz 晶振(X1,OSC_IN / OSC_OUT),后面的时钟树就以此为输入。
三、CubeMX 外设配置
3.1 调试接口:Serial Wire
在左侧 Trace and Debug → DEBUG(旧版本在 System Core → SYS)中,把 Debug 设为 Serial Wire。

图 6:Debug 选择 Serial Wire,保留 PA13 / PA14 的 SWD 功能
为什么第一步就配调试口把 PA13 / PA14 保留给 SWD,避免它们被当作普通 GPIO 占用,导致后面下载、调试都连不上。
3.2 时钟树:24 MHz → 250 MHz
在 System Core → RCC 中,把 High Speed Clock (HSE) 设为 Crystal/Ceramic Resonator,Low Speed Clock (LSE) 保持 Disable;再切到 Clock Configuration,将 HSE 选为 PLL1 的输入源,按图设置分频与倍频。

图 7:HSE 24 MHz 作为 PLL 源,SYSCLK 250 MHz,AHB 不分频
STM32H533 的最高主频为 250 MHz,这里直接拉满:SYSCLK = HCLK = 250 MHz,AHB Prescaler = /1。若右上角出现 Resolve Clock Issues 红标,按提示逐项检查未使能的时钟源即可。
3.3 GPIO:PA5 推挽输出
回到 Pinout & Configuration,在芯片图上左键点击 PA5,选择 GPIO_Output;再在 System Core → GPIO 中按下表配置:
| GPIO output level | High |
| GPIO mode | Output Push Pull |
| GPIO Pull-up/Pull-down | No pull-up and no pull-down |
| Maximum output speed | Low |

图 8:PA5 设为推挽输出,初始高电平
初始电平为什么是 HighLED 是低电平点亮,初始拉高可以让复位后 LED 保持熄灭,避免上电瞬间闪一下。
LED 的电流很小,推挽输出 + 低速档完全够用,也少了不必要的开关噪声。
四、生成 CMake 工程
4.1 Project Manager 设置
切到 Project Manager,按下表填写:
| Project Name | led |
| Project Location | 全英文路径,例如 E:\stm32cubemx\todo |
| Application Structure | Advanced |
| Toolchain / IDE | CMake |
| Code Generator | Copy only the necessary library files |
| Generated files | 勾选 Generate peripheral initialization as a pair of '.c/.h' files per peripheral 勾选 Keep User Code when re-generating |

图 9:工程名、路径、CMake 工具链与代码生成选项
路径不要带中文CubeMX 生成的工程路径请保持全英文,中文路径在 CMake / GCC 环节很容易出现难以排查的报错。
4.2 生成代码
点击右上角的 GENERATE CODE,等待生成完成后选择 Open Project,即可用 VSCode 打开工程。
五、用 C++ 封装 GPIO
5.1 为什么再包一层
HAL_GPIO_WritePin() 已经够用,但点灯只是开始,后面还要驱动蜂鸣器、步进电机。直接写 BSRR 寄存器可以省掉函数调用开销,也更贴近底层。于是把“端口 + 引脚”封装成一个轻量的 STM32GPIO 类:
class STM32GPIO
{
public:
// irq 预留给后续中断 / EXTI 使用,点灯实验用不到,先给默认值
STM32GPIO(GPIO_TypeDef* port, uint16_t pin, IRQn_Type irq = NonMaskableInt_IRQn)
: port_(port), pin_(pin), irq_(irq) {}
inline void Write(bool value)
{
if (value)
{
// BSRR 低 16 位写 1:置位
port_->BSRR = static_cast<uint32_t>(pin_);
}
else
{
// BSRR 高 16 位写 1:复位
port_->BSRR = static_cast<uint32_t>(pin_) << 16;
}
}
private:
GPIO_TypeDef* port_;
uint16_t pin_;
IRQn_Type irq_;
};BSRR 的好处是原子操作:置位、复位各写一次寄存器,不需要“读—改—写”,也不会影响同一端口的其他引脚。
5.2 在 main 里点灯
先定义 LED 对象,再在 while (true) 中翻转电平:
// GPIO
static STM32GPIO PA5(GPIOA, GPIO_PIN_5);
/* User Code Begin 3 */
while (true)
{
PA5.Write(false); // 低电平,点亮
HAL_Delay(500);
PA5.Write(true); // 高电平,熄灭
HAL_Delay(500);
}亮 500 ms、灭 500 ms,正好是 1 Hz 的闪烁。
代码写在 USER CODE 区只有写在 /* USER CODE BEGIN ... */ 与 /* USER CODE END ... */ 之间的内容,才不会被 CubeMX 重新生成时覆盖。
六、编译、下载与验证
在 VSCode 中装好 CMake Tools 与 STM32 扩展,打开工程后先 Configure、再 Build。随后打开 运行和调试,选择 STM32Cube: STM32 Launch STLink GDB Server(NUCLEO 板载 ST-Link),按 F5 下载并启动调试。

图 10:在 VSCode 的运行和调试中选择 ST-Link GDB Server
下载成功后,板载绿色 LED 会以 1 Hz 的频率闪烁——点灯成就达成。
七、小结
这次点灯把整条开发链路串了起来:
CubeMX 选型建工程,处理 TrustZone 与 ICACHE 默认配置;
从原理图确认 LED 引脚与有效电平(PA5,低电平点亮);
配置 SWD、HSE 24 MHz → 250 MHz 时钟树、PA5 推挽输出;
生成 CMake 工程,用 C++ 封装 GPIO 并翻转电平;
VSCode + ST-Link 下载验证。
下一篇用 PWM 驱动蜂鸣器,让板子“唱”起来。
我要赚赏金
