2、开发环境搭建:Keil MDK安装与配置、STM32CubeMX初始化、HAL库与LL库选择、调试器(J-Link/ST-Link)配置、第一个点灯程序验证

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

这一章,说白了就是「把家伙事儿备齐」。做步进电机驱动,你不可能在脑子里跑代码。环境搭不好,后面全是坑。我见过太多新手卡在编译报错、下载失败上,一卡就是半天。其实,只要按步骤来,十分钟就能搞定。

2.1 Keil MDK 安装与配置

Keil MDK,ARM 系单片机开发的事实标准。虽然现在也有 GCC 和 IAR,但做 STM32 项目,我个人习惯还是用 Keil。生态成熟,教程多,遇到问题好搜。

安装步骤:

  1. 去 ARM 官网下载 MDK-Arm 安装包。版本建议选 5.36 或以上,太老的版本对新型号支持不好。
  2. 双击安装,一路 Next。注意安装路径不要有中文,不要有空格。我习惯放 C:\Keil_v5
  3. 安装完成后,打开 Keil,点击 File -> License Management。用注册机生成 CID 对应的 License。嗯,这一步大家懂的都懂。
  4. 安装器件包(Pack)。点击 Pack Installer,找到 STM32F1 或 F4 系列,点击 Install。如果你网络慢,可以去 Keil 官网下载离线包。
注意: 我曾经遇到过装完 Keil 后,编译报错说找不到头文件。折腾半天才发现是 Pack 没装全。所以,装完 Pack 后,建议重启一次 Keil。

2.2 STM32CubeMX 初始化

STM32CubeMX 是 ST 官方出的图形化配置工具。用它生成初始化代码,省时省力。尤其是做步进电机驱动,你要配置定时器、PWM、GPIO,手写寄存器太容易出错了。

我的习惯流程:

  1. 打开 CubeMX,点击 New Project。选择你的芯片型号。比如我常用 STM32F103C8T6,直接搜就行。
  2. 配置时钟树(Clock Configuration)。步进电机驱动对时序要求高,我一般把 HCLK 拉到最高。比如 F103 拉到 72MHz。
  3. 配置 GPIO。比如 PA0 作为步进脉冲输出,PA1 作为方向控制。在 Pinout 视图里直接点引脚,选 GPIO_Output
  4. 配置定时器。如果你用 PWM 控制步进电机,需要配置一个定时器。比如 TIM2,通道 1 输出 PWM。预分频和自动重装值根据你的步进频率算。
  5. 点击 Project -> Generate Code。选择 MDK-ARM V5 工具链。生成后,用 Keil 打开工程。
小技巧: 生成代码时,记得勾选 Initialize all peripherals。不然有些外设默认是关闭的,你点灯都点不亮。我刚开始就吃过这个亏。

2.3 HAL 库与 LL 库选择

这是个老生常谈的问题。HAL 库还是 LL 库?

我的观点很直接:做步进电机驱动,优先用 LL 库。

为什么?步进电机控制对实时性要求高。HAL 库封装太厚,一个 GPIO 翻转函数进去要绕好几层。LL 库几乎就是寄存器操作的直接映射,效率高,代码量小。

特性 HAL 库 LL 库
代码量 大,冗余多 小,精简
执行效率 较低 高,接近寄存器
易用性 高,API 封装好 较低,需要懂寄存器
适合场景 复杂外设、快速原型 实时控制、电机驱动

当然,也不是说 HAL 库不能用。如果你做的是低速步进电机,或者只是验证功能,HAL 库完全够用。但如果你要做高速、高精度的细分驱动,我建议你直接上 LL 库。

在 CubeMX 里怎么选?生成代码时,在 Project Manager -> Advanced Settings 里,把每个外设的驱动库从 HAL 改成 LL。注意,有些外设(比如 USB、ETH)只能用 HAL,但 GPIO、TIM、UART 这些完全可以用 LL。

我的经验: 我做过一个项目,用 HAL 库的 TIM PWM 输出,频率一高就丢脉冲。换成 LL 库后,问题直接消失。说白了,就是 HAL 库的中断处理太慢了。

2.4 调试器配置(J-Link / ST-Link)

调试器是嵌入式开发的「眼睛」。没有它,你只能靠猜。

J-Link 配置:

  1. 安装 J-Link 驱动。去 Segger 官网下载 J-Link Software and Documentation Pack
  2. 在 Keil 里,点击 Project -> Options for Target -> Debug。选择 J-LINK / J-TRACE Cortex
  3. 点击 Settings,确认 SWD 模式,速度建议选 4MHz 或以下。太高容易不稳定。
  4. 连接线序:SWDIO、SWCLK、GND、VCC(可选)。注意,有些板子需要外部供电。

ST-Link 配置:

  1. ST-Link 驱动一般集成在 Keil 或 CubeMX 里。如果识别不到,去 ST 官网下载 ST-Link UtilityST-Link driver
  2. 在 Keil 的 Debug 选项里,选择 ST-Link Debugger
  3. 同样点 Settings,确认 SWD 模式。ST-Link 的速度我一般选 1.8MHz,稳定第一。
避坑指南: 我曾经遇到 J-Link 连不上目标板,折腾半天发现是杜邦线太长,信号衰减了。调试器连接线尽量短,最好在 10cm 以内。另外,SWD 的 GND 一定要接,不接的话通信会时断时续。

2.5 第一个点灯程序验证

环境搭好了,总得跑个程序验证一下。点灯,嵌入式界的「Hello World」。

咱们用 LL 库写一个最简单的点灯程序。假设 LED 接在 PC13 上(很多 STM32 板子默认就是这个)。

#include "stm32f1xx_ll_gpio.h"
#include "stm32f1xx_ll_bus.h"

void delay(volatile uint32_t count) {
    while(count--);
}

int main(void) {
    // 使能 GPIOC 时钟
    LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC);

    // 配置 PC13 为推挽输出
    LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_13, LL_GPIO_MODE_OUTPUT);
    LL_GPIO_SetPinOutputType(GPIOC, LL_GPIO_PIN_13, LL_GPIO_OUTPUT_PUSHPULL);
    LL_GPIO_SetPinSpeed(GPIOC, LL_GPIO_PIN_13, LL_GPIO_SPEED_FREQ_LOW);

    while(1) {
        LL_GPIO_TogglePin(GPIOC, LL_GPIO_PIN_13);
        delay(500000);
    }
}

代码很简单,但有几个点要注意:

  • 时钟使能不能忘。LL 库不会自动帮你开时钟,这是和 HAL 库最大的区别。
  • 延时函数用空循环,只是为了验证。实际项目中千万别这么用,会阻塞 CPU。
  • 编译通过后,点击 DownloadF8,程序就会烧录到板子里。

如果 LED 开始闪烁,恭喜你,环境搭建成功了!

提示: 如果下载后 LED 不亮,先检查调试器连接。再检查 CubeMX 里的引脚配置是否正确。我遇到过有人把 PC13 配成了输入模式,点灯当然点不亮。

嗯,到这里,开发环境就全部就绪了。下一章,咱们开始真正接触步进电机的控制原理。准备好了吗?