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

【我爱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扩展软件包
关注我们
st-img 微信公众号
st-img 手机版