上一篇我把TMC2209的三根控制信号掰开讲清楚了。但说一千道一万,信号得有人发,这就是MCU的活儿。这次项目用的是STM32H533RET6,NUCLEO-H533RE这块官方板子。选H533不是因为它最便宜或最强大,纯粹是手头有、熟悉、生态也完整,想用。
这一篇我重点讲两件事:硬件资源怎么规划 —— 时钟、引脚、外设,先想清楚再动手。
CubeMX里怎么配置 —— 包括那些用户容易忽略的细节(时钟树、Prescaler、Alternate Function)。
STM32H533:我为什么选它
先简单介绍一下这颗料。H533是ST在里偏中端的一颗Cortex-M33,主频能跑到250MHz,带FPU和 TrustZone。64 引脚的LQFP封装,资源对本次来说绰绰有余:
512 KBFlash,装我这个demo绰绰有余(实际只用了37KB左右)。
272 KB SRAM,动态内存几乎没怎么用。
多个通用定时器,还带高级定时器(HRTIM),做电机控制绰绰有余。
CubeMX配置
很多人打开CubeMX之后就开始"看心情点引脚",这习惯不好。我每次新建工程前,都会先在纸上(或 OneNote)画一张引脚分配表,把每个引脚的"功能、方向、电气特性"提前规划好。
这次引脚分配如下:这些引脚在开发板上是挨着的,连线比较方便。
我先在CubeMX里检查了PA0/PA1不被其它外设默认占用(H533上PA13/PA14/PA15是 SWD,PA0/PA1是普通 GPIO 没问题)。这步很关键 —— 很多引脚被占用后看似空着,其实被某个外设默认占用了。CubeMX在你没启用该外设时会显示"空闲",但一旦你启用了 TIM、UART之类,占用关系会变。引脚配置如下:

H533上电默认是内部64MHz HSI。我这个项目对时钟精度要求不高(串口和定时器都是整数分频),但我还是配了PLL 把频率提到96MHz,常用的配置。CubeMX 里的时钟树:

TIM3 配置:定时器配置是这个项目的核心
我需要TIM3_CH4输出1kHz的PWM,作为STEP信号源(speed1档位)。后续切speed2时改成500Hz,speed3时改成250Hz。每次切频率都通过修改ARR实现,Prescaler保持不变。PWM 频率 = TIMx_CLK / ((PSC+1) × (ARR+1))。CubeMX 里的实际配置如下:

USART2配置:串口shell的物理基础,USART2在NUCLEO板上被ST-LINK VCP透传,所以配的是异步串口(Asynchronous Mode)。115200是shell的"速率",承载shell这种字符密集型交互。接收模式是中断 + 1字节:
HAL_UART_Receive_IT(&hcom_uart[COM1], &rx_byte, 1);
每收到 1 字节就触发一次中断,处理完后再下一字节。简单、稳、对 shell 这种"少量字符"场景非常合适。为什么不直接用DMA + 环形buffer?没必要。1 字节中断的CPU开销几乎可以忽略(H5系列的中断响应在10几个周期),代码却简单 10 倍。
NUCLEO的BSP提供 BSP_COM_Init(COM1, ...) 函数,内部自动初始化USART2的GPIO、时钟、和外设,直接用BSP接口。
CMake 工程:Ninja+ARM工具链
项目用CMake + Ninja而不是Keil/IAR。原因很简单:免费的、跨平台的、版本管理友好。ST的 STM32CubeCLT自带 arm-none-eabi-gcc 和Ninja,开箱即用。
工具链
D:\ST\STM32CubeCLT_1.21.0\ ├── GNU-tools-for-STM32\bin\arm-none-eabi-gcc.exe ├── CMake\bin\cmake.exe └── Ninja\bin\ninja.exe
把这三个目录加到 PATH 里。
工具链文件
STM32CubeMX生成的 cmake/gcc-arm-none-eabi.cmake 里有完整的工具链配置。CMake 会在配置时自动加载它。
构建命令
cmake --preset Debug # 配置阶段 cmake --build --preset Debug # 构建阶段
两条命令搞定,编译后输出 build/Debug/Motor.elf + Motor.map。
添加用户源文件
CubeMX生成的CMakeLists.txt把CubeMX自己生成的源文件(main.c、tim.c、gpio.c 等)固定写在了 cmake/stm32cubemx/CMakeLists.txt 里。我不修改那个文件,而是把我自己的 stepper.c、shell.c 加到根 CMakeLists.txt 的 target_sources() 块里:
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/Core/Src/stepper.c
${CMAKE_CURRENT_SOURCE_DIR}/Core/Src/shell.c
)构建完,编译器会报一段内存使用情况:
Memory region Used Size Region Size %age Used RAM: 2344 B 272 KB 0.84% FLASH: 37216 B 512 KB 7.10%
我要赚赏金
