这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【let'sdo2026年第1期】静音步进电机控制实践过程贴-基于H533的基础

共1条 1/1 1 跳转至

【let'sdo2026年第1期】静音步进电机控制实践过程贴-基于H533的基础配置

高工
2026-06-25 21:41:37   被打赏 25 分(兑奖)     打赏

        上一篇我把TMC2209的三根控制信号掰开讲清楚了。但说一千道一万,信号得有人发,这就是MCU的活儿。这次项目用的是STM32H533RET6,NUCLEO-H533RE这块官方板子。选H533不是因为它最便宜或最强大,纯粹是手头有、熟悉、生态也完整,想用。

这一篇我重点讲两件事:
  1. 硬件资源怎么规划 —— 时钟、引脚、外设,先想清楚再动手。

  2. 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)画一张引脚分配表,把每个引脚的"功能、方向、电气特性"提前规划好。

这次引脚分配如下:
引脚功能方向电气配置备注
PA0DIR输出推挽,无上下拉,默认高电机方向控制
PA1EN输出推挽,无上下拉,默认高驱动板使能(active-low)
PB1TIM3_CH4复用输出AF2,无上下拉STEP 脉冲 PWM 输出

        这些引脚在开发板上是挨着的,连线比较方便。

        我先在CubeMX里检查了PA0/PA1不被其它外设默认占用(H533上PA13/PA14/PA15是 SWD,PA0/PA1是普通 GPIO 没问题)。这步很关键 —— 很多引脚被占用后看似空着,其实被某个外设默认占用了。CubeMX在你没启用该外设时会显示"空闲",但一旦你启用了 TIM、UART之类,占用关系会变。引脚配置如下:

ca1f2366-002b-40d3-aa6e-0b0a24d542e8.png

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

32c68911-4880-4cc6-9950-f9e4a3fb55f4.png

TIM3 配置:定时器配置是这个项目的核心

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

c779b382-aa57-406c-8a4c-b44e2c8d4a22.png

        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%





关键词: 电机     控制     实践     过程    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]