第三章:测试环境搭建

好,咱们进入第三章。说实话,测试环境搭建这事儿,看着简单,但坑特别多。我见过不少团队,代码写得漂亮,结果环境没搭好,一跑测试全崩了。今天我就把这些年踩过的坑,还有总结出来的经验,一次性说清楚。

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 环境验证

环境搭好了,怎么验证它是不是对的?我有一套标准流程:

  1. 硬件检查:用万用表测电源电压,用示波器看时钟信号
  2. 软件检查:编译一个简单的LED闪烁程序,下载到板子上
  3. 通信检查:用UART发一个"Hello World",看PC端能不能收到
  4. 自动化检查:写一个简单的测试脚本,验证环境是否可被控制

环境验证清单:

  • ☐ 示波器能正常触发并显示波形
  • ☐ 万用表测量精度在误差范围内
  • ☐ 可编程电源能通过程控设置电压电流
  • ☐ IDE能正常编译并下载程序
  • ☐ 调试器能连接目标板并单步执行
  • ☐ UART/I2C/SPI通信正常

好了,测试环境搭建就讲到这里。下一章咱们开始讲测试用例设计,那才是真正考验功力的时候。记住,环境搭好了,测试就成功了一半。