作者:Jacob Beningo/Digi-Key
音频接口日益成为嵌入式设计的期望特性。与此同时,嵌入式系统的用户对音频质量的要求越来越高。对开发人员来说,这带来了如下挑战:如何在基于微控制器的系统中运行 MP3 或其他音频文件。这些系统不仅受资源限制,而且缺少便于开发人员在 Linux 系统上使用的音频接口。因此,解码音频文件并高效地将内容转换为模拟声音,就变得更加困难。
开发人员还必须在硬件或软件解决方案之间谨慎选择,并决定使用哪些元器件,这是因为成本、空间和开发时间都是重要考虑因素。
本文介绍了 AKM Semiconductor、Adafruit、STMicroelectronics 和 Cirrus Logic Inc. 提供的几种硬件和软件解决方案,开发人员可以使用它们来高效地将音频文件添加到其嵌入式设备中。此外,本文还说明了一些“小技巧”,以帮助确保解决方案成功实施。
选择嵌入式音频格式
在深入探讨如何将音频功能集成到嵌入式设备之前,有必要仔细思考为何通常首选 MP3 音频格式。对于嵌入式系统,实际上有三种潜在音频格式可供开发人员使用:脉冲编码调制 (PCM)、WAV 和 MP3。
PCM 是一种未经压缩的无损音频格式,常由音频编解码器用来将音频流的数字表示转换为用户听到的模拟声音。这是一种广受支持的标准格式,可以追溯到 CD 年代。PCM 可以在嵌入式系统中使用,但问题是 PCM 文件通常比 WAV 或 MP3 文件大得多。在资源受限且锱铢必较的设备中,若要支持这种格式,产品可能需要更大的外部存储设备或具有更大存储器的微控制器。因此,除非产品容量低、只有一个音频文件或成本不受限制,否则通常会避免使用 PCM。
WAV 文件也是未经压缩且无损的,这方面与 PCM 非常相似。WAV 文件在嵌入式应用中往往比 PCM 文件更受欢迎,但它同样会占用大量空间。如果嵌入式系统已经有 SD 卡或其他大容量存储设备,那么 WAV 文件可能非常适合。
对于大多数系统,MP3 文件是首选音频格式。MP3 文件是有损的,因此在对音频进行编码时,可能会损失一些音频保真度。但是,MP3 远小于 PCM 或 WAV,因此将音频文件放到设备上的传输和存储时间更短,并且其对存储器的要求也更小。
一旦决定要使用 MP3,开发人员便可选择使用硬件或软件来实现。
基于硬件的 MP3 解码
最快速、最简单的解决方案通常是使用硬件 MP3 解码器,例如 Adafruit 的 681 VS1053B(图 1)。VS1053B 可以通过串行流直接接受 MP3、WAV、OGG 或 MIDI 文件格式并进行解码,开发人员几乎不需要花什么精力。对流进行解码后,VS1053B 利用 18 位数模转换器 (DAC) 将其转换为音频。

对于希望尝试基于硬件的解决方案的开发人员,不必为 VS1053B 定制分线板。Adafruit 提供 381 VS1053B 编解码器 + MicroSD 分线板。除 VS1053B 外,该板还有一个 MicroSD 卡插槽,可用于存储音频文件以进行解码(图 2)。分线板可连接到微控制器,后者通过 SPI 或 SDIO 端口连接到 SD 卡以读出音频文件。音频文件流随后传送到 VS1053B 进行解码。然后,可以根据需要将 VL1053B 的输出导向耳机插孔或扬声器等。

一种稍微复杂一点但从物料 (BOM) 角度看成本常常更低的解决方案,是在微控制器上解码 MP3 文件,然后将解码后的文件流式传输到音频编解码器以生成音频。为了实施基于软件的高效解决方案,开发人员需要实现若干关键组件,例如:
- MP3 解码器库
- 存储驱动程序
- 文件系统堆栈
- 直接存储器访问 (DMA) 驱动程序
- I2S 驱动程序
- I2C 驱动程序
- 音频编解码器驱动程序
尽管可以在互联网上找到许多开源解决方案,但 STM32 工具链是开发人员可以利用的专业可靠、久经考验的解决方案。STM32 微控制器系列有一个称为 STM32CubeMx 的开发工具,其与 STM32CubeIDE 集成在一起,后者包含音频示例和开发库。这些示例和工具是 STM32CubeMX 附加插件(称为 X-CUBE-AUDIO)的一部分。该插件为 Arm Cortex-M4 类微控制器中的所有 STM32 处理器提供了用于 MP3 解码的音频库。
具体来说,它有一些代码项目示例可用于创建能在 STM32F469IGH6TR 微控制器上运行的 MP3 播放器。STM32F469IGH6TR 是一款功能强大的微控制器,具有 1 兆字节 (MB) 的闪存和 384 KB 的 RAM,运行速率为 180 兆赫兹 (MHz)。该微控制器采用 176 引脚 UBGA 封装,提供了大量 GPIO 和外设特性,支持几乎所有应用。


如果应用不需要 LCD,仅需要基于其他系统事件来播放音频,那么可以使用功能较少的处理器。例如,开发人员可以看看 STM32F469VGT6。STM32F469VGT6 仍然非常强大,具有 1 MB 的闪存和 384 KB 的 RAM,全部位于 100 引脚 LQFP 中。该器件没有使用 BGA 封装,该封装有时可能会让开发人员和制造商望而却步。

利用编解码器将音频流转换为声音
大多数基于硬件的解码解决方案还会包括一个数模转换器 (DAC),用于将接收到的数字文件格式转换为模拟声音。但是,这些芯片通常包含 I2S 输出端口,允许开发人员添加自己的音频编解码器。基于软件的解决方案肯定需要编解码器,才能将解码的数字流转换为音频。有两种方法可以完成此任务。
第一种方法是可以获取数字音频,利用微控制器的板载 DAC 外设生成音频输出。一般而言,这不是生成音频的最佳方法,因为它需要额外的分立元器件以及精心的模拟电路设计和布局,才能获得高质量输出。此外,微控制器上也需要进行更多设置才能让 DAC 正常运行,而且一般还需要额外的处理器电源以确保 DAC 获得适当的供电。
第二种方法(一般推荐采用这种方法)是使用集成的音频编解码器。音频编解码器基本上是集成电路,具备所有用于生成模拟输出的电路,例如 DAC 和 D 类放大器。相比于分立解决方案,音频编解码器的优势在于占用的电路板空间非常小,而且还能内置数字电路来控制音频输出流。
举例来说,Cirrus Logic 的 CS43L22-CNZ DAC 为开发人员提供了广泛的功能,例如:
- 通过 I2C 总线执行 DAC 控制
- 多路输出,例如耳机和扬声器
- 无需外部输出滤波
- 数字信号处理器引擎,用于音量、低音和高音控制
- 滴答和噼啪噪声抑制

当然,这取决于应用的要求,但这种方法有一个很好的例子,那就是 AKM 的 AK4637EN 音频编解码器(图 7)。这是一款 24 位单声道编解码器,其输出 DAC 仅用于扬声器。该编解码器还有一个麦克风放大器,如果应用需要,它也可以用来录制音频。

与任何产品功能一样,开发人员需要花时间仔细检查其对系统的要求,并在编解码器特性和成本与目标 BOM 成本之间取得平衡。
实现 MP3 解决方案的技巧与诀窍
开发人员在为应用选择适当的解决方案时,可以使用以下“小技巧”:
- 以预期的生产量执行 BOM 成本分析比较:一种情况是使用外部 MP3 解码器,另一种情况是使用功能更强大的、能够自行运行 MP3 解码器的微控制器。务必使用悲观、可达成和乐观三种生产量数字来确定更好的决策范围。
- 利用支持 I2S 的音频编解码器生成输出音频。分立解决方案的调整可能更耗时,而元器件成本可能相当。
- 使用开发板对 MP3 软件库进行性能分析,以了解解决方案运行所需的最低微控制器特性。
- 利用 DMA 通道将解码的 MP3 帧通过 I2S 接口传输到音频编解码器。这将支持使用较为便宜的处理器。
- 仔细检查 MP3 软件库许可,确保它们可与商业产品一起使用。除非是芯片供应商提供,否则大多数开源库用于商业产品时都需要付费许可证。
总结
为嵌入式系统增加音频功能曾经是一项复杂的工作,但是如本文所示,如今的开发人员有大量解决方案可供选择:既有专用的外部编解码器,也有集成的软件库。尽管如此,开发人员仍需要仔细评估应用需求,确定哪种解决路径最合理。
需要考虑的因素包括:BOM,解决方案的复杂性,开发和集成的时间与成本,以及解决方案的可扩展性。一旦对照产品批量、目标成本和开发计划权衡上述因素,最合适的解决方案就会变得清晰起来。