第二章 开发环境搭建:基于STM32的BMS硬件平台介绍、Keil/IAR IDE配置、Git版本管理初始化
好,咱们正式开始动手了。这一章我带你把开发环境搭起来。说实话,很多新手工程师拿到一块BMS板子,第一反应就是急着写代码。我当年也这样,结果呢?调试器连不上、编译报错一堆、代码改乱了回不去……嗯,这些坑我都踩过。所以这一章,咱们稳扎稳打,把地基打牢。
2.1 基于STM32的BMS硬件平台概览
先说说硬件平台。咱们课程用的是基于STM32F103系列的主控板,搭配TI的BQ76940模拟前端(AFE)。为什么选这套方案?说白了,这是目前市面上最成熟的组合之一。STM32负责算法运算和逻辑控制,BQ76940负责电芯电压采集和均衡控制。
我个人习惯,拿到一块新板子,先看三样东西:
- 电源树:12V转5V,5V转3.3V,AFE的供电是独立的。我在项目里遇到过AFE供电纹波太大导致采样跳变的问题,后来加了LC滤波才解决。
- 通信接口:STM32与BQ76940之间走的是I2C,速率100kHz。注意,I2C上拉电阻要选4.7kΩ,别问我怎么知道的——曾经用10kΩ,通信偶尔丢包,排查了两天。
- 采样通道:BQ76940支持9-15串电芯,咱们板子接了12串。每个通道都有RC滤波,时间常数约1ms。这个参数后面写ADC驱动时会用到。
关键参数速查表
| 模块 | 型号 | 通信方式 | 关键引脚 |
|---|---|---|---|
| 主控MCU | STM32F103C8T6 | - | PA9(TX), PA10(RX) |
| 模拟前端 | BQ76940 | I2C | PB6(SCL), PB7(SDA) |
| 电流检测 | INA226 | I2C | PB8(SCL), PB9(SDA) |
| 温度检测 | NTC + ADC | ADC1_IN0~3 | PA0~PA3 |
2.2 Keil MDK-ARM 环境配置
IDE这块,我推荐Keil MDK-ARM v5.38。为什么不是最新的v6?因为咱们用的STM32标准外设库在v6下编译会有警告,虽然能跑,但看着不舒服。你想想看,每次编译都飘一堆黄色警告,多闹心。
配置步骤其实不复杂,但有几个细节要注意:
- 安装芯片包:Keil里Pack Installer搜索STM32F1,安装1.8.5版本。我试过1.8.0,有个DMA的bug,折腾了我一下午。
- 工程选项设置:
// 关键配置路径:Project -> Options for Target
// Target标签页:
// Xtal: 8.0MHz (外部晶振)
// Use MicroLIB: 勾选 (节省RAM)
// C/C++标签页:
// Define: USE_STDPERIPH_DRIVER, STM32F10X_MD
// Optimization: Level 1 (-O1) 调试阶段用这个
// Debug标签页:
// Use: ST-Link Debugger
// Settings -> Flash Download -> Reset and Run: 勾选
我的小技巧:调试阶段优化等级别用-O0,虽然调试体验好,但生成的代码体积大,有时候仿真器下载会超时。用-O1刚刚好,既能单步调试,下载也快。
2.3 IAR Embedded Workbench 配置
有些团队用IAR,我也说说。IAR的编译器优化确实比Keil强,生成的代码效率高5%-10%。但它的界面……嗯,一言难尽,快捷键跟Keil完全不一样。
配置要点:
- 芯片选择:STM32F103C8,注意选带T的版本(STM32F103C8T6)
- 链接器文件:用自带的stm32f103x8.icf,不用改
- 调试器:选择ST-Link,接口选SWD,速度选4MHz
注意:IAR工程文件(.ewp)和Keil工程文件(.uvprojx)不能混用。我见过有人把Keil工程直接拖到IAR里编译,结果报了几百个错误。两个IDE的工程要分开维护。
2.4 Git版本管理初始化
说到版本管理,这是很多工程师容易忽略的环节。我曾经有个血的教训:一个SOC算法调了三天,结果同事不小心覆盖了我的代码,而且没有备份……从那以后,我养成了「不建Git仓库不写代码」的习惯。
咱们的BMS项目,我建议这样初始化:
# 在项目根目录执行
git init
# 创建 .gitignore 文件,排除编译产物
echo "*.o" >> .gitignore
echo "*.hex" >> .gitignore
echo "*.bin" >> .gitignore
echo "Debug/" >> .gitignore
echo "Release/" >> .gitignore
echo "*.uvguix.*" >> .gitignore # Keil用户配置文件
echo "settings/" >> .gitignore # IAR配置文件
# 添加所有文件并提交
git add .
git commit -m "Initial commit: BMS SOC algorithm project skeleton"
分支策略我建议这样:
- main:稳定版本,只有通过硬件测试的代码才能合并进来
- develop:日常开发分支,所有新功能先合到这里
- feature/soc-xxx:每个算法模块一个分支,比如feature/soc-kalman
避坑指南:千万不要把编译生成的临时文件提交到Git仓库。我见过一个项目,.hex文件每次编译都变,结果Git仓库里存了几百个版本的hex,占了几百MB空间。用.gitignore把它们挡在外面,清爽多了。
2.5 环境验证:点亮第一颗LED
环境搭好了,咱们跑个简单的程序验证一下。写一个LED闪烁程序,确认编译、下载、运行都没问题。
#include "stm32f10x.h"
void delay(uint32_t count) {
for(uint32_t i = 0; i < count; i++);
}
int main(void) {
// 使能GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 配置PC13为推挽输出
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
while(1) {
GPIO_SetBits(GPIOC, GPIO_Pin_13); // 灭
delay(500000);
GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 亮
delay(500000);
}
}
编译通过后,用ST-Link下载。如果看到板子上的LED以大约1秒的频率闪烁,恭喜你,环境搭建成功了!
如果LED不亮怎么办?先检查ST-Link连接,看看Keil/IAR的Debug窗口有没有报错。如果下载成功但灯不闪,八成是GPIO引脚搞错了。咱们板子上LED接的是PC13,低电平点亮。你想想看,是不是初始化写成了高电平点亮?
好,环境搭完了。下一章咱们开始写BQ76940的驱动,真正开始采集电芯电压。到时候我会把I2C通信的坑一个一个给你指出来——嗯,那些坑我当年可都踩过。