DAC通过DMA通道播放SD卡中的WAV音频

2019-07-20 02:32发布

经过前几天对于DMA、DAC和文件系统的学习。现在音频能够播放,但是有个问题存在
播放过程中,会出现播放前一段然后中间有一个间断,再播放后一段。
我是用的方法:DMA传输数据:传输完成一半产生一个中断,全部传输完成又可以产生一个中断。
所以我再DMA中断中这样写:
我定义的buffer是8K个字节,前半段填充4K,后半段填充4K。

(我的分析:因为DMA产生中断也需要时间,而且是两次中断,所以导致播放效果是一卡一卡的,播一段,产生一个中断,然后再播一段,又产生一个中断,这样循环。

请问大家我的分析对吗?还是我的程序有问题?后面尝试使用DMA的双缓存)

DMA中断程序
[mw_shl_code=c,true]void DMA1_Stream5_IRQHandler(void)
{
  /* Test on DMA2 Channel3 Transfer Complete interrupt */
  if(DMA_GetITStatus(DMA1_Stream5,DMA_IT_TCIF5)==SET)   
  {  
                        WavBuffFLAG = 2;                //全部传输完成中断
    /* Clear DMA2 Channel3 Half Transfer, Transfer Complete and Global interrupt pending bits */
    DMA_ClearITPendingBit(DMA1_Stream5,DMA_IT_TCIF5);
  }
        /* Test on DMA2 Channel3 Transfer Complete interrupt */
  if(DMA_GetITStatus(DMA1_Stream5,DMA_IT_HTIF5)==SET)
  {  
                WavBuffFLAG = 1;              //传输完成一半中断
    /* Clear DMA2 Channel3 Half Transfer, Transfer Complete and Global interrupt pending bits */
    DMA_ClearITPendingBit(DMA1_Stream5,DMA_IT_HTIF5);
  }
}[/mw_shl_code]

主函数:
[mw_shl_code=c,true]int main(void)
{
/************省略一串初始化********************/
        res = f_mount(FS_SD, &fs);        /* Mount a logical drive */
       
        TIM_Cmd(TIM6, DISABLE);
        res = f_open(&fil, "hlw.wav", FA_OPEN_EXISTING | FA_READ);    //打开音频文件
        if(res == FR_OK)
        {
                f_lseek(&fil, 44);
          res = f_read(&fil, WavBuff, 8192, &br);
        }
        TIM_Cmd(TIM6, ENABLE);
  while(1)
        {
                br = 0;
                if(WavBuffFLAG==1)                        //填充前半段BUFFER
                {
                        /* read wave data to buffer*/
                        res = f_read(&fil, WavBuff, 4096, &br);
                        WavBuffFLAG        = 0;       
                        if(br<4096)
                        {
                                /* TIM6 enable counter */
                                TIM_Cmd(TIM6, DISABLE);
                                /* close file */
                                f_close(&fil);
                        }
                }
                if(WavBuffFLAG==2)               //填充后半段BUFFER
                {
                /* read wave data to buffer*/
                        res = f_read(&fil, &WavBuff[4096], 4096, &br);
                        WavBuffFLAG        = 0;
                        if(br<4096)
                        {
                                /* TIM6 enable counter */
                                TIM_Cmd(TIM6, DISABLE);
                                /* close file */
                                f_close(&fil);
                        }

                }

         }
}[/mw_shl_code]
@正点原子
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。