2、开发环境搭建:Keil MDK安装与配置、STM32CubeMX初始化、HAL库与LL库选择、调试器(J-Link/ST-Link)配置、第一个点灯程序验证
好,咱们正式开始动手了。
这一章,说白了就是「把家伙事儿备齐」。做步进电机驱动,你不可能在脑子里跑代码。环境搭不好,后面全是坑。我见过太多新手卡在编译报错、下载失败上,一卡就是半天。其实,只要按步骤来,十分钟就能搞定。
2.1 Keil MDK 安装与配置
Keil MDK,ARM 系单片机开发的事实标准。虽然现在也有 GCC 和 IAR,但做 STM32 项目,我个人习惯还是用 Keil。生态成熟,教程多,遇到问题好搜。
安装步骤:
- 去 ARM 官网下载 MDK-Arm 安装包。版本建议选 5.36 或以上,太老的版本对新型号支持不好。
- 双击安装,一路 Next。注意安装路径不要有中文,不要有空格。我习惯放
C:\Keil_v5。 - 安装完成后,打开 Keil,点击
File -> License Management。用注册机生成 CID 对应的 License。嗯,这一步大家懂的都懂。 - 安装器件包(Pack)。点击
Pack Installer,找到 STM32F1 或 F4 系列,点击 Install。如果你网络慢,可以去 Keil 官网下载离线包。
2.2 STM32CubeMX 初始化
STM32CubeMX 是 ST 官方出的图形化配置工具。用它生成初始化代码,省时省力。尤其是做步进电机驱动,你要配置定时器、PWM、GPIO,手写寄存器太容易出错了。
我的习惯流程:
- 打开 CubeMX,点击
New Project。选择你的芯片型号。比如我常用 STM32F103C8T6,直接搜就行。 - 配置时钟树(Clock Configuration)。步进电机驱动对时序要求高,我一般把 HCLK 拉到最高。比如 F103 拉到 72MHz。
- 配置 GPIO。比如 PA0 作为步进脉冲输出,PA1 作为方向控制。在 Pinout 视图里直接点引脚,选
GPIO_Output。 - 配置定时器。如果你用 PWM 控制步进电机,需要配置一个定时器。比如 TIM2,通道 1 输出 PWM。预分频和自动重装值根据你的步进频率算。
- 点击
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。
2.4 调试器配置(J-Link / ST-Link)
调试器是嵌入式开发的「眼睛」。没有它,你只能靠猜。
J-Link 配置:
- 安装 J-Link 驱动。去 Segger 官网下载
J-Link Software and Documentation Pack。 - 在 Keil 里,点击
Project -> Options for Target -> Debug。选择J-LINK / J-TRACE Cortex。 - 点击
Settings,确认 SWD 模式,速度建议选 4MHz 或以下。太高容易不稳定。 - 连接线序:SWDIO、SWCLK、GND、VCC(可选)。注意,有些板子需要外部供电。
ST-Link 配置:
- ST-Link 驱动一般集成在 Keil 或 CubeMX 里。如果识别不到,去 ST 官网下载
ST-Link Utility或ST-Link driver。 - 在 Keil 的 Debug 选项里,选择
ST-Link Debugger。 - 同样点
Settings,确认 SWD 模式。ST-Link 的速度我一般选 1.8MHz,稳定第一。
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。
- 编译通过后,点击
Download或F8,程序就会烧录到板子里。
如果 LED 开始闪烁,恭喜你,环境搭建成功了!
嗯,到这里,开发环境就全部就绪了。下一章,咱们开始真正接触步进电机的控制原理。准备好了吗?