很多人刚听见「STM32示波器」,第一反应就是板子焊个TFT屏,波形直接在设备端画完。EMBO根本不走这条路。
采样全在STM32片内做完,触发面板、波形渲染、FFT运算全扔给电脑处理。一块两三块钱的Blue Pill最小系统板,刷上对应固件插USB,电脑端开Qt上位机,直接就能当示波器用。参数和台式专业仪器根本不是一个量级,作者自己在社区也明说:无输入保护、无硬件量程切换,标称采样率范围0.8~4MSps。它能活到现在,核心就两个理由:足够便宜,普通人照着文档走半小时就能跑通上手。
EMBO项目地址:github.com/parezj/EMBO,协议MIT,全栈作者是捷克理工大学测量系的Jakub Pařez,整个项目是他的硕士课题,开发期间还有ST官方的工程师提供过支持。仓库直接放了预编译好的HEX固件、全平台Win/Mac/Linux上位机和完整数据手册。
信号到底怎么走
图1:探头进 ADC,采样缓冲几乎占满 RAM(示意)
探头接完直连单片机脚,根本没绕什么复杂的外部电路,整条链路简单到离谱:
模拟输入脚 / 数字输入脚 → STM32片内自带ADC或GPIO → DMA直接往整块RAM里怼采样缓冲,几乎把RAM空间吃满 → FreeRTOS任务打包成帧 → USB CDC 或者 UART 走标准SCPI文本协议输出 → 电脑端Qt应用:直接分出示波器、逻辑分析仪、电压表多套界面目前官方给过稳定固件支持的芯片就这几颗:STM32F103C8(Blue Pill)、F103RE、F303RE、L412KB。像L0、G0、G4、F4这些系列,仓库里只有预留的工程文件,作者明确标了实验性分支,第一次上手复刻别直接从这些版本开刀。
这套固件里直接叠了六件仪器的能力:示波器、逻辑分析仪、电压表是三个核心主工具,频率计、PWM输出、信号发生器是三个并行可用的副工具,不用来回烧固件就能直接切换。信号发生器完全靠片内12位DAC驱动,只有自带DAC的芯片才能跑,最典型的就是F303RE,能输出正弦、三角、锯齿、方波、白噪声,临时当个低压恒压源用也没问题。Blue Pill用的F103C8没有片内DAC,上位机里信号发生器那栏直接灰了——不是你软件装坏了,是芯片本身就没这块外设。
通信链路没自己瞎写私有二进制协议,固件里直接嵌了标准SCPI解析器,电脑发纯文本命令,开发板回采样数据和运行状态。好处是你拿普通串口助手敲几行命令,就能确认固件是不是还正常运行;坏处是高采样率下走UART尤其是ST-LINK转串口的通道,延迟很容易飙到几百毫秒。上位机状态栏里的Latency一涨,先去查通信通道有没有堵,别上来就乱改触发电平。两种路径USB CDC和UART都能通,但吞吐和延迟差一截,追求稳定采样直接插板载USB CDC。
三个新手最容易想当然踩的坑
图2:一套固件里叠了示波器、逻辑分析仪和电压表等(示意)
1. 它不是成品,没有任何输入保护
作者当年在EEVblog论坛写得特别直白:这套开发板直出方案,没有任何输入保护电路、没有硬件输入衰减、没有量程切换。引脚上的输入电压必须卡在MCU能承受的范围里,过压、反接、靠近市电的高压信号,完全不在这个项目的设计目标里。想当日常调试工具用,前端分压、运放缓冲、过压保护得你自己加上去。第一次接线别直接把未知设备的信号脚往ADC上怼,先拿板上PWM输出接ADC回环测通,稳了再接外部电路。烧一个Blue Pill倒是不贵,炸坏你要测的目标板就得不偿失了。
2. 采样率别跨芯片瞎吹
作者公开的标称采样率是0.8~4MSps,实际数值完全取决于你用的芯片和开了多少并行通道。F303系列有多路独立ADC,峰值采样率表现自然比F103好不少;Blue Pill上的F103C8本身RAM容量就紧张,采样深度天生受限。F303RE的配置里DAQ缓冲最多能做到四万点量级。上位机的水平轴你可以手动调Fs和存储深度,也可以按当前显示宽度自动折中——界面波形随便缩放,所以它没按传统台式示波器「每格多少秒」的习惯来做交互。界面上标出来的Real Fs是实际测出的真实采样率,算频率全靠这个精度,别只盯着你自己手填的标称Fs瞎调参数。
3. 选FreeRTOS不是赶时髦,是被逼出来的
作者自己说选RTOS,核心需求就是看每个任务的栈余量HighWaterMark。主采样缓冲要尽可能铺满整块RAM,静态分配,整机运行时RAM占用直接顶到99%,不知道栈的剩余余量,高采样运行时分分钟直接爆栈死机。把采样、通信、控制拆成独立任务之后,还能接SEGGER SystemView看系统调度状态。FFT、平均滤波、8位传输加速、光标测量这些吃算力的活全扔给电脑端的FFTW3库做,开发板这边专心采样和传数据。新手改固件千万别上来就把EM_DAQ_MAX_MEM往大了拉,编译大概率能过,运行时栈和堆的边界却脆得一碰就碎,官方缓冲本来就已经贴着MCU的RAM上限了。
| 现象 | 优先排查方向 |
|---|---|
| 软件连不上开发板 | 端口选对没、烧的HEX是不是对应你手上的芯片、走的USB还是UART通道 |
| 波形全是噪声或者直接贴满上下边 | 输入信号有没有超量程、共地有没有接稳、信号源阻抗是不是太大 |
| 高采样率下丢点、频率计读数乱跳 | DMA过载;示波器拉满采样的时候其他并行仪器会抢资源 |
| 上位机找不到信号发生器入口 | 当前用的MCU有没有片内DAC,F103C8根本没有这个外设 |
| 自己编译链接失败、符号重复报错 | 新版本GCC/CubeIDE要额外加-fcommon;Release配置的头文件路径大概率不全 |
| 延迟长期卡在几百毫秒 | 换USB CDC通道试、少开几个并行仪器、别在UART通道上硬拉满最高采样率 |
电脑上位机实际用起来是什么样
主界面先选对串口号再点连接,连上之后窗口顶部会直接读出当前MCU型号和固件版本,你刷错了不匹配的HEX,这里第一时间就会露馅。
左侧面板放示波器、逻辑分析仪、电压表三个核心工具页,底部是频率计、PWM输出、信号发生器三个副工具。示波器操作逻辑和台式示波器几乎对齐:Run/Stop/Single三个基础控制,触发模式分Auto带超时、Normal、Single,边沿、通道、触发电平和预触发都能调。Auto模式最常用:逻辑上和Normal一致,但触发超时后也会强制出一屏波形,偶发弱信号不会让屏幕一直黑着。Utils菜单里能开平均滤波、降成8位传输提速、打开FFT;波形数据可导出CSV、TXT或截图。
逻辑分析仪共用大部分控件,触发去掉了电平触发只保留双边沿,数字信号不需要垂直增益,面板里直接把这个选项拿掉了。电压表固定采样率100Sps,靠NPLC平均压制50Hz工频干扰,测直流读数稳,但刷新慢;平均次数拉得越高,噪声越低,刷新也越慢。
PWM输出支持单通道或者同步双通道,临时驱小电机或者模拟正交编码够用。作者在文档里写明了:示波器或者逻辑分析仪拉满最高采样率时,频率计和PWM很容易被抢DMA资源,六个工具不可能同时拉满还全部稳定。频率计分慢速和快速两档:1MHz以下走慢速,更高切快速,两秒内没读到有效边沿就超时。
上手顺序:先烧通跑起来,再想着改源码
图3:先烧官方 HEX,用 PWM 回环到 ADC 看上位机有没有波形(示意)
别上来就开CubeIDE自己从头编译,按这个步骤走:
- 直接去Release页面下现成包。固件HEX按芯片挑,上位机选对应系统。官方压缩包里连数据手册一起放了,引脚和参数对照表直接查。
- 对着引脚图接线。README里有F103C8和F303RE的Pinout,模拟通道、数字通道、PWM/DAC出口别接混。这种无隔离前端,地线必须和信号源共接,浮地探头采出来全是噪声。
- 烧完固件上电,电脑选对端口连接。主窗口能读到MCU型号和固件信息,再开示波器。连型号都读不到,别着急调触发电平,先回去查连接。
- 先做自测。拿板上的PWM或者信号发生器绕回ADC,确认触发、时基、通道开关正常。这一步通了,再接外部待测电路。
- 单独测试电压表。慢慢拉大平均次数,看读数稳不稳,顺便感受没有前端衰减时的原生量程,别上来就怼高压。
- 全跑通了再开CubeIDE改固件。新版本工具链记得给GCC加
-fcommon,优先用Debug配置核对头文件路径。自己编出来的HEX体积和官方差太多,先对比链接脚本和优化选项,别上来就动采样缓冲。Cube包版本尽量贴近作者工程,跨大版本强行编译,坑多半在底层外设配置。
最后说死几个明确边界
- 它绝对不是带高压探头、带多档硬件衰减的消费级成品示波器,无保护裸前端,输入电压和源阻抗必须你自己把关,别作死直接碰市电。
- 采样率和采样深度受限于MCU的ADC性能和RAM容量,0.8~4MSps是作者实测的公开口径,别信营销号吹出来的虚高峰值。
- 信号发生器完全依赖片内DAC,不是支持列表里的芯片都自带DAC,买板子之前先查手册。
- 自己从源码编译时,坑多半出在工具链配置上,不是业务代码逻辑。官方预编译HEX能跑通,再动手动工程。
- 项目协议MIT,背景是捷克理工大学测量系的学生课题;主页 embo.jakubparez.com,仓库 github.com/parezj/EMBO。
参考
- https://github.com/parezj/EMBO
- https://embo.jakubparez.com
- https://www.eevblog.com/forum/projects/embo-embedded-oscilloscope-(stm32-bluepill-nucleo)-for-win-mac-linux/