什么是MCUViewer?
先来一句大白话:MCUViewer,就是个专门给STM32(还有其他Cortex-M芯片)用的实时可视化调试神器。原名STMViewer,1.1.0之前开源,后面闭源了,但源码还能在这里找到。它分成两个模块:
-
• 变量查看器(Variable Viewer):不用改代码、不占CPU,直接从RAM「扒」变量值,画到图表里,滚动更新。
-
• Trace查看器(Trace Viewer):拿SWO硬件Trace接口,高频信号、函数耗时,一网打尽。
连接方式?就是把ST-Link或JLink插上,别忘了SWDIO/SWCLK/SWO/GND,全靠硬件支持,完全无侵入。
它解决了哪些痛点?
在嵌入式世界,调试往往靠printf、UART,甚至逻辑分析仪。问题来了:
-
• printf太慢,还占闪存、CPU,实时性极差。
-
• UART数据量小,高频信号丢帧丢到怀疑人生。
-
• STMStudio不更新,Windows专属、C++名字乱。
-
• CubeMonitor功能重、上手慢,画个变量得点半天。
MCUViewer就针对这些恼人点:零成本(硬件已有)、实时、跨平台(Linux/Win)、支持JLink、对C++友好,还能做高频Trace。
核心功能展示
Variable Viewer
-
• 从*.elf里自动解析符号表
-
• 实时读RAM、图表里刷新
-
• 拖拽、自定义轴、日志导出
Trace Viewer
-
• SWO波形解析成波形图
-
• 支持数字tag:函数enter/exit耗时测量
-
• 支持模拟量:ADC/sin波之类的高频信号
代码示例:实战上手
-
1. 变量Viewer(CubeIDE演示)
// 假设有个全局变量
volatile uint32_t sensor_val =0;
int main(void){
HAL_Init();
MX_USART2_UART_Init();
while(1){
sensor_val = read_adc();// MCUViewer里能看到sensor_val实时变化
HAL_Delay(10);
}
}
-
• 在MCUViewer里:Options → Acquisition Settings → 导入*.elf → 选sensor_val → Update → 拖进Plot。
-
1. Trace Viewer
// 在SystemCoreClock=160MHz,SWO引脚已打开
for(uint32_t i =0; i <1000; i++){
ITM->PORT[0].u8 =0xAA;// 进入标记
foo();// 业务函数
ITM->PORT[0].u8 =0xBB;// 退出标记
float x =sin(10.0f* i);
ITM->PORT[1].u32 =*(uint32_t*)&x;// 模拟量Trace
}
-
• 设置Trace prescaler,确保SWO频率低于Probe最大值。按STOPPED就能看到时序图。
优缺点一览表
|
优点 |
缺点 |
|
⎯⎯⎯ 零开销:不占CPU,不占串口 |
⎯⎯⎯ 变量必须是全局,地址要固定 |
|
⎯⎯⎯ 即插即用:支持STLink/JLink,跨Win/Linux |
⎯⎯⎯ 64位变量(double/uint64_t)暂不支持 |
|
⎯⎯⎯ SWO硬件Trace:高频信号随你看 |
⎯⎯⎯ 部分MCU的SWO设置较繁琐,需要额外查资料 |
|
⎯⎯⎯ 开源(1.1.0):可编译,可定制 |
⎯⎯⎯ 最新版本已闭源,仅保留旧Release源码 |
总结
MCUViewer就像给STM32加装了个「外挂显卡」,把CPU寄存器、全局变量、SWO Trace都直观化。用过一次,你就回不去printf串口轰炸,也懒得写日志文件了。唯一要忍受的是全局变量的“地址锁定”,以及偶尔要调点SWO设置。总体靠谱、上手快,特别推荐经常调试电机控制、ADC信号、实时算法的工程师试一试。
项目地址:https://github.com/klonyyy/MCUViewer