002 使用单片机实现的逻辑分析仪——扩展篇
01 使用STM32F407VET6完成逻辑分析仪基本功能
1.时间测量:
测量操作的时间
读 GPIO 操作
100次654ns,一次6.54ns
读写 buffer
读:643ns,一次6.43ns
写:642ns,一次6.42ns
NOP 指令:618ns,一次6.18ns
逻辑右移:615ns,一次6.15ns
加法操作:618ns,一次6.18ns
结论:循环一次耗时 6.54+6.18+6.43+6.18=25.33ns,理论上最高的采样频率约=1/25.4ns=39MHz。
你也肯定发现了,使用GPIO+DMA的采样频率理论应该比这个更快。但那是不可控的,且无法对内存存储进行压缩:
软件获取GPIO方式
1.内存优化原理
- 变化电平存储:通过记录电平变化的时刻和状态,而非连续采样,可大幅减少内存占用(例如仅存储跳变时间戳和跳变方向)
- 环形缓冲区(Ring Buffer):利用循环队列管理数据,覆盖旧数据时无需额外内存分配,适用于长时间运行场景
- 数据压缩算法:如游程编码(Run-Length Encoding),将连续相同电平合并为“计次+电平值”的格式
2. 性能限制
- 采样频率:受限于CPU中断响应时间和软件处理开销,实际采样率通常为 10-50kHz(STM32F103主频72MHz下)
- 实时性:中断延迟可能导致信号丢失,尤其在多任务系统中
DMA+GPIO方式
1.高采样率实现
- 硬件级传输:DMA直接从GPIO寄存器(如IDR)读取数据到内存,无需CPU干预,理论采样率可达 主频的1/2(如STM32F407主频168MHz时约84Msps)
- 触发同步:可通过定时器触发DMA传输,实现精确的等间隔采样(如PWM信号分析)
2. 内存消耗特性
- 固定内存分配:需预定义缓冲区大小,无法动态调整。例如,1秒的100MHz采样需100MB内存,对STM32的SRAM(通常<1MB)不现实
- 优化可能性:可通过 双缓冲技术 或 循环DMA模式 减少数据覆盖风险,但无法像软件方式动态压缩数据
总结:
软件方式:内存优化灵活,但需牺牲采样率。例如,仅存储跳变事件时,内存消耗可降低至DMA方式的 1/1000 以下
DMA方式:内存消耗固定,但可通过 外扩RAM 或 分段存储 扩展实际采样时长(需硬件支持)
| 指标 | 软件方式 | DMA方式 |
|---|---|---|
| 最大采样率 | 39MHz | 168MHz |
| 信号完整性 | 可能丢失高频细节 | 完整捕获跳变沿 |
| CPU占用率 | 80%-100% | 1%-10% |
2.移植USB(标准库)
https://www.st.com.cn/zh/embedded-software/stsw-stm32121.html
https://www.st.com.cn/zh/embedded-software/stsw-stm32046.html#documentation
移植后效果:
02 增加Bootloader引导程序
在boot程序中,我使用PC=0800 0000
并将主程序的中断向量表进行偏移到
效果:
03 未来优化方向
增加引脚策略
考虑共用体与位域
union SensorData { uint32_t raw; // 4字节 uint8_t bytes[4]; // 4字节 struct { // 4字节 uint16_t temp; uint16_t humidity; }; };- 内存布局:所有成员共享同一内存段(4字节)
- 访问方式:可通过不同成员以不同格式解读数据
- 应用场景:可用这种方式解析不同格式的采样数据
