回复【8楼】wushanyu1:
---------------------------------
DMA的作用就是可以不依赖CPU进行数据传输。当你执行buffer1的DMA传输命令后,CPU就会开始执行下一条语句。此时你就可以去读SD卡把buffer2填满,buffer1 DMA传输过程不需要理会。 然后在DMA传输完成中断你除了要清除标志位外还需要设置一个全局变量标志上一个buffer的数据已经传输完成,在播放大循环中等待这个标志位,满足条件后再把buffer2的数据DMA到DAC,同时再去读SD填buffer1. 当然你还需要个标志位来切换buffer1还是buffer2.
XferCplt = 1; //DMA传输完成标志位
while(1)
{
if( Get_One_Block(&fileR,&fc) == 0)//FLAC解码成功
{
while(XferCplt == 0) //等待上一个buffer传输完成
{}
if(bufferswitch == 1)//buffer切换标志位,填buffer操作在 Get_One_Block()中完成
{
Audio_MAL_Play((u32)PCM_buf1,decoded_buf_sz*2);//开始DMA传输
bufferswitch = 0; //切换buffer
}
else
{
Audio_MAL_Play((u32)PCM_buf0,decoded_buf_sz*2);
bufferswitch = 1;
}
XferCplt = 0;//传输完成变量清零
}
else
{
break;//解码不成功就跳出循环
}
} |