音频接口日益成为嵌入式设计的期望特性。与此同时,嵌入式系统的用户对音频质量的要求越来越高。对开发人员来说,这带来了如下挑战:如何在基于微控制器的系统中运行 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) 将其转换为音频。
图 1:Adafruit 的 VS1053B 是基于硬件的 MP3 解码器芯片,可接收音频流并将其解码为代表性的模拟音频信号。此解决方案所需的软件最少,并且不需要开发人员了解如何解码或转换 MP3 文件。(图片来源:Adafruit)
VS1053B 真正有意思的地方是,与许多其他使用 I2C 的解码器相比,它还能通过简单的 UART 进行调试和控制。此外,它有八个通用输入/输出引脚,可用于读取位、设置开关或状态 LED 之类的应用功能。
对于希望尝试基于硬件的解决方案的开发人员,不必为 VS1053B 定制分线板。Adafruit 提供 381 VS1053B 编解码器 + MicroSD 分线板。除 VS1053B 外,该板还有一个 MicroSD 卡插槽,可用于存储音频文件以进行解码(图 2)。分线板可连接到微控制器,后者通过 SPI 或 SDIO 端口连接到 SD 卡以读出音频文件。音频文件流随后传送到 VS1053B 进行解码。然后,可以根据需要将 VL1053B 的输出导向耳机插孔或扬声器等。
图 2:Adafruit 的 1381 VS1053B 编解码器 + MicroSD 分线板包含必要的硬件,可轻松连接微控制器以播放音频。分线板上有一个板载 MicroSD 卡插槽,微控制器可以通过 SPI 读取卡内容,然后将文件传输到 VS1053B 进行解码。(图片来源:Adafruit)
基于软件的 MP3 解码
一种稍微复杂一点但从物料 (BOM) 角度看成本常常更低的解决方案,是在微控制器上解码 MP3 文件,然后将解码后的文件流式传输到音频编解码器以生成音频。为了实施基于软件的高效解决方案,开发人员需要实现若干关键组件,例如:
乍看之下,软件开发人员似乎有大量工作要做,需要集成许多具有挑战性的软件组件以将 MP3 解码并转换为音频。实现 MP3 解码解决方案的最佳办法是利用一个支持音频编码、解码和常规处理的微控制器平台。
尽管可以在互联网上找到许多开源解决方案,但 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 和外设特性,支持几乎所有应用。
图 3:STM32F469IGH6TR 是一款 180 MHz Arm Cortex-M4 处理器,具有 1 MB 的闪存和 384 KB 的 RAM。176 引脚 UBGA 封装提供了大量 GPIO,支持几乎所有嵌入式应用。(图片来源:STMicroelectronics)
MP3 播放器代码示例运行在 STM32F469I-DISCO Discovery 套件上(图 4)。STM32F469I-DISCO 包含 MP3 解码和播放所需的一切功能。该板有一块 4 英寸 800 x 480 像素 LCD,用于将当前 MP3 演示状态告知开发人员,另外还提供了播放、停止、下一首、上一首等播放器控件。此外,Discovery 板还含有耳机插孔,能以立体声方式播放所产生的音频。关于示例代码,唯一需要注意的是 MP3 文件须由外部提供,具体来说是由 USB 驱动大容量存储设备提供,其通过 micro USB 连接器连接。
图 4:STM32F469I-DISCO Discovery 套件有一个 4 英寸 LCD,用于操作 MP3 播放器演示。音频文件由外部 USB 大容量存储设备通过板载 Micro USB 连接器提供。它提供了一个解码 MP3 文件的实际范例。(图片来源:STMicroelectronics)
虽然 MP3 解码库确实需要 Arm Cortex-M4 或更好的处理器,但事实证明,在开发板上运行演示代码是一种很好的方式,不仅可以查看和试验实际范例,而且还能验证应用性能。使用串行线调试 (SWD) 接口和 Arm 内核的仪器跟踪宏单元 (ITM) 功能,可以对程序计数器执行统计分析,确定大约需要多大处理能力来解码并播放 MP3 文件。结果是,将近 50% 的 CPU 时间用于更新 LCD 显示,而 10% 或更少的时间用于 MP3 解码。STMicroelectronics 的音频库非常有效,其使用 DMA 将 I2S 上的解码帧推送到音频编解码器。
如果应用不需要 LCD,仅需要基于其他系统事件来播放音频,那么可以使用功能较少的处理器。例如,开发人员可以看看 STM32F469VGT6。STM32F469VGT6 仍然非常强大,具有 1 MB 的闪存和 384 KB 的 RAM,全部位于 100 引脚 LQFP 中。该器件没有使用 BGA 封装,该封装有时可能会让开发人员和制造商望而却步。
图 5:STM32F469VGT6 是一款 180 MHz 处理器,具有 1 MB 的闪存和 384 KB 的 RAM。该器件基于 Arm Cortex-M4 系列,由 STMicroelectronics 音频库支持。如图所示,它采用 100 引脚 LQFP 封装,这会让开发人员和制造商没那么望而却步。(图片来源:STMicroelectronics)
开发人员选定并试用了他们认为最适合其应用的解决方案之后,就需要决定如何将解码的 MP3 文件从数字波形转换为模拟声音。
利用编解码器将音频流转换为声音
大多数基于硬件的解码解决方案还会包括一个数模转换器 (DAC),用于将接收到的数字文件格式转换为模拟声音。但是,这些芯片通常包含 I2S 输出端口,允许开发人员添加自己的音频编解码器。基于软件的解决方案肯定需要编解码器,才能将解码的数字流转换为音频。有两种方法可以完成此任务。
第一种方法是可以获取数字音频,利用微控制器的板载 DAC 外设生成音频输出。一般而言,这不是生成音频的最佳方法,因为它需要额外的分立元器件以及精心的模拟电路设计和布局,才能获得高质量输出。此外,微控制器上也需要进行更多设置才能让 DAC 正常运行,而且一般还需要额外的处理器电源以确保 DAC 获得适当的供电。
第二种方法(一般推荐采用这种方法)是使用集成的音频编解码器。音频编解码器基本上是集成电路,具备所有用于生成模拟输出的电路,例如 DAC 和 D 类放大器。相比于分立解决方案,音频编解码器的优势在于占用的电路板空间非常小,而且还能内置数字电路来控制音频输出流。
举例来说,Cirrus Logic 的 CS43L22-CNZ DAC 为开发人员提供了广泛的功能,例如:
CS43L22-CNZ 通过 I2S 接口从微控制器接收 PCM 编码的数据流,然后使用其内部 DAC 进行转换(图 6)。CS43L22-CNZ DAC 可以驱动多路输出,例如扬声器或耳机。如果使用单个单声道,CS43L22-CNZ 可以向扬声器输出 2 W 功率;如果使用立体声声道,则每个声道最多为 1 W。
图 6:CS43L22-CNZ DAC 是一种音频 DAC,可通过单声道输出最高 2 W 的功率,或以立体声音频输出每通道 1 W 的功率。该 DAC 具有一个数字信号处理引擎,可轻松控制音量、低音和高音。(图片来源:Cirrus Logic)
一些开发人员可能不需要 CS43L22-CNZ 的全部功能,可以通过精简来节省一些 BOM 成本。
当然,这取决于应用的要求,但这种方法有一个很好的例子,那就是 AKM 的 AK4637EN 音频编解码器(图 7)。这是一款 24 位单声道编解码器,其输出 DAC 仅用于扬声器。该编解码器还有一个麦克风放大器,如果应用需要,它也可以用来录制音频。
图 7:AK4637EN 是采用 20 引脚 QFN 小型封装的音频 DAC,可输出最高 1 W 的单声道音频。该编解码器可通过 I2C 总线以数字方式进行控制,以管理输出音量和自动输出控制。(图片来源:AKM Semiconductor)
同大多数音频编解码器一样,AK4637EN 也有 I2S 接口,用以接收来自微控制器的数字音频信号。此外,该芯片还有 I2C 接口,用于控制板载数字特性,例如音量控制。
与任何产品功能一样,开发人员需要花时间仔细检查其对系统的要求,并在编解码器特性和成本与目标 BOM 成本之间取得平衡。
实现 MP3 解决方案的技巧与诀窍
开发人员在为应用选择适当的解决方案时,可以使用以下“小技巧”:
遵循以上提示将有助于确保开发人员为其嵌入式应用选择正确的音频解决方案。
总结
为嵌入式系统增加音频功能曾经是一项复杂的工作,但是如本文所示,如今的开发人员有大量解决方案可供选择:既有专用的外部编解码器,也有集成的软件库。尽管如此,开发人员仍需要仔细评估应用需求,确定哪种解决路径最合理。
需要考虑的因素包括:BOM,解决方案的复杂性,开发和集成的时间与成本,以及解决方案的可扩展性。一旦对照产品批量、目标成本和开发计划权衡上述因素,最合适的解决方案就会变得清晰起来。