3. 开发环境搭建:Keil MDK安装、STM32CubeMX配置、串口调试工具
好,咱们正式开始动手了。
这一章,说白了就是把你电脑武装成一个能干活的工作站。我见过太多人,板子买回来,芯片焊好了,结果卡在环境搭建这一步,一卡就是半天。其实没那么玄乎,跟着我走一遍,半小时搞定。
3.1 Keil MDK 安装——别小看这个IDE
Keil MDK,全称是Microcontroller Development Kit。咱们飞控里用的STM32,基本都靠它来编译和调试。我个人习惯用MDK 5.38版本,太新的版本有时候对老芯片支持不好,太旧的又缺一些新功能。
安装要点:
- 从ARM官网下载MDK-ARM安装包,注意区分32位和64位
- 安装路径不要带中文,不要带空格。我见过有人装在「Program Files (x86)」里,结果后面编译报一堆莫名其妙的错
- 安装完成后,记得用管理员权限运行一次,否则注册可能不生效
安装完第一件事是什么?不是写代码,是装器件包(Pack)。你想想看,Keil本身只是个壳子,它得知道你的芯片长什么样才能干活。STM32F4系列、F1系列、H7系列,每个系列都有自己的Pack。
我的小技巧:直接在Keil里点「Pack Installer」,搜索你的芯片型号,比如STM32F407VGT6,一键安装。别去官网手动下载,容易搞错版本。
嗯,这里要注意:Pack版本不是越新越好。我去年做一个项目,用了最新的F4 Pack,结果编译出来的代码在板子上跑飞了。查了两天,最后发现是某个外设库的时序参数被改了。所以,如果你用的是成熟方案,Pack版本稳定就好。
3.2 STM32CubeMX配置——图形化生成初始化代码
STM32CubeMX,这工具简直是嵌入式开发的福音。以前我们写初始化代码,得对着数据手册一行一行敲寄存器,一个GPIO配置能写几十行。现在?点几下鼠标,代码自动生成。
但别高兴太早——自动生成的代码,你得知道它背后干了什么。否则出了问题,你连改都不知道从哪下手。
3.2.1 新建工程,选芯片
打开CubeMX,点「New Project」,在搜索框里输入你的芯片型号。比如我们飞控常用的STM32F405RGT6,或者F407VGT6。双击选中,然后点「Start Project」。
避坑指南:我曾经选错过封装,比如选了LQFP64的,结果买回来的板子是LQFP100的。引脚对不上,整个工程白做。所以选芯片时,一定要核对封装和引脚数。
3.2.2 配置时钟树
时钟是芯片的心脏。点开「Clock Configuration」标签页,你会看到一张时钟树图。默认情况下,CubeMX会给你一个保守的配置,比如HSE(外部高速晶振)没启用,系统时钟只有16MHz。
咱们飞控需要高性能,一般要跑到168MHz甚至更高。怎么做?
- 先确认你的板子上有外部晶振,通常是8MHz或25MHz
- 在RCC配置里,把HSE设为「Crystal/Ceramic Resonator」
- 回到时钟树,把HSE输入到PLL,PLL倍频到168MHz
- 注意看右上角的颜色提示——绿色表示合法,红色表示超频了
我刚开始做飞控时,有一次把PLL倍频设到了200MHz,芯片直接不启动。后来用示波器量晶振引脚,发现根本没起振。嗯,这就是超频的后果。
3.2.3 配置外设
飞控传感器测试平台,需要哪些外设?我列个清单:
| 外设 | 用途 | 配置要点 |
|---|---|---|
| USART1 | 串口打印调试信息 | 波特率115200,8N1,开启中断 |
| USART2 | 与传感器通信(如GPS) | 波特率根据传感器手册定,常用9600或115200 |
| I2C1 | 连接IMU(如MPU6050) | 速率400kHz,开启DMA |
| SPI1 | 连接气压计或磁力计 | 速率10MHz,CPOL=0,CPHA=0 |
| GPIO | LED指示、按键输入 | 推挽输出,上拉输入 |
在CubeMX的「Pinout & Configuration」标签页里,找到对应的外设,点一下,选模式。比如USART1,选「Asynchronous」,然后在下方的Parameter Settings里配波特率。
我的习惯:配完外设后,点一下「Generate Code」,先看看生成的代码结构。如果发现某个外设的初始化函数没生成,八成是引脚冲突了。CubeMX会报错,但有时候报错信息不明显,你得自己检查。
3.2.4 生成代码
点「Project Manager」标签,设置工程名和路径。Toolchain选MDK-ARM,版本选V5.38。然后点右上角的「GENERATE CODE」。
生成完成后,用Keil打开工程。你会看到CubeMX帮你生成了main.c、stm32f4xx_hal_msp.c等文件。别急着改,先编译一次,确保零错误零警告。
3.3 串口调试工具——你的第二双眼睛
飞控调试,串口是命根子。没有串口,你就像闭着眼睛开飞机。我常用的串口工具有两个:Putty和SSCOM。Putty轻量,SSCOM功能多。
3.3.1 硬件连接
串口通信需要三根线:TX、RX、GND。注意交叉连接——板子的TX接调试器的RX,板子的RX接调试器的TX。GND接GND。
我曾经犯过的错:有一次我把TX和TX直接连上了,结果两边都在发数据,谁也不听谁的。串口助手上一片乱码。检查了半小时才发现是线接反了。所以,接好线后,先发一个字符看看回显,确认通信正常。
3.3.2 配置串口助手
打开SSCOM,选对COM口(在设备管理器里看),波特率设115200,数据位8,停止位1,无校验。点「打开串口」。
然后在你的代码里,加一句打印:
printf("Hello from STM32!\r\n");
注意,Keil默认的printf是半主机模式,需要重定向。在工程里加一个fputc函数:
int fputc(int ch, FILE *f) {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
编译下载,复位板子。如果串口助手打印出「Hello from STM32!」,恭喜你,环境搭建成功了。
3.3.3 调试技巧
串口不只是用来打印「Hello World」的。在实际调试中,我习惯用串口输出传感器原始数据、姿态解算结果、控制指令等。格式可以自己定,比如:
printf("ACC:%.2f,%.2f,%.2f GYR:%.2f,%.2f,%.2f\r\n",
acc_x, acc_y, acc_z, gyr_x, gyr_y, gyr_z);
然后在串口助手里看数据流。如果数据跳变异常,八成是传感器配置有问题,或者I2C/SPI通信不稳定。
我的经验:串口打印不要太频繁。比如你IMU输出频率是1kHz,你每读一次就打印一次,串口带宽根本扛不住。我一般降到100Hz打印,或者用DMA+环形缓冲区,把打印任务丢给后台处理。
3.4 本章知识体系
下面这张图,是我自己画的开发环境搭建流程。你跟着走,不会迷路。
这张图把整个流程串起来了。从安装Keil,到CubeMX配置,再到串口验证,每一步都有坑,但每一步也都有解法。你只要按图索骥,环境搭建这块就不会卡住。
好了,这一章就到这。工具都装好了,下一章咱们开始真正跟传感器打交道。
公众号:蓝海资料掘金营,微信deep3321