# scope_to_be_completed **Repository Path**: caraba/scope_to_be_completed ## Basic Information - **Project Name**: scope_to_be_completed - **Description**: 基于stm32g4的scope - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-07-09 - **Last Updated**: 2026-07-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ScopeV1 — 虚拟示波器 & 信号发生器 基于 STM32G474VET6 的 USB 虚拟示波器与信号发生器,通过 PC 上位机实时控制与显示。 ## 功能概述 ### 信号发生器(DAC) - 支持 **正弦波 / 方波 / 三角波 / 锯齿波** 四种波形 - 频率范围:1 Hz ~ 50 kHz - 幅度调节:0 ~ 4095(12 位 DAC) - TIM2 ISR 驱动,128 点波形查找表 ### 虚拟示波器(ADC) - 12 位分辨率,与 DAC 同步采样(TIM2 TRGO 触发) - DMA 双缓冲循环采集,256 点/半缓冲 - 数据通过 USART2 实时上传至 PC ### 上位机软件 - 串口连接,默认波特率 921600 - 波形实时显示(matplotlib) - 信号源参数在线控制(波形类型 / 频率 / 幅度) - 采集启停控制 ## 硬件平台 | 项目 | 说明 | |------|------| | MCU | STM32G474VET6 (Cortex-M4, 512KB Flash, 128KB RAM) | | 主频 | 150 MHz(HSI → PLL) | | 开发板 | NUCLEO-G474RE 或兼容板 | | 编译环境 | CMake + Ninja + arm-none-eabi-gcc | ### 引脚连接 | 引脚 | 功能 | 说明 | |------|------|------| | PA5 | DAC1_OUT2 | 信号输出,需用杜邦线连接至 PA1 | | PA1 | ADC1_IN2 | 信号采集输入端 | | PA2 | USART2_TX | 串口发送,接 USB-UART 的 RX | | PA3 | USART2_RX | 串口接收,接 USB-UART 的 TX | | PA13 | SWDIO | 调试接口(SWD) | | PA14 | SWCLK | 调试接口(SWD) | > **关键步骤**:用一根杜邦线将 **PA5** 与 **PA1** 短接,形成 DAC → ADC 的物理信号回路。 ## 目录结构 ``` ScopeV1/ ├── Core/ │ ├── Inc/ │ │ ├── main.h │ │ ├── gpio.h │ │ ├── stm32g4xx_hal_conf.h # HAL 模块配置 │ │ ├── stm32g4xx_it.h │ │ └── User/ # 用户模块头文件 │ │ ├── dac.h # DAC 信号发生器 │ │ ├── adc.h # ADC 数据采集 │ │ ├── uart.h # UART 通信协议 │ │ └── scope_app.h # 应用层集成 │ └── Src/ │ ├── main.c # 主程序入口 │ ├── gpio.c # GPIO 引脚配置 │ ├── stm32g4xx_it.c # 中断服务函数 │ ├── stm32g4xx_hal_msp.c # HAL MSP 初始化 │ └── User/ # 用户模块源文件 │ ├── dac.c │ ├── adc.c │ ├── uart.c │ └── scope_app.c ├── Drivers/ │ ├── CMSIS/ │ └── STM32G4xx_HAL_Driver/ # HAL 库驱动 ├── cmake/ │ ├── gcc-arm-none-eabi.cmake # 交叉编译工具链 │ └── stm32cubemx/ # CubeMX 生成的 CMake 模块 ├── PC_Host/ │ └── scope_host.py # PC 上位机(Python) ├── ScopeV1.ioc # STM32CubeMX 工程文件 ├── STM32G474XX_FLASH.ld # 链接脚本 ├── CMakeLists.txt # 顶层 CMake └── CMakePresets.json # CMake 预设 ``` ## 快速开始 ### 1. 编译 MCU 固件 ```bash # 配置(首次或修改 CMake 后) cmake --preset Debug -B build/Debug -G Ninja # 编译 cmake --build build/Debug ``` 编译产物:`build/Debug/ScopeV1.elf` ### 2. 烧录固件 使用 STM32CubeProgrammer 或 OpenOCD: ```bash # STM32CubeProgrammer STM32_Programmer_CLI -c port=SWD -w build/Debug/ScopeV1.elf -rst # 或使用 OpenOCD openocd -f interface/stlink.cfg -f target/stm32g4x.cfg -c "program build/Debug/ScopeV1.elf verify reset exit" ``` ### 3. 硬件接线 1. 用杜邦线连接 **PA5** ↔ **PA1** 2. 将 USB-UART 模块连接至 PA2 (TX)、PA3 (RX)、GND ### 4. 安装上位机依赖 ```bash pip install pyserial numpy matplotlib ``` ### 5. 运行上位机 ```bash python PC_Host/scope_host.py ``` 操作流程: 1. 选择串口号,点击 **Connect** 2. 在 Signal Generator 面板选择波形、设置频率和幅度 3. 点击 **START** 开始采集和显示 4. 点击 **STOP** 停止 ## 通信协议 ### PC → MCU(文本命令,以 `\r\n` 结尾) | 命令 | 说明 | 示例 | |------|------|------| | `WAVE <类型>` | 设置波形 | `WAVE SINE` / `WAVE SQUARE` / `WAVE TRIANGLE` / `WAVE SAWTOOTH` | | `FREQ <频率>` | 设置频率 (Hz) | `FREQ 1000` | | `AMP <幅度>` | 设置幅度 (0-4095) | `AMP 2048` | | `START` | 启动信号输出与采集 | `START` | | `STOP` | 停止信号输出与采集 | `STOP` | ### MCU → PC(二进制数据包) ``` ┌──────┬──────┬────────┬──────────────────┬────────┐ │ 0xAA │ 0x55 │ 长度(2B)│ ADC数据(N×2字节) │ CRC16 │ └──────┴──────┴────────┴──────────────────┴────────┘ ``` - 帧头:`0xAA 0x55` - 长度:uint16,样本数量(大端序) - 数据:每个 ADC 样本占 2 字节(大端序,uint16) - CRC16-IBM 校验(小端序) ## 波形实现 每种波形使用 128 点查找表(LUT),由 TIM2 定时中断驱动 DAC 循环输出: | 波形 | 实现方式 | |------|----------| | 正弦波 | 预置 128 点 12-bit 正弦表,按幅度缩放 | | 方波 | 前 64 点 = 满幅,后 64 点 = 0 | | 三角波 | 线性递增 → 线性递减 | | 锯齿波 | 线性递增,128 点后复位 | 频率计算公式:`f_out = SYSCLK / (prescaler + 1) / period / 128` ## 注意事项 1. PA5(DAC 输出)必须通过杜邦线连接到 PA1(ADC 输入),否则 ADC 采集不到信号 2. USART2 默认波特率为 921600,上位机连接时请确保 USB-UART 模块支持该速率 3. 如果频率设置过高导致波形失真,可调整 DAC/ADC 的 TIM prescaler 值 4. 建议使用带屏蔽的杜邦线或短引线,减少高频时的信号串扰