1. 项目背景与硬件选型解析在业余无线电和电子DIY领域构建自己的收音机系统一直是极具吸引力的项目。这次我选择了Si4731数字调谐收音机芯片与GD32VF103VBT6微控制器的组合方案这个搭配在成本、性能和开发难度上达到了很好的平衡点。Si4731是Silicon Labs推出的一款高性能AM/FM收音机芯片它通过I2C接口与主控通信内部集成了从射频输入到音频输出的完整信号链。相比传统模拟收音机方案它的优势在于数字调谐精度高达1kHz自动增益控制(AGC)响应快速支持RDS/RBDS数据解码工作电压范围宽(2.7-5.5V)GD32VF103VBT6则是兆易创新基于RISC-V架构的32位MCU主频108MHz具备128KB Flash 32KB SRAM丰富的外设接口(3xUSART, 2xI2C, 3xSPI等)内置12位ADC和DAC价格仅为同性能ARM MCU的60%这个组合特别适合想要学习嵌入式系统开发同时实现实用功能的爱好者。接下来我将详细介绍从硬件搭建到软件调优的全过程。2. 硬件电路设计与搭建2.1 核心电路原理图设计整个系统由电源模块、MCU最小系统、Si4731射频前端和音频输出四部分组成。关键设计要点如下电源部分采用AMS1117-3.3稳压芯片输入电容10μF钽电容(耐压16V)输出电容22μF陶瓷电容MCU最小系统8MHz晶振配22pF负载电容复位电路采用10kΩ上拉0.1μF电容BOOT0通过10kΩ电阻接地Si4731接口电路GD32VF103 Si4731 PB6(SCL) --- SCL PB7(SDA) --- SDA PA8 --- RESET 3.3V --- VCC GND --- GND特别注意Si4731的ANT引脚需要接50cm以上的导线作为天线在PCB布局时应预留天线接口位置。2.2 PCB布局注意事项经过多次打样测试总结出以下经验射频部分与其他电路保持至少5mm间距MCU的SWD调试接口尽量远离Si4731电源走线宽度不小于0.3mm在Si4731的VCC引脚就近放置0.1μF去耦电容音频输出端串联100Ω电阻可有效抑制高频噪声实际测试发现当使用劣质电源时会出现明显的背景噪声。建议使用锂电池供电或添加LC滤波电路。3. 软件开发环境搭建3.1 工具链配置GD32VF103作为RISC-V架构MCU需要特定的开发工具安装Nuclei RISC-V GCC工具链配置OpenOCD用于程序烧录使用VS Code PlatformIO作为IDE关键配置步骤# 安装工具链 sudo apt install gcc-riscv64-unknown-elf openocd # 添加udev规则 echo SUBSYSTEMusb, ATTR{idVendor}28e9, MODE0666 | sudo tee /etc/udev/rules.d/99-gd-link.rules3.2 Si4731驱动开发通过分析Si4731的数据手册编写了以下核心功能函数#define SI4731_ADDR 0x22 void si4731_init(I2C_HandleTypeDef *hi2c) { uint8_t cmd[2]; // Power up cmd[0] 0x01; cmd[1] 0x50; HAL_I2C_Master_Transmit(hi2c, SI4731_ADDR, cmd, 2, 100); HAL_Delay(100); // FM接收模式 cmd[0] 0x01; cmd[1] 0x01; HAL_I2C_Master_Transmit(hi2c, SI4731_ADDR, cmd, 2, 100); } void si4731_set_freq(I2C_HandleTypeDef *hi2c, uint16_t freq) { uint8_t cmd[3]; uint16_t freq_reg freq * 10; cmd[0] 0x20; cmd[1] freq_reg 8; cmd[2] freq_reg 0xFF; HAL_I2C_Master_Transmit(hi2c, SI4731_ADDR, cmd, 3, 100); }实测发现每次频率切换后需要至少50ms的稳定时间否则会出现信号失真。这是数据手册中没有明确说明的重要时序参数。4. 用户界面与功能实现4.1 旋转编码器控制采用EC11编码器实现频率调节CLK接PA0DT接PA1启用定时器编码器模式每步进对应100kHz变化关键代码void TIM2_IRQHandler(void) { if(TIM2-SR TIM_SR_CC1IF) { uint16_t cnt TIM2-CNT; if(cnt 32768) current_freq - 1; // 逆时针 else current_freq 1; // 顺时针 si4731_set_freq(hi2c1, current_freq); } TIM2-SR 0; }4.2 OLED显示界面使用SSD1306 128x64 OLED显示频率数字使用16pt字体信号强度用柱状图表示RDS信息滚动显示调试中发现当刷新率超过30fps时会导致I2C通信冲突。解决方案是将OLED的I2C时钟降到100kHz采用双缓冲机制非必要不刷新全屏5. 性能优化与实测结果5.1 接收灵敏度提升通过实验对比不同天线方案50cm导线可接收15个FM台1/4波长天线(75cm)增加到22个台加装LNA模块达到28个台最佳性价比方案是使用75cm软导线作为天线配合以下软件优化// 自动增益控制配置 uint8_t agc_cmd[6] {0x12, 0x00, 0x40, 0x01, 0x27, 0x00}; HAL_I2C_Master_Transmit(hi2c1, SI4731_ADDR, agc_cmd, 6, 100);5.2 功耗测试不同工作模式下的电流消耗待机模式2.1mAFM接收(静音)18mAFM接收(最大音量)65mA开启RDS解码额外增加3mA实测使用18650锂电池(2000mAh)可连续工作约30小时。通过优化可以进一步降低功耗关闭不使用的Si4731功能(如AM模式)降低MCU主频到48MHz采用间歇唤醒策略6. 项目扩展方向基于现有平台还可以实现更多有趣功能自动搜台存储void scan_channels() { uint8_t cmd[2] {0x21, 0x03}; // FM扫描向上 HAL_I2C_Master_Transmit(hi2c1, SI4731_ADDR, cmd, 2, 100); // 等待扫描完成 while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) GPIO_PIN_SET); // 读取找到的频道 uint8_t buf[8]; HAL_I2C_Master_Receive(hi2c1, SI4731_ADDR, buf, 8, 100); }音频频谱显示利用MCU内置ADC采集音频信号实现FFT算法分析频域特性在OLED上显示实时频谱蓝牙遥控功能添加HC-05模块开发手机APP控制频率实现预设电台收藏功能这个项目最让我惊喜的是GD32VF103的表现——作为国产RISC-V芯片它的性能完全满足需求且开发体验良好。Si4731的接收质量也远超预期特别是在城市环境中能清晰接收许多弱信号电台。后续我计划为它设计一个3D打印外壳并加入录音功能使之成为一个完整的便携式收音机设备。