OpenEdv-开源电子网

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

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

[复制链接]

6

主题

17

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-7-20
在线时间
7 小时
发表于 2016-8-24 22:05:11 | 显示全部楼层 |阅读模式
1金钱
经过前几天对于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]
@正点原子

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-12-15
在线时间
1 小时
发表于 2018-12-19 12:00:03 | 显示全部楼层
能不能发份源码给我学习学习啊,刚入门,我也在弄这样的实验,但是遇到好多问题,麻烦了,谢谢 870327588@qq.com
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-4-15
在线时间
1 小时
发表于 2019-4-18 10:23:51 来自手机 | 显示全部楼层
楼主可以发源码给我吗,最近在做课设学习这个,1375347607@qq.com
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 10:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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