第2章:开发环境搭建

做嵌入式开发,第一步就是把家伙事儿备齐。我见过不少新手,上来就急着写代码,结果环境没配好,折腾半天连个灯都点不亮。这一章,咱们就把Keil MDK、STM32CubeMX和调试器这三样东西安排明白。

2.1 Keil MDK安装与破解

Keil MDK,说白了就是ARM内核芯片的IDE。我最早用的时候还是Keil 4,现在都到Keil 5甚至MDK 6了。不过咱们做剃须刀电机控制,用MDK 5.38就足够了,稳定,不折腾。

安装步骤其实很简单,但有几个坑我得提醒你:

  • 路径不要有中文。我见过有人装在“D:\开发工具\Keil_v5”这种路径,结果编译报错,查了半天才发现是中文空格惹的祸。
  • 安装包要完整。MDK安装包大概1.2GB,别下到一半就断了。我习惯用迅雷或者官方直链下载。
  • 先装软件,再破解。破解工具要管理员权限运行,不然会提示“Error: License not found”。

个人经验:我建议安装时把“Add to PATH”勾上,这样后面用命令行调用编译器会方便很多。另外,破解时记得选“ARM”而不是“C51”,这两个是不同的编译器。

安装完成后,打开Keil,点“File” -> “License Management”,把破解生成的CID填进去。嗯,这里要注意,破解工具要对应你的MDK版本,别拿v5.37的破解器去搞v5.38,会报错。

2.2 STM32CubeMX配置

STM32CubeMX是ST官方出的图形化配置工具。说白了,就是帮你生成初始化代码的。我刚开始做项目时,都是手写寄存器,后来发现CubeMX生成的HAL库代码其实挺靠谱,尤其是做电机控制这种需要精确配置定时器的场景。

安装CubeMX前,你得先装好Java运行环境。为什么?因为CubeMX是基于Java开发的。我记得有一次帮同事装,他死活打不开,最后发现是JDK版本太老。建议装JDK 11以上。

配置步骤:

  1. 打开CubeMX,选择你的芯片型号。咱们做剃须刀电机控制,常用的是STM32F103C8T6或者STM32G030F6P6。
  2. 配置时钟树。电机控制需要PWM,PWM又需要定时器,定时器又需要时钟。我习惯把系统时钟配到72MHz(F103)或64MHz(G030)。
  3. 配置GPIO。电机驱动一般用两个PWM引脚(正反转),再加一个使能引脚。嗯,这里要注意,PWM引脚要选有TIMx_CHx功能的。
  4. 生成代码。选“MDK-ARM”作为工具链,版本选V5。生成后直接双击.uvprojx文件就能打开。

避坑指南:我曾经在配置定时器时,忘了勾选“Internal Clock”作为时钟源,结果PWM死活不出波形。查了半天才发现定时器根本没时钟。所以,生成代码后先检查一下“HAL_TIM_Base_Init”里的时钟源配置。

2.3 硬件调试器连接

调试器,就是连接电脑和开发板的桥梁。咱们常用的有两种:J-Link和ST-Link。我个人更偏爱J-Link,速度快,稳定。但ST-Link便宜,而且ST官方开发板都自带。

连接方式其实很简单:

  • SWD接口:只用4根线——VCC、GND、SWDIO、SWCLK。我习惯把VCC接到3.3V,GND共地,SWDIO和SWCLK直接连到芯片对应引脚。
  • 接线顺序:先接地,再接电源,最后接信号线。为什么?因为热插拔时,信号线先接触容易产生毛刺,导致芯片锁死。

连接好后,打开Keil,点“Project” -> “Options for Target” -> “Debug”,选择“J-Link/J-Trace Cortex”或“ST-Link Debugger”。然后点“Settings”,如果能识别到芯片ID,说明连接成功。

警告:千万不要在调试器连接状态下拔插开发板电源。我吃过这个亏,有一次调试时手贱拔了USB线,结果J-Link的固件直接挂了,花了半天才重新刷回来。

调试器连接成功后,你可以点“Download”按钮烧录程序。如果烧录失败,检查一下这几项:

  • 芯片是否供电?用万用表量一下VCC引脚。
  • SWDIO和SWCLK是否接反?我见过有人把这两根线接反,结果死活连不上。
  • 调试器驱动是否安装?J-Link需要装“J-Link Software Pack”,ST-Link需要装“ST-Link Utility”。

2.4 环境验证:点个灯吧

环境搭好了,总得验证一下。咱们写个最简单的点灯程序:

// main.c
#include "main.h"

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    
    while (1)
    {
        HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
        HAL_Delay(500);  // 延时500ms
    }
}

编译、下载,如果LED以1Hz的频率闪烁,恭喜你,环境搭建成功!

嗯,这里要注意,如果LED不亮,先检查GPIO配置。我习惯把LED引脚配置为推挽输出,上拉或下拉无所谓。另外,有些开发板的LED是低电平点亮,记得把代码里的“TogglePin”逻辑反过来。

个人经验:点灯程序虽然简单,但它是验证整个开发流程的“金标准”。我每做一个新项目,第一件事就是点灯。灯亮了,说明MCU、调试器、IDE、时钟、GPIO全都没问题。后面写电机控制代码时,心里就有底了。

好了,环境搭建就到这里。下一章,咱们开始讲电机控制的核心——PWM生成。到时候你会看到,刚才配的定时器到底是怎么让电机转起来的。