MCUViewer:一个基于 GUI 的微控制器(MCU)调试神器

什么是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. 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. 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

发表评论