1. 项目概述
这个语音存储与回放系统是我去年为一个工业质检项目开发的辅助工具。当时产线上需要记录质检员的语音评语并与产品条码关联,市面上现成的录音设备要么太贵,要么功能冗余。于是我用STM32F103C8T6单片机为核心,搭配VS1053音频编解码芯片,设计了一套低成本、高可靠性的语音记录解决方案。
系统实测可以存储长达4小时的16kHz采样率音频,支持按键控制录音/播放,通过SPI闪存保存音频数据。整套方案BOM成本不到50元,比商业录音笔便宜80%以上,特别适合需要嵌入式语音功能的工业场景。
2. 硬件设计解析
2.1 核心器件选型
主控选用STM32F103C8T6是因为:
- 72MHz主频足够处理音频数据流
- 内置硬件SPI接口(最高18Mbps)
- 48KB SRAM可做音频缓冲
- 价格仅8元左右
VS1053编解码芯片的优势在于:
- 支持MP3/ADPCM/WAV等多种格式
- 内置DAC/ADC和耳机放大器
- 通过SPI与主控通信
- 功耗仅12mA@3.3V
存储介质采用W25Q128 SPI Flash:
- 128Mbit容量(16MB)
- 10万次擦写寿命
- 支持SPI Mode 0/3
- 单价约3.5元
2.2 关键电路设计
电源部分采用AMS1117-3.3V稳压芯片,输入5V输出3.3V,需注意:
- 输入输出各接100μF+0.1μF电容滤波
- VS1053的模拟供电需额外LC滤波
音频输入电路:
- 驻极体麦克风需2.2kΩ偏置电阻
- 加入RC高通滤波(C=1μF, R=10kΩ)
- VS1053的MIC输入引脚要接1μF隔直电容
SPI总线布局要点:
- SCK线长不超过10cm
- MISO/MOSI走线等长
- 片选信号加10kΩ上拉
- Flash芯片靠近主控放置
3. 软件实现细节
3.1 音频采集流程
c复制void RecordTask(void) {
VS1053_Init(16000); // 16kHz采样率
W25Q_EraseSector(0);
while(1) {
if(KEY_RecordPressed()) {
uint16_t buf[512];
VS1053_Record(buf, 512);
W25Q_Write(buf, 512*2);
}
}
}
关键参数说明:
- 采样率16kHz时,VS1053输出16位PCM数据
- 每512样本写入Flash一次(1KB数据)
- 128Mbit Flash可存储约4小时音频
3.2 音频回放优化
实测发现直接读取Flash播放会有卡顿,解决方法:
- 开辟双缓冲:8KB BufferA/B
- DMA传输BufferA时填充BufferB
- 使用定时器触发DMA传输
c复制// DMA配置示例
DMA_InitStructure.DMA_BufferSize = 4096;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)BufferA;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_Init(SPI2, &DMA_InitStructure);
3.3 文件系统设计
为管理多段录音,设计了简易文件系统:
code复制| 文件头(64B) | 音频数据1 | 音频数据2 |...
文件头结构体:
c复制typedef struct {
char magic[4]; // "VOIC"
uint32_t count; // 文件数
uint32_t offset[50]; // 各文件起始地址
} VoiceHeader;
4. 实测性能与优化
4.1 功耗测试
- 待机状态:3.2mA(仅MCU运行)
- 录音状态:18.7mA(含Flash写入)
- 播放状态:22.1mA(含DAC输出)
通过以下措施降低功耗:
- 非活动时关闭VS1053时钟
- Flash写入后进入DeepPowerDown
- 降低GPIO引脚驱动强度
4.2 音质优化技巧
改善录音质量的实操方法:
- 在VS1053的AGCCFG寄存器关闭自动增益
- 通过SCI_BASS指令增强低频响应
- 软件实现5段均衡器:
c复制void EQ_Set(uint8_t band, int8_t gain) {
VS1053_WriteReg(SCI_BASS,
(gain & 0xF) << (band*4));
}
4.3 工业环境适配
针对产线环境的特殊处理:
- 在MIC输入端增加TVS二极管防ESD
- 外壳采用铝合金屏蔽电磁干扰
- 按键使用光耦隔离设计
- 增加看门狗和异常重启机制
5. 常见问题排查
5.1 录音有杂音
可能原因及解决方法:
- 电源干扰 → 检查3.3V纹波(应<50mV)
- 地线环路 → 改用星型接地
- 麦克风偏置电压不稳 → 增加LC滤波
5.2 Flash写入失败
典型错误现象及处理:
- 错误现象:写入后校验失败
- 检查步骤:
- 测量Flash的VCC是否≥2.7V
- 用逻辑分析仪抓SPI时序
- 确认片选信号保持低电平
5.3 播放卡顿
性能优化检查清单:
- [ ] DMA缓冲区是否够大(建议≥8KB)
- [ ] SPI时钟是否≥8MHz
- [ ] 是否启用了Flash的Quad I/O模式
- [ ] 检查堆栈空间是否充足
6. 扩展应用方向
这套系统经过简单修改可以实现:
- 语音备忘录:增加RTC芯片记录时间戳
- 报警记录仪:配合传感器触发录音
- 语音提示器:预存标准化语音指令
- 教学录音笔:增加USB音频导出功能
我在最新版本中增加了BLE模块,现在可以通过手机APP查看录音列表和控制播放。实际测试传输10秒音频仅需1.3秒,比传统的U盘导出方便很多。
