3、开发环境搭建:Keil MDK安装与配置、STM32CubeMX生成工程、JLink/SWD调试器配置、串口终端工具

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

这一章,说白了就是把你手里的电脑变成一台飞控开发工作站。我见过太多新手,代码写好了,结果编译报错、下载失败、串口没反应——折腾半天,其实都是环境没搭对。咱们今天一步到位,把这些坑全填平。

3.1 Keil MDK 安装与配置

Keil MDK,咱们飞控开发的主力编译器。我个人习惯用 MDK 5.38 版本,稳定,对 STM32F4/F7 系列支持很好。

3.1.1 安装步骤

  1. 下载安装包:去 Keil 官网下载 MDK-ARM 版本。注意别下成 C51 了,那个是给 51 单片机用的。
  2. 一路 Next:安装路径我建议别带中文,也别放 C 盘。我习惯放 D:\Keil_v5。
  3. 激活:安装完后打开,File → License Management。用注册机生成激活码。嗯,这里要注意,以管理员身份运行 Keil,否则激活可能失败。
  4. 安装器件包:点击 Pack Installer,找到 STM32F4 系列(咱们植保飞控用 F407 或 F427),下载对应的 Device Family Pack。
⚠️ 避坑指南:我曾经遇到过,装完 Keil 后编译报错 "Error: L6406E"。查了半天,原来是器件包版本不对。STM32CubeMX 生成的工程要求 Pack 版本 ≥ 2.0.0,记得更新到最新。

3.1.2 编译器配置

打开 Keil,点击 Project → Options for Target。这里有几个关键设置:

  • Target 标签:ARM Compiler 选 V6 或 V5。V6 编译快,但有些老代码不兼容。我建议飞控项目用 V5,稳定第一。
  • Output 标签:勾选 "Create HEX File",这样能生成 .hex 文件,方便烧录。
  • C/C++ 标签:Optimization 选 Level 0 (-O0) 调试阶段用,等代码稳定了再开 Level 2。
💡 个人经验:我习惯在 C/C++ 标签的 "Define" 里加上 USE_HAL_DRIVER, STM32F407xx。这样 HAL 库才能正确识别芯片型号。你想想看,如果忘了加,编译直接报几百个错误,心态直接崩。

3.2 STM32CubeMX 生成工程

STM32CubeMX,说白了就是图形化配置工具。你点点鼠标,它自动生成初始化代码。省去你手写寄存器配置的麻烦。

3.2.1 新建工程

  1. 打开 CubeMX,点击 "New Project"。
  2. 在 Board Selector 里搜 STM32F407VGT6(咱们飞控常用的主控)。
  3. 双击选中,进入配置界面。

3.2.2 关键配置项

咱们植保飞控需要这些外设:

外设 配置 说明
RCC HSE → Crystal/Ceramic Resonator 外部晶振,8MHz
Clock Configuration HCLK = 168MHz 主频拉到最高,飞控需要算力
USART1 Asynchronous, 115200 baud 串口终端,调试用
SPI1 Full-Duplex Master 接 ICM-20602 陀螺仪
I2C1 Standard Mode 接 MS5611 气压计
GPIO PB0, PB1 → Output LED 指示灯

⚠️ 时钟配置要小心:我刚开始做飞控时,把 HCLK 设成了 180MHz,结果芯片直接死机。STM32F407 最高只能 168MHz,别超频。超频一时爽,炸机火葬场。

3.2.3 生成代码

配置完后,点击 Project Manager:

  • Project Name:填你的项目名,比如 "PlantDrone_F4"。
  • Project Location:选一个路径,别用中文。
  • Toolchain / IDE:选 MDK-ARM V5。
  • 点击 GENERATE CODE,等几秒,工程就生成了。

生成后,用 Keil 打开 .uvprojx 文件。你会看到 CubeMX 已经帮你初始化好了时钟、GPIO、串口。你只需要在 main.c 里写业务逻辑就行。

3.3 JLink/SWD 调试器配置

调试器,说白了就是飞控的听诊器。代码跑没跑、变量对不对,全靠它。

3.3.1 硬件连接

JLink 的 SWD 接口只需要 4 根线:

  • SWDIO → 芯片的 PA13
  • SWCLK → 芯片的 PA14
  • GND → 共地
  • 3.3V → 供电(可选,如果板子已上电就不用)
⚠️ 我曾经踩过的坑:有一次 SWD 死活连不上,折腾了两小时。最后发现是 SWDIO 上拉电阻没焊。STM32 的 SWD 接口需要外部上拉 10kΩ 到 3.3V,否则调试器识别不到芯片。

3.3.2 Keil 配置

  1. 点击 Keil 的 "Options for Target" → Debug 标签。
  2. 选择 "J-LINK / J-TRACE Cortex"。
  3. 点击 Settings,确认 SWD 模式,速度选 4MHz(别选太高,线长了容易出错)。
  4. 点击 Flash Download 标签,勾选 "Reset and Run"——这样下载完程序自动复位运行。

3.3.3 调试技巧

连上后,点击 Keil 的 Debug 按钮。你会看到:

  • 左上角有寄存器窗口,可以看 R0-R15 的值。
  • 按 F10 单步执行,看代码走到哪了。
  • 在 Watch 窗口添加变量名,实时监控数值变化。
💡 我个人的调试习惯:飞控代码里,我习惯在关键函数入口加断点。比如姿态解算函数、PID 控制函数。然后看传感器数据对不对、控制量有没有溢出。你想想看,如果姿态角突然跳变到 180 度,那肯定是传感器读取有问题。

3.4 串口终端工具

串口终端,飞控的嘴巴。它把运行状态、调试信息吐出来给你看。

3.4.1 推荐工具

我用过很多串口工具,推荐这几个:

  • MobaXterm:功能强大,支持 SSH、串口、RDP。我主力工具。
  • PuTTY:轻量级,绿色版,U 盘即插即用。
  • SSCOM:国产工具,界面简单,适合快速调试。

3.4.2 配置参数

打开串口工具,设置:

  • 波特率:115200(和 CubeMX 里配置的一致)
  • 数据位:8
  • 停止位:1
  • 校验位:None
  • 流控制:None

3.4.3 测试通信

在 Keil 工程里,main.c 中加入:

#include "stdio.h"

// 重定向 printf 到串口
int fputc(int ch, FILE *f) {
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 100);
    return ch;
}

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_USART1_UART_Init();
    
    while (1) {
        printf("飞控系统启动...\r\n");
        HAL_Delay(1000);
    }
}

下载到板子,打开串口终端。如果看到 "飞控系统启动..." 一行行打印出来,恭喜你,环境搭建成功了。

⚠️ 常见问题:串口没输出?先检查 USB 转串口驱动装没装。CH340 或 CP2102 的驱动,去官网下载。我遇到过好几次,学生说串口没反应,结果发现是驱动没装,设备管理器里显示黄色感叹号。

3.5 本章小结

到这,你的开发环境就齐活了:

  • Keil MDK 能编译代码
  • CubeMX 能生成工程
  • JLink 能下载调试
  • 串口能打印信息

下一章,咱们开始写飞控的核心——传感器驱动。先把陀螺仪和加速度计的数据读出来,飞控才能感知姿态。嗯,到时候你会用上今天配好的调试器和串口,实时看传感器数据。

记住:环境搭得好,调试没烦恼。别急着写代码,先把工具磨利了。