SEGGER J-Link 进阶:J-Flash 量产工具与 SystemView 分析
目标
掌握 J-Flash 批量编程的多功能配置(序列号烧录、选项字节、保护位),以及 SystemView 的 RTOS 实时事件分析。
一、J-Flash 批量量产配置
1. 创建 J-Flash 工程
J-Flash → File → New Project
→ Target Device: STM32F407VG
→ Target Interface: SWD, Speed: 4000 kHz
→ Flash Bank: 自动检测
2. 配置自动序列号
Options → Project Settings → Production
☑ Program Serial Number
Address: 0x0800E000 (Flash 末尾专用区域)
Length: 4 bytes
Start Value: 100000
Increment: 1
Format: ASCII / Binary
3. 解锁 + 编程 + 锁定流程
Options → Project Settings → Production → Actions
执行顺序:
1. Unsecure Chip (解除保护)
2. Erase Sectors (擦除)
3. Program (编程)
4. Verify (校验)
5. Secure Chip (重新写保护 Level 1)
6. Start Application (运行)
4. 命令行调用(无头模式)
JFlash -openprj production.jflash \
-open firmware.hex \
-auto \
-exit
for i in {1..100}
JFlash -openprj production.jflash \
-open "firmware_v1.2.hex" \
-auto \
-exit
echo "设备 #$i 完成"
done
5. 序列号 CSV 定制
# serial_numbers.csv
Chip_ID,Serial_Number,Calibration_Value
1,SN-24001-A,0x3F2A
2,SN-24002-A,0x3F15
3,SN-24003-A,0x3F48
配合 J-Flash 的 Custom Init Steps 宏调用 CSV 写入每个设备。
二、SystemView — RTOS 实时可视化
1. 集成到 FreeRTOS 工程
#include "SEGGER_SYSVIEW.h"
#include "SEGGER_SYSVIEW_FreeRTOS.h"
int main(void) {
HAL_Init();
SystemClock_Config();
SEGGER_SYSVIEW_Conf();
SEGGER_SYSVIEW_Start();
SEGGER_SYSVIEW_PrintfHost("SystemView 初始化完成\n");
SEGGER_SYSVIEW_FreeRTOS_Init();
SEGGER_SYSVIEW_RecordVoid(0); // 事件 ID 0: 系统启动
vTaskStartScheduler();
}
void sensor_task(void *pv) {
while (1) {
SEGGER_SYSVIEW_RecordEnterISR(); // 标记任务开始
SEGGER_SYSVIEW_RecordExitISR();
SEGGER_SYSVIEW_OnUserStart(1); // 用户事件 1: 数据处理
process_data();
SEGGER_SYSVIEW_OnUserStop(1);
vTaskDelay(pdMS_TO_TICKS(100));
}
}
2. SystemView 分析
SystemView
3. 典型分析场景
| 问题 |
SystemView 发现 |
| 任务饥饿 |
低优先级任务长期不执行 |
| 中断轰炸 |
ISR 执行时间占比异常高 |
| 优先级翻转 |
高优任务被意外阻塞 |
| 内存泄漏 |
配合 Heap 监控发现 |
| 时序抖动 |
周期性任务的执行时间波动 |
三、J-Link Commander 诊断命令
JLinkExe -device STM32F407VG -if SWD -speed 4000
J-Link>
J-Link>
J-Link>
J-Link>
J-Link>
J-Link>
J-Link>
J-Link>
J-Link>
J-Link>
J-Link>
J-Link>
J-Link>
关键点
- J-Flash 命令行模式适合 CI/CD 产线自动化
- SystemView 需要 RTT 或 SEGGER 协议支持,比 J-Scope 提供更丰富的系统级信息
- 自定义事件 ID 0-31 为 SystemView 保留,用户事件从 32 开始
- J-Link Commander 是底层诊断利器,适合排查硬件连接问题
J-Link RTT 日志与 Ozone 调试入门
目标
使用 J-Link 的 RTT(Real Time Transfer)实现零额外硬件的高速日志输出,并用 Ozone 进行图形化调试。
硬件
- J-Link 调试器(EDU/Base/Plus 均可)+ STM32 开发板
- 仅需 SWD 两根线(SWDIO + SWCLK)+ GND
一、RTT 日志集成
1. 添加 RTT 源文件到工程
cp /opt/SEGGER/JLink/Samples/RTT/SEGGER_RTT_V*.zip .
unzip SEGGER_RTT_V*.zip
2. 初始化 RTT
#include "SEGGER_RTT.h"
int main(void) {
HAL_Init();
SystemClock_Config();
SEGGER_RTT_Init();
SEGGER_RTT_printf(0, "RTT 日志初始化完成!\n");
SEGGER_RTT_printf(0, "系统时钟: %lu Hz\n", HAL_RCC_GetSysClockFreq());
uint32_t count = 0;
uint32_t adc_value;
while (1) {
adc_value = (count * 37 + 1024) % 4096;
SEGGER_RTT_printf(0, "[%5lu] ADC: %4lu | 电压: %d.%03dV\n",
count, adc_value,
(adc_value * 3300) / 4096 / 1000,
(adc_value * 3300) / 4096 % 1000);
count++;
HAL_Delay(10);
}
}
3. 查看 RTT 输出
JLinkRTTViewer
JLinkRTTClient
JLinkRTTViewer -device STM32F407VG -if SWD -speed 4000
4. RTT 优势对比
| 方式 |
速度 |
占用引脚 |
对实时性影响 |
| UART printf |
~1 Mbps |
2 脚 (TX/RX) |
较高(阻塞) |
| SWO ITM |
~10 Mbps |
1 脚 (SWO) |
低 |
| RTT |
~100 Mbps |
0 脚 |
极低 |
RTT 通过 J-Link 的 SWD 通道传输,无需额外引脚!
二、Ozone 图形化调试
1. 启动 Ozone
ozone
2. 创建项目
- File → New Project Wizard
- 选择设备:
STM32F407VG
- 选择接口:
SWD,速度 4000 kHz
- 选择固件:
firmware.elf
- 点击 Finish
3. 调试功能演示
| 操作 |
方法 |
| 断点 |
单击行号左侧 |
| 变量监视 |
右键变量 → Watch |
| 数据采样 |
View → Data Sampling → 选择变量 → Start |
| 指令跟踪 |
View → Instruction Trace → 查看执行历史 |
| 代码分析 |
View → Code Profile → 查看函数执行时间占比 |
| 实时曲线 |
配合 J-Scope 查看变量波形 |
4. Ozone 脚本自动初始化
void OnProjectLoad(void) {
Target.SetTraceSource(TraceSource.ETB);
Target.EnableTrace(true);
}
void OnTargetHalt(void) {
Util.Log("Target halted at: " + Util.FormatAddress(CPU.PC()));
}
三、关键点
- RTT 默认使用上行通道 0,可通过
SEGGER_RTT_printf(channel, ...) 使用多个通道
- RTT 缓冲区大小在
SEGGER_RTT_Conf.h 的 BUFFER_SIZE_UP 中配置(默认 1024 字节)
- Ozone 免费提供给 J-Link 用户,功能远超 Keil/IAR 自带调试器