OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7101|回复: 4

F407如何使用DMA从外部FLASH中读取WAV文件进行播放

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-6-24
在线时间
2 小时
发表于 2015-7-19 11:44:53 | 显示全部楼层 |阅读模式
5金钱

目前参考原子哥的407开发板已经完成了读取外部Flashh(W25Q64,,已经加载了文件系统FATS )中的WAV文件,并且通过I2S接口进行播放(使用DMA方式),这种方式播放WAV文件是没有问题的,可是,目前参考的例子程序,就是说CPU必须等待WAV文件读取完了才能从播放声音的函数

 wav_pla_song 中解放,就是说在CPU播放声音文件的时候一直在下面这个死循环while(1)中(虽然有DMA发送数据到I2S接口),目前想知道没有方法能够让CPU读声音文件的时候也使用DMA方式,真正的让CPU解放出来。相当于一方面通过DMA读取SPI Flash上的WAV文件到buf中,然后再通过DMA发送到I2S接口,这样CPU就可以解放出来了。希望得到大家的帮助,谢谢。

while(1)
    {
     while(wavtransferend==0)//????wav?????ê??;
     {
      delay_ms(1000/OS_TICKS_PER_SEC);
     }
     wavtransferend=0;
      if(wavwitchbuf)fillnum=wav_buffill(audiodev.i2sbuf2,WAV_I2S_TX_DMA_BUFSIZE,wavctrl.bps);//????buf2
     else fillnum=wav_buffill(audiodev.i2sbuf1,WAV_I2S_TX_DMA_BUFSIZE,wavctrl.bps);//????buf1
      while(audiodev.status&(1<<1))//??????·???
     {  
      wav_get_curtime(audiodev.file,&wavctrl);//????×??±?????±?°??·????±??
      audiodev.totsec=wavctrl.totsec;   //????????
      audiodev.cursec=wavctrl.cursec;
      audiodev.bitrate=wavctrl.bitrate;
      audiodev.samplerate=wavctrl.samplerate;
      audiodev.bps=wavctrl.bps;
        if(audiodev.status&0X01)break;//????°???????
      else delay_ms(1000/OS_TICKS_PER_SEC);
     }
     if((audiodev.status&(1<<1))==0||(fillnum!=WAV_I2S_TX_DMA_BUFSIZE))//???ó?á????·?/??·??ê??
     { 
      break;
     }      
    }wav_play_songwav_play_songwav_play_songwav_play_song

最佳答案

查看完整内容[请看2#楼]

回复【3楼】veni2015: --------------------------------- 上OS就好了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 2015-7-19 11:44:54 | 显示全部楼层
回复【3楼】veni2015:
---------------------------------
上OS就好了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 2015-7-19 22:54:07 | 显示全部楼层
没必要吧,一定要的话,可以尝试两者分开处理,DMA读数据,然后dma发数据,CPU只处理DMA配置(设置地址,长度,开启/关闭灯操作)。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-6-24
在线时间
2 小时
 楼主| 发表于 2015-7-21 00:27:41 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢原子哥,主要是在例子中while死循环等待文件播放完,这一点很不方便,因为设备在播放语音时,CPU不能干其他的活。要等待,所以想解放CPU,目前的做法是将wav_buffill 函数放到中断回调函数中处理,就是在每次在中断中读取文件(8KB)需要耗费10ms左右的时间,基本能满足要求。我现在还是想知道,如果要读取已经建立文件系统上的Flash中的文件,是否能用DMA的方式,这个与没有文件系统时读取Flash上的数据的操作方式是否一样,因为如果没有文件系统的话,配置DMA时直接设置与SPI Flash相关的配置参数就可以了。
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-6-24
在线时间
2 小时
 楼主| 发表于 2015-7-23 01:00:31 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
谢谢原子哥,目前的程序是从其它CPU平台移植过来的,目前要上OS的话怕花的时间有点长,后面会考虑上OS,初步考虑UCOS
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-20 16:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表