目前参考原子哥的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
|