你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【我爱DIY】简易WAV播放器

[复制链接]
creep 发布时间:2017-8-19 21:10
本帖最后由 creep 于 2017-8-22 08:56 编辑

      STM32F769-DISCO 上面有个WM8994可以用于音频解码。WM8994具有高性能低功耗体积小等优点,曾用在早期的三星安卓手机上用到。下面的测试主要是使用WM8994播放WAV文件。


1、串行音频接口(SAI)
SAI 接口(串行音频接口)灵活性高、配置多样,可支持多种音频协议。该接口适用于许多立体声或单声道应用。例如,它可配置为支持 I2S 标准、 LSB 或 MSB 对齐、 PCM/DSP、TDM 和 AC’97 等协议。将音频模块配置为发送器时, SAI 接口可提供 SPDIF 输出。SAI 通过两个完全独立的音频子模块来实现这种灵活性和可配置性。每个模块都有自己的时钟发生器和 I/O 线控制器。SAI 可以配置为主模式或配置为从模式。音频子模块既可作为接收器,又可作为发送器;既可与另一模块同步,又可以不同步。
SAI 主要由两个各自带有时钟发生器的音频子模块组成,每个音频模块集成一个 32 位移位寄存器,该寄存器由模块自身的功能状态机控制。数据存储和读取都是通过专用的 FIFO 来完成。 FIFO 可通过 CPU 访问,也可通过 DMA 访问以减轻 CPU 的通信负担。每个音频模块是独立的。这两个音频子模块可彼此同步。SAI 中指定音频模块的 4 个专用引脚IO口( SD、 SCK、 FS、 MCLK)。


功能框图如下:
TIM截图20170819170314.png

STM32F769-DISOC 上面的WM8994通过SAI1_Block_A和MCU进行解码数据通信,WM8994的初始化和各项配置则通过IIC实现。


TIM截图20170819171150.png

2、WAV格式文件
WAVE文件是计算机领域最常用的数字化声音文件格式之一,它是微软专门为Windows系统定义的波形文件格式(Waveform Audio)。WAVE是录音时用的标准的WINDOWS文件格式,文件的扩展名为“WAV”,数据本身的格式为PCM或压缩型。简单的理解WAV文件有一个文件头和数据部分组成,文件头里面包含该WAV的详细信息。一个典型的文件头格式如下:
TIM截图20170819173349.png
这个文件头共有44字节,不同的格式文件头可能长度不同,为了方便处理我使用开源软件Audacity将WAV的头文件格式都转为相同的44字节模式,其他的参数为立体声44.1KHZ.


TIM截图20170819175532.png

3、软件解码

   播放的WAV文件放在TF卡里面,文件系统使用开源的FATFS,为了支持较长的歌曲名字,需要在FATFS中打开长文件名支持模式。同时为了支持中文显示,我把汉字点阵放到了
STM32F769-DISCO 的外置NORFLASH里面,具体的操作可以查看之前的帖子。

WAV的播放是使用DMA 循环模式把数据从SD卡搬送到codec进行解码,其中DMA使能了HalfTransfer和TransferComplete来不断的更新要解码的数据文件。
最开始的时候先将要解码的缓存写满,然后开始DMA传输,当传输完成一半时在使能标记开始更新前半部缓存,等传输完成继续更新后半部分缓存,这样可以实现更新缓存和
界面数据“同时进行”,当然这样做的前提是更新缓存数据速度要快于解码的数据,通过测试STM32F7完全没有压力。

程序的流程如下:
  • 先扫描SD卡找到WAV文件,将找到的WAV文件信息放入到一个链表中。
  • 显示找到的WAV文件名称到LCD上,并更新要播放的文件(名称为绿色字体)。
  • 根据预设的要播放的文件序号找到要要播放的WAV文件的信息,从SD卡里面读取填充播放缓存。
  • 开始播放WAV后不断的填充播放缓存直到播放完成。
  • 播放完成一个WAV文件后,根据播放模式(单曲循环、列表循环、随机循环)播放下一个WAV文件。
  • 播放的过程中可以通过用户按键切换下一个WAV文件进行播放。

程序下载后的:

IMG_0161.JPG

使用按键切换歌曲:

DJDL9465.GIF

mian 函数如下:
  1.     _listfile_list *playfile;
  2.     CPU_CACHE_Enable();
  3.     HAL_Init();
  4.     SystemClock_Config();
  5.     USART1_Init();
  6.     HAL_Delay(200);
  7.     BSP_LED_Init(LED_GREEN);
  8.     BSP_LCD_Init();
  9.     BSP_LCD_LayerDefaultInit(0, LCD_FB_START_ADDRESS);
  10.     BSP_LCD_SetTextColor(LCD_COLOR_RED);
  11.     BSP_LCD_SetBackColor(LCD_COLOR_BLACK);
  12.     HAL_Delay(500);
  13.     BSP_QSPI_Init();
  14.     CopyFont2NorFlash();
  15.     BSP_QSPI_EnableMemoryMappedMode();
  16.     CheckGBKFont4NorFlash();
  17.     BSP_LCD_Clear(LCD_COLOR_WHITE);

  18.     FatFs_SD_Init();
  19.     wavfilenum = ScanWavFiles("/");
  20.     PrintfWavFileTest();
  21.     UpdateWavFileColor(playfilepos,playfilepos);
  22.     playfile = list_search(WavFileList, playfilepos);

  23.     if(playfile == NULL)while(1);

  24.     //´
  25.     wavFileLen = OpendWavFile(playfile->filename);
  26.     //
  27.     ReadWaveFile(BuffHead, PLAY_HEADER);
  28.     //
  29.     ReadWaveFile((uint8_t *)PlayBuff, PLAY_BUFF_SIZE * 2);
  30.     Playback_Init();

  31.     /* Start the playback */
  32.     if(0 != audio_drv->Play(AUDIO_I2C_ADDRESS, NULL, 0))
  33.     {
  34.         while(1);
  35.     }

  36.     if(HAL_OK != HAL_SAI_Transmit_DMA(&SaiHandle, (uint8_t *)PlayBuff, PLAY_BUFF_SIZE))
  37.     {
  38.         while(1);
  39.     }
复制代码
需要注意的是程序里面默认播放是44.1KHZ立体声的WAV文件,如果是其他的格式的要在播放之前更新SAI的配置。
  1.    SaiHandle.Init.AudioMode      = SAI_MODEMASTER_TX;
  2.     SaiHandle.Init.Synchro        = SAI_ASYNCHRONOUS;
  3.     SaiHandle.Init.OutputDrive    = SAI_OUTPUTDRIVE_ENABLE;
  4.     SaiHandle.Init.NoDivider      = SAI_MASTERDIVIDER_ENABLE;
  5.     SaiHandle.Init.FIFOThreshold  = SAI_FIFOTHRESHOLD_1QF;
  6.     SaiHandle.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_44K;
  7.     SaiHandle.Init.Protocol       = SAI_FREE_PROTOCOL;
  8.     SaiHandle.Init.DataSize       = SAI_DATASIZE_16;
  9.     SaiHandle.Init.FirstBit       = SAI_FIRSTBIT_MSB;
  10.     SaiHandle.Init.ClockStrobing  = SAI_CLOCKSTROBING_FALLINGEDGE;

  11.     SaiHandle.FrameInit.FrameLength       = 32;
  12.     SaiHandle.FrameInit.ActiveFrameLength = 16;
  13.     SaiHandle.FrameInit.FSDefinition      = SAI_FS_CHANNEL_IDENTIFICATION;
  14.     SaiHandle.FrameInit.FSPolarity        = SAI_FS_ACTIVE_LOW;
  15.     SaiHandle.FrameInit.FSOffset          = SAI_FS_BEFOREFIRSTBIT;

  16.     SaiHandle.SlotInit.FirstBitOffset = 0;
  17.     SaiHandle.SlotInit.SlotSize       = SAI_SLOTSIZE_DATASIZE;
  18.     SaiHandle.SlotInit.SlotNumber     = 2;
  19.     SaiHandle.SlotInit.SlotActive     = (SAI_SLOTACTIVE_0 | SAI_SLOTACTIVE_1);
复制代码





4、最后

     使用STM32F769-DISOC配合论坛之前送的小音箱,播放音乐的效果和我手机电脑播放的听不出区别。我用手机语音备忘录录制了一段放在附件里面,感兴趣可以试听下。


PS:附件的源码里面我默认关闭了汉字库下载到NORFLASH,如果是第一次运行程序请打开相应的宏定义加载字库。


测试代码和文件:
audio.rar (3.89 MB, 下载次数: 349)
1 收藏 6 评论14 发布时间:2017-8-19 21:10

举报

14个回答
netlhx 回答时间:2017-8-20 08:43:00
顶,好贴
戏如人生 回答时间:2017-8-20 18:16:08
赞一个!
andeyqi 回答时间:2017-8-20 23:35:43
zero99 回答时间:2017-8-21 08:31:15
顶,好贴
哈佛祖安智 回答时间:2017-8-21 12:49:52

顶,好贴
leifeng1 回答时间:2017-8-21 23:59:39
刚好有这个开发板,回头试试
15616384352 回答时间:2017-8-22 11:00:37
谢谢分享,学习了
wambob 回答时间:2017-8-25 15:24:58
学习            
Paderboy 回答时间:2017-8-28 08:52:42
赞,刚看到。。。。支持晚了。。
12下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版