Oscilloscope for MCU
MCU: STM32F103C8Tx
需
这是
- Timer
触 发ADC+DMA精 确采样 - ADC
数 值已校 准 (使用 内部 基 准 电压) 采 样率无级可 调最高 采 样率1Msps采 样深度 可 调当 前 6144(1024*6)点 内 置 自 测信号 (1kHz 方 波 )多 种触发方式 (自 动、正常 、单次)- FFT频谱
分析 (上位 机 实现) - USB CDC
高速 数 据 传输
未 设计前 端 运放电路,只 用 于采集 0~3.3V信号 。- 为了
采 样精度 和 校 准 ,当 前 最高 采 样率: 70ksps
PA0 | ADC |
PA11 | USB DM USB |
PA12 | USB DP USB |
PC13 | LED |
PA8 | 1 |
PA9 | USART1 TX 调试 |
PA10 | USART1 RX 调试 |
设计
需要 C++11支持 ,推荐使用 arm-none-eabi编译器 和 cmake构建,已 在 Windows、macOS、Ubuntu下 测试通 过。- 为了
方便 软件设计和 数 据 解析 ,直接 打 包 结构体 作 为消息 单元。注意 要 和上 位 机 保持 一致 的 字 节序(arm、x86、arduino均 为小端 模 式 )。
初 始 化 scope
// 在 全局 初 始 化
static const size_t MaxSn = 1024 * 6; // 取 决于RAM大小
static uint8_t Buffer[Message::CalcBytes(MaxSn)];
static ScopeMCU scopeMcu(MaxSn, Buffer);
...
scopeMcu.setVolLimits(0, 3300);
scopeMcu.setFsLimits(1, 10000);
scopeMcu.setMcuImpl(
{
.sendData = [](uint8_t* data, size_t size) {
// 用 串 口 发送数 据
},
.startADC = []{
// 开始采 样
},
.stopADC = []{
// 停止 采 样
},
.setSampleFs = [](uint32_t fs) {
// 设置采 样率 返 回 实际的 采 样率
},
.onSampling = [](bool sampling) {
// 可用 来 控 制 指示 灯 状 态
},
});
当 收 到 串 口数 据
scopeMcu.onRead(data, size);
当 一 次 ADC转换完成
scopeMcu.onADC(vol);
startADC
之 前 不要 触 发onADC
- STM32CubeMX
- arm-none-eabi-gcc
- CLion(CMake)
- OpenOCD
- ST-LINK
- config OpenOCD and ST-LINK
brew install openocd
brew install stlink
brew cask install gcc-arm-embedded