用STM32F103C8T6+VS1053B做一个自己的录音笔:从硬件选型到FATFS文件系统移植全记录

张开发
2026/6/4 14:22:20 15 分钟阅读
用STM32F103C8T6+VS1053B做一个自己的录音笔:从硬件选型到FATFS文件系统移植全记录
STM32F103C8T6VS1053B录音笔实战从硬件焊接到底层驱动全解析引言记得第一次尝试DIY录音设备是在大学电子设计课上当时用洞洞板搭的电路噪音大到根本听不清人声。这次我们选用STM32F103C8T6作为主控搭配专业音频编解码芯片VS1053B打造一个真正可用的便携录音笔。不同于市面上现成的开发板教程本文将重点分享我在实际项目中遇到的SPI冲突解决、FATFS移植陷阱、以及如何优化麦克风电路等实战经验。这个项目的独特价值在于它不仅仅是一份技术参数的堆砌而是完整呈现了从元器件选型到产品级调试的全过程。你会看到如何用20元左右的成本打造一个支持WAV/MP3双格式、带OLED显示、续航超过8小时的专业级录音设备。以下是我们在开发过程中验证过的硬件组合方案核心控制器STM32F103C8T6蓝色pill开发板音频编解码VS1053B模块带咪头接口存储介质MicroSD卡FAT32格式用户界面0.96寸OLEDI2C接口电源管理AMS1117-3.3VLIR2032备用电池1. 硬件设计与焊接要点1.1 元器件选型背后的思考为什么选择STM32F103C8T6这颗已经面市十余年的MCU在对比了STM32G030性价比高但外设少和ESP32无线功能冗余后最终选定F103系列基于三个实际考量SPI接口独立性需要同时驱动VS1053B和SD卡F103的SPI1和SPI2可以完全独立工作DMA支持音频数据传输需要DMA1通道3和5开发效率标准库资料丰富减少底层调试时间VS1053B模块选购时要注意版本差异建议选择带有LINE IN和MIC双输入的模块。实测发现某些廉价模块的麦克风放大电路偷工减料信噪比不足60dB。这里给出我们的硬件连接对照表信号线STM32引脚VS1053B引脚注意事项SPI_SCKPA5SCK需加10Ω电阻防振铃SPI_MISOPA6SO必须上拉4.7kΩSPI_MOSIPA7SI走线尽量短XCS控制线PB0XCS音频命令选择XDCS控制线PB1XDCS音频数据选择DREQ状态线PA0DREQ中断方式检测最佳1.2 焊接过程中的坑与解决方案第一次焊接VS1053B模块时因为疏忽了散热问题导致芯片工作异常。以下是血泪教训总结温度控制建议使用刀头烙铁温度设置在300℃以下每个引脚焊接时间不超过3秒引脚检查用放大镜确认无桥接特别注意间距仅0.5mm的SDATA引脚电源滤波在VS1053B的3.3V入口处并联100μF0.1μF电容组合遇到最诡异的问题是录音时有规律性咔嗒声最终发现是SD卡SPI时钟线与麦克风线路平行走线导致。修改PCB布局为垂直交叉后问题解决。如果使用面包板搭建原型强烈建议// 硬件初始化顺序至关重要 void Hardware_Init() { GPIO_Init(); // 先配置所有控制线为输出高 SD_SPI_Init(); // 初始化SD卡SPI(SPI1) delay_ms(10); // 等待SD卡稳定 VS1053_Init(); // 初始化音频芯片SPI(SPI2) OLED_Init(); // 最后初始化I2C设备 }2. 底层驱动开发关键点2.1 VS1053B的非常规初始化大多数教程不会告诉你的是VS1053B上电后需要特殊唤醒序列。我们发现直接按照数据手册初始化会导致20%概率设备无响应。经过逻辑分析仪抓包最终采用的可靠初始化流程发送至少1ms的低电平到XRST复位引脚先配置时钟寄存器SCI_CLOCKF再设置模式寄存器SCI_MODE写入0x0800到SCI_BASS寄存器增强低频响应加载官方补丁程序需从VLSI官网下载最新plg文件录音参数配置也有讲究推荐采用以下配置组合// VS1053B录音参数设置 void VS1053_RecordConfig() { WriteVS10xx(SCI_AICTRL0, 8000); // 采样率8kHz WriteVS10xx(SCI_AICTRL1, 3); // 自动增益控制 WriteVS10xx(SCI_AICTRL2, 0); // 左/右声道均开启 WriteVS10xx(SCI_AICTRL3, 0x20); // 启用数字高通滤波 }2.2 双SPI设备冲突处理当SD卡和VS1053B同时工作时SPI总线冲突是常见问题。我们通过硬件和软件双重方案解决硬件方案为每个SPI设备单独设置CS片选线在两条SPI总线上各串联33Ω电阻软件方案采用互斥锁机制访问SPI资源SD卡操作期间关闭VS1053B的DREQ中断关键代码实现// SPI资源锁实现 uint8_t SPI_Lock(SPI_TypeDef* SPIx) { if(SPIx SPI1){ while(SD_BUSY_FLAG); // 等待SD卡空闲 SD_BUSY_FLAG 1; }else{ while(VS_BUSY_FLAG); VS_BUSY_FLAG 1; } return 0; }3. FATFS文件系统移植实战3.1 扇区大小适配问题SD卡通常有512字节/扇区但VS1053B编码输出的音频帧是1024字节。直接写入会导致FATFS文件分配表错乱。我们的解决方案是修改diskio.c中的扇区大小为1024实现自定义的multi_block_write函数添加写缓冲机制应对突发数据实测发现某些品牌的SD卡在非512字节扇区时性能下降严重。经过测试以下品牌的兼容性较好SanDisk Ultra (A1评级)Samsung EVO PlusKingston Canvas Select3.2 文件命名与存储优化为避免频繁操作FAT表我们采用预分配文件空间的方式。以下是关键实现逻辑// 预分配WAV文件头 void CreateWAVHeader(FIL* file, uint32_t duration) { uint32_t data_size duration * 8000 * 2; // 8kHz,16bit uint8_t header[44] { 0x52,0x49,0x46,0x46, // RIFF data_size36,0,0,0, // 文件总大小 0x57,0x41,0x56,0x45, // WAVE 0x66,0x6D,0x74,0x20, // fmt 0x10,0,0,0, // PCM格式块大小 0x01,0, // 音频格式PCM 0x01,0, // 单声道 0x40,0x1F,0,0, // 8000Hz 0x80,0x3E,0,0, // 字节率 0x02,0, // 块对齐 0x10,0, // 位深度16bit 0x64,0x61,0x74,0x61, // data data_size,0,0,0 // 数据块大小 }; f_write(file, header, sizeof(header), bytes_written); }4. 产品级功能实现技巧4.1 低功耗设计通过实测发现系统70%的功耗来自VS1053B的模拟电路。我们采用以下策略将待机电流从45mA降至3.8mA录音间隔超过5分钟自动关闭VS1053B供电OLED屏幕采用PWM调光100Hz时占空比30%STM32进入Sleep模式通过RTC唤醒关键的低功耗切换代码void Enter_LowPowerMode() { VS1053_PowerDown(); // 关闭音频芯片 OLED_DisplayOff(); // 关闭屏幕背光 HAL_SuspendTick(); // 停止系统滴答定时器 HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); }4.2 用户交互优化原始的三按键操作不够直观我们通过长短按组合实现更多功能操作方式功能描述键1长按进入菜单模式键2短按开始/暂停录音键2长按锁定当前录音防误触键3双击切换播放模式单曲/循环OLED显示方面采用多级菜单结构。主界面显示关键信息[REC] 00:05:23 ◉─── 78% 采样率:16kHz 电池:3.7V在深圳华强北实测录音效果显示这套系统在50dB环境底噪下可以清晰录制10米外的正常对话。相比市面同类方案我们的优势在于支持录音过程实时监听断电后自动保存最后录音文件可通过串口导出文件无需拔卡

更多文章