AIR32F103(八) 集成Helix MP3解码库播放MP3

目录

  • AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告
  • AIR32F103(二) Linux环境和LibOpenCM3项目模板
  • AIR32F103(三) Linux环境基于标准外设库的项目模板
  • AIR32F103(四) 27倍频216MHz,CoreMark跑分测试
  • AIR32F103(五) FreeRTOSv202112核心库的集成和示例代码
  • AIR32F103(六) ADC,I2S,DMA和ADPCM实现的录音播放功能
  • AIR32F103(七) AIR32F103CBT6/CCT6启用96K内存
  • AIR32F103(八) 集成Helix MP3解码库播放MP3

关于 Helix MP3 解码库

MP3(Moving Picture Experts Group Audio Layer III,MPEG Audio Layer 3)是一种音频编码方式, MPEG 音频文件是 MPEG 标准中的声音部分, 根据压缩质量和编码复杂程度划分为三级 Layer-1, Layer-2, Layer-3, 分别对应MP1, MP2, MP3 这三种编码格式, 级别越高压缩率越高,编码器也越复杂, MP3 压缩率可达到 10:1 至 12:1.

Helix 解码库提供了MP3内容的MPEG兼容解码, 支持可变比特率, 恒定比特率以及立体声和单声道音频格式. Helix 的定点解码库专门针对ARM处理器进行了优化. Helix 解码库是以帧为解码单位的, 一次解码一帧, 运行需要占用的资源很少, 可以在任何能够执行长整数乘法运算(两个32位输入生成一个64位结果)和长整数乘法-累加(具有64位累加器的长整数乘法)的32位处理器上运行.

Helix 与 AIR32F103 驱动库的集成

在 air32f103-template 项目中, 已经将 Helix 加入 Library 并在 Makefile 中增加了编译选项, 设为y就会增加Helix库的支持.

# Build with Helix MP3 lib, y:yes, n:no
USE_HELIX		?= y

在项目中使用Helix库, 只需要引用 mp3dec.h 和 mp3_data.h 这两个头文件, 初始化 HMP3Decoder

hMP3Decoder = MP3InitDecoder();

示例代码

示例代码: air32f103-template/tree/master/Examples/NonFreeRTOS/I2S/Helix_MP3_Play

  • 因为 Helix 的官方仓库已经不可用, 网上找到的大多是经过修改的代码, 这里使用的是这篇文章中的Helix库.
  • 为简单起见, 示例直接使用字节数组存储mp3数据进行播放.
  • 音频的驱动: 使用两个4096字节的数组作为 DMA 的buffer, DMA中存放已经解码完成的音频数据, 直接传输到I2S接口播放. 每次一个buffer的DMA传输完成, 就切换到下一个buffer, 同时在主函数中读取mp3数据并解码, 快速填充前一个buffer.
  • 因为使用的内存超过 42KB, 如果使用 CBT6, 除了需要缩小mp3数据数组, 还需要开启内存hack.
  • 实际测试中, 需要系统频率高于192MHz才能完全流畅播放, 建议使用 216MHz

示例中的I2S设置是针对PT8211的, 如果使用的是, 需要修改一下, 改成 Phillips 格式

// PT8211:LSB,  MAX98357A:Phillips
I2S_InitStructure.I2S_Standard = I2S_Standard_LSB;

硬件准备

  • AIR32F103开发板, 需要Flash大于 230 KB (CCT6或RPT6), 如果用CBT6, 需要裁剪mp3数据
  • MAX98357A 或 PT8211 等 I2S 接口音频播放模块
  • 用于播放声音的喇叭

接线

 *   AIR32F103                  MAX98357A / PT8211
 *   PB12(SPI1_NSS/I2S_WS)       -> LRC, WS
 *   PB13(SPI1_SCK/I2S_CK)       -> BCLK, BCK
 *   PB15(SPI1_MOSI/I2S_SD)      -> DIN
 *                               GND  -> GND
 *                               VIN  -> 3.3V
 *                               +    -> speaker
 *                               -    -> speaker

运行示例

编译和烧录的步骤, 参考前面的 AIR32F103(三) Linux环境基于标准外设库的项目模板

运行后会重复播放一段音乐.

播放其它MP3文件

首先要用工具将MP3剪辑到合适的大小(不要超过200KB), 格式为立体声 44.1 KHz 采样率, 不限制比特率.

然后用工具将其转换为十六进制表示的字节数组. 替换掉 mp3_data.c 中的内容, 同时修改 mp3_data.h 中的 MP3_DATA_SIZE.

bin2hex的转换工具, 可以使用Perl Script to convert binary to hex 这个perl脚本

链接

  • http://vedder.se/2012/07/play-mp3-on-the-stm32f4-discovery/
  • https://github.com/cahya-wirawan/stm32f4-musicplayer

你可能感兴趣的:(Embed,Circuit/Radio,AIR32F103,Helix,MP3,PT8211,MAX98357)