第二章 测试环境搭建:硬件平台与软件工具链配置
做智能电表固件测试,第一步就是把“战场”给搭起来。说白了,没有一套趁手的硬件和软件环境,后面所有的自动化测试都是空中楼阁。我个人习惯把环境搭建分成两大块:硬件平台和软件工具链。咱们一个一个来聊。
2.1 硬件平台:开发板与仿真器
智能电表的核心芯片,现在主流是ARM Cortex-M系列,比如M0+、M3、M4。我建议你手头至少准备两块开发板。一块是原厂评估板,另一块是你们自己设计的电表主板。为什么?
- 原厂评估板:芯片厂商给的,引脚全引出,调试方便。适合验证底层驱动和协议栈。
- 自研主板:这才是最终产品。上面有计量芯片、LCD、ESAM安全模块、继电器驱动等。固件最终要跑在这上面。
仿真器这块,我个人最常用的是J-Link。它稳定、速度快,支持Cortex-M全系列。嗯,这里要注意:
硬件平台清单,我整理了一个表格,方便你对照准备:
| 硬件名称 | 推荐型号/规格 | 用途说明 |
|---|---|---|
| 开发板 | STM32F407VG Discovery 或 国产GD32F450I-EVAL | 跑协议栈、验证外设驱动 |
| 自研电表主板 | 根据项目定制(含RN8302B计量芯片) | 最终固件运行与功能测试 |
| 仿真器 | SEGGER J-Link EDU Mini 或 J-Link Plus | 下载、调试、单步执行 |
| 串口转USB模块 | FT232RL 或 CH340G | 打印日志、交互命令 |
| 可调电源 | 0-30V / 3A 直流稳压电源 | 模拟电表供电(220V转低压) |
2.2 软件工具链:IDE、编译器与调试器
软件环境,我习惯用“工具链”这个词。它不是一个软件,而是一整套流程。你想想看,从写代码到烧录到芯片里跑起来,中间要经过编译、链接、调试好几个环节。
2.2.1 IDE的选择
IDE(集成开发环境)是咱们写代码的主战场。我个人推荐两种:
- Keil MDK-ARM:老牌工具,电表行业用得最多。它的编译器优化好,生成的代码体积小。但它是收费的,而且界面有点“复古”。
- VS Code + EIDE插件:免费、轻量、插件丰富。我最近两年一直在用。配合Cortex-Debug插件,调试体验不输Keil。
2.2.2 编译器配置
编译器,说白了就是把C代码变成机器指令的工具。ARM Cortex-M系列,主流编译器有:
- ARMCC (Keil自带):编译快,代码密度高。但不开源,只能在Keil里用。
- GCC ARM Embedded:开源免费,跨平台。我建议你用这个做自动化测试,因为可以在Linux服务器上跑。
这里给一个GCC编译器的基本配置示例,用于编译电表固件:
# 编译器路径
CC = arm-none-eabi-gcc
# 芯片型号:STM32F407VG
MCU = -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16
# 优化等级:-Os 减小代码体积
CFLAGS = $(MCU) -Os -Wall -Wextra -std=c99
# 链接脚本
LDFLAGS = $(MCU) -T stm32f407vg_flash.ld -specs=nano.specs -specs=nosys.specs
# 编译命令示例
$(CC) $(CFLAGS) -c main.c -o main.o
$(CC) $(LDFLAGS) main.o startup_stm32f407xx.o -o firmware.elf
为什么会用 -Os 优化?因为电表固件通常放在Flash里,空间有限。我遇到过代码编译出来超了Flash大小,最后不得不砍功能。从那以后,我默认都用 -Os。
2.2.3 调试器配置
调试器,就是咱们和芯片沟通的“翻译官”。J-Link配合GDB,是最经典的组合。配置起来其实不复杂:
- 安装J-Link驱动(SEGGER官网下载)
- 启动J-Link GDB Server
- 在IDE或命令行中连接GDB Server
用VS Code调试时,launch.json 配置如下:
{
"version": "0.2.0",
"configurations": [
{
"name": "J-Link Debug",
"type": "cortex-debug",
"request": "launch",
"servertype": "jlink",
"device": "STM32F407VG",
"interface": "swd",
"executable": "./build/firmware.elf",
"svdFile": "./STM32F407VG.svd"
}
]
}
嗯,这里有个小细节:svdFile 这个文件,包含了芯片所有寄存器的地址和位定义。有了它,调试时可以直接看寄存器值,不用去翻数据手册。我建议你从芯片厂商官网下载对应型号的SVD文件。
2.3 环境验证:跑一个点灯程序
环境搭好了,怎么知道对不对?跑一个最简单的“点灯”程序。电表主板上一般都有LED指示灯,比如运行指示灯、脉冲指示灯。
代码很简单:
#include "stm32f4xx.h"
void delay(volatile uint32_t count) {
while(count--);
}
int main(void) {
// 使能GPIOD时钟
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
// 配置PD12为推挽输出
GPIOD->MODER |= GPIO_MODER_MODER12_0;
GPIOD->OTYPER &= ~GPIO_OTYPER_OT_12;
while(1) {
GPIOD->BSRR = GPIO_BSRR_BS_12; // 点亮LED
delay(500000);
GPIOD->BSRR = GPIO_BSRR_BR_12; // 熄灭LED
delay(500000);
}
}
编译、下载、复位。如果LED开始闪烁,恭喜你,环境搭建成功了!
我记得第一次给新人搭环境时,他卡在“点灯”这一步整整一天。最后发现是仿真器的SWD接口没接GND。你看,有时候问题就这么简单。所以,别怕踩坑,多试几次就熟了。