第三章:测试环境搭建
好,咱们进入第三章。说实话,测试环境搭建这事儿,看着简单,但坑特别多。我见过不少团队,代码写得漂亮,结果环境没搭好,一跑测试全崩了。今天我就把这些年踩过的坑,还有总结出来的经验,一次性说清楚。
3.1 硬件环境:示波器、万用表、可编程电源
硬件环境是测试的基础。你想想看,如果硬件都不靠谱,软件测出来也没意义。
3.1.1 示波器
示波器这东西,说白了就是嵌入式工程师的眼睛。我个人习惯用四通道的,带宽至少100MHz。为什么?因为很多信号需要同时观察,比如SPI的时钟、数据、片选,三个信号一起看才能定位问题。
关键配置参数:
- 采样率:至少1GSa/s,不然高频信号抓不准
- 存储深度:10Mpts以上,方便抓长序列
- 触发方式:边沿触发、脉宽触发、逻辑触发都要支持
我在项目中遇到过一件事。有一次调试I2C通信,设备偶尔不响应。用示波器一看,发现时钟线上有个毛刺,正好在数据采样点附近。要不是示波器带宽够,根本看不到这个毛刺。嗯,从那以后我再也不敢用低端示波器了。
3.1.2 万用表
万用表,看起来简单,但选型也有讲究。我建议至少四位半精度,真有效值测量。为什么?因为嵌入式系统里很多信号不是纯正弦波,普通万用表测不准。
我的习惯:每次上电前,先用万用表测一下电源对地电阻。如果短路了,一上电就烧板子。这个习惯救了我好几次。
3.1.3 可编程电源
可编程电源是自动化测试的核心。我常用的配置是这样的:
| 参数 | 要求 | 说明 |
|---|---|---|
| 通道数 | 至少2通道 | 一路给MCU,一路给外设 |
| 电压精度 | ±0.05% | 电压波动会影响测试结果 |
| 电流测量 | 1mA分辨率 | 低功耗测试必备 |
| 通信接口 | USB/GPIB/LAN | 方便自动化控制 |
注意:可编程电源的输出线要尽量短,线太长会有压降。我曾经因为这个原因,测出来的电压总比设定值低0.1V,排查了半天才发现是线的问题。
3.2 软件环境:IDE、编译器、调试器
软件环境这块,我建议统一版本管理。团队里有人用Keil 5,有人用Keil 4,编译出来的结果都不一样,这怎么测?
3.2.1 IDE选择
我个人比较推荐VS Code + PlatformIO的组合。为什么?因为轻量、跨平台、插件丰富。当然,如果你用STM32,STM32CubeIDE也不错,集成了很多工具。
IDE配置要点:
- 安装必要的插件:C/C++、Python、Git
- 配置编译链路径:确保能找到arm-none-eabi-gcc
- 设置调试器:J-Link、ST-Link、DAP-Link都行
3.2.2 编译器
编译器版本要固定。我建议用GCC ARM Embedded,版本选9-2020-q2-update或者更新的。为什么?因为不同版本对代码优化不一样,可能导致同样的代码行为不同。
# 查看编译器版本
arm-none-eabi-gcc --version
# 编译选项示例
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -O2 -Wall -c main.c -o main.o
避坑指南:我曾经遇到过编译器优化等级从-O0改成-O2后,某个延时函数就不准了。原因是编译器把循环优化掉了。所以测试时,优化等级要和最终产品一致。
3.2.3 调试器
调试器我推荐J-Link,稳定、速度快。当然ST-Link也能用,但功能少一些。调试器配置要注意:
- SWD接口:只需要4根线(SWDIO、SWCLK、GND、VCC)
- 速度设置:一般4MHz够用,如果线长可以降到1MHz
- 固件更新:定期检查调试器固件版本
3.3 通信接口配置:UART/I2C/SPI
通信接口配置是测试环境搭建的重头戏。很多测试用例都依赖这些接口来收发数据。
3.3.1 UART配置
UART是最常用的调试接口。我一般这样配置:
// UART配置示例
typedef struct {
uint32_t baudrate; // 115200
uint8_t data_bits; // 8
uint8_t stop_bits; // 1
uint8_t parity; // 0: none
uint8_t flow_ctrl; // 0: none
} uart_config_t;
测试要点:
- 波特率要一致:MCU和PC端必须设置相同波特率
- 硬件流控:如果不用,两边都要关闭
- 回环测试:把TX和RX短接,发数据看能不能收到
我记得有一次,测试UART通信,数据总是丢包。排查了半天,发现是PC端的USB转串口线质量太差。换了根好的,问题就解决了。所以,别小看这些线材,它们也会影响测试结果。
3.3.2 I2C配置
I2C配置要注意上拉电阻和速率。我常用的配置:
| 参数 | 标准模式 | 快速模式 |
|---|---|---|
| 时钟频率 | 100kHz | 400kHz |
| 上拉电阻 | 4.7kΩ | 2.2kΩ |
| 总线电容 | <400pF | <200pF |
注意:I2C地址冲突是个常见问题。两个设备用同一个地址,总线就乱了。我建议在测试前,先用I2C扫描程序确认所有设备地址。
3.3.3 SPI配置
SPI配置相对简单,但要注意主从模式匹配。我一般这样配:
// SPI配置示例
typedef struct {
uint32_t clock_speed; // 1MHz ~ 10MHz
uint8_t mode; // 0~3
uint8_t bit_order; // MSB first or LSB first
uint8_t cs_polarity; // active low or high
} spi_config_t;
我的经验:SPI的时钟极性和相位(CPOL和CPHA)一定要匹配。我曾经因为CPOL设反了,数据读出来全是乱的。用示波器一看,时钟空闲电平不对,改过来就好了。
3.4 环境验证
环境搭好了,怎么验证它是不是对的?我有一套标准流程:
- 硬件检查:用万用表测电源电压,用示波器看时钟信号
- 软件检查:编译一个简单的LED闪烁程序,下载到板子上
- 通信检查:用UART发一个"Hello World",看PC端能不能收到
- 自动化检查:写一个简单的测试脚本,验证环境是否可被控制
环境验证清单:
- ☐ 示波器能正常触发并显示波形
- ☐ 万用表测量精度在误差范围内
- ☐ 可编程电源能通过程控设置电压电流
- ☐ IDE能正常编译并下载程序
- ☐ 调试器能连接目标板并单步执行
- ☐ UART/I2C/SPI通信正常
好了,测试环境搭建就讲到这里。下一章咱们开始讲测试用例设计,那才是真正考验功力的时候。记住,环境搭好了,测试就成功了一半。