OpenEdv-开源电子网

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

STM32f4 播放WAV音频出现问题

[复制链接]

6

主题

17

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-7-20
在线时间
7 小时
发表于 2016-8-20 11:13:07 | 显示全部楼层 |阅读模式
15金钱
我打算从SD卡读取数据,然后丢到DAC中,通过功放发出声音。
请看下面程序
(现在遇到问题时:播放出来的声音不是完整的,只播放开始读到的16K,后面指针位移所指的数据没有读到,我看了两天了,没有找到问题到底出在哪里)


定时器部分:处理数据
void TIM3_IRQHandler(void)
{
        u16 temp;
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
        {

          if(CHanalnum==1)//single track
                {
                        if(Bitnum==8)//8λ¾«¶è
                        {
                                DAC->DHR12R1=wav_buf[DApc]*10/volume;
                                DAC->DHR12R2=wav_buf[DApc]*10/volume;
                                DAC->SWTRIGR|=0x01;
                                DApc++;
                        }
                        else if(Bitnum==16)
                        {
                                temp=(((u8)(wav_buf[DApc+1]-0x80)<<4)|(wav_buf[DApc]>>4))*10/volume;
                                DAC->DHR12L1=temp;
                                DAC->DHR12L2=temp;
                                DAC->SWTRIGR|=0x01;
                                DApc+=2;                               
                        }
                }
                else if(CHanalnum==2)//á¢ì&#229;éù           10110010         10110010
                {
                        if(Bitnum==8)//8&#206;&#187;&#190;&#171;&#182;è
                        {
                                DAC->DHR12R1=wav_buf[DApc]*10/volume;//í¨μà2μ&#196;12&#206;&#187;óò&#182;&#212;&#198;&#235;êy&#190;Y
                                DApc++;
                                DAC->DHR12R2=wav_buf[DApc]*10/volume;//í¨μà2μ&#196;12&#206;&#187;óò&#182;&#212;&#198;&#235;êy&#190;Y
                                DApc++;
                                DAC->SWTRIGR|=0x01;//èí&#188;t&#198;&#244;&#182;ˉá&#189;&#184;&#246;í¨μàμ&#196;×a&#187;&#187;
                        }
                        else if(Bitnum==16)//16&#206;&#187;&#190;&#171;&#182;è(&#207;èμí&#206;&#187;oó&#184;&#223;&#206;&#187;)
                        {
                                DAC->DHR12L1=(((u8)(wav_buf[DApc+1]-0x80)<<4)|(wav_buf[DApc]>>4))*10/volume;//í¨μà1μ&#196;12&#206;&#187;óò&#182;&#212;&#198;&#235;êy&#190;Y
                                DApc+=2;
                                DAC->DHR12L2=(((u8)(wav_buf[DApc+1]-0x80)<<4)|(wav_buf[DApc]>>4))*10/volume;//í¨μà1μ&#196;12&#206;&#187;óò&#182;&#212;&#198;&#235;êy&#190;Y
                                DApc+=2;
                                DAC->SWTRIGR|=0x01;//èí&#188;t&#198;&#244;&#182;ˉá&#189;&#184;&#246;í¨μàμ&#196;×a&#187;&#187;                               
                        }               
          }       

                  if(DApc==16384)   // 处理完16K数据之后标志位:DACdone=1
                 {
                        DApc=0;
                        DACdone=1;
                        }       
                 }
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
}


//播放部分
u8 Playwav(char *FileName)
{
        u32 times;
        u32  i;
        FIL Fwav;
        FRESULT Res;
        UINT BR;
        Res=f_open(&Fwav,FileName,FA_OPEN_EXISTING | FA_READ);
        if(Res!=FR_OK)
        {
        return 1;
        }
        else
        {
         Res = f_read(&Fwav, wav_buf, sizeof(wav_buf), &BR);     /* Read a chunk of src file */
                if(Res==FR_OK)
                {
                 WAV_Init(wav_buf);
                 DACdone = 0;
                 DApc   = 44;         
                 TIM3_Int_Init((1000000/wav1.SampleRate)-1,83);  //20K    //启动定时器
                 times = (wav1.DATAlen>>10)-1;  //calculate the data        //读取到的音频文件大小
                 for(i=0;i<times/16;i++)    //transt 16KB data when once     //循环一次处理16K的数据
                 {
                  while(!DACdone) //wait the 16384 BYTE change over       //标志位DACdone
                        DACdone=0;

                  f_lseek(&Fwav,16384*i);                                            //每循环一次,数据指针后移16K
                  Ready = f_read(&Fwav,wav_buf,16384,&BR);                      //读取当前指针所指向的数据
                 }
                }
                else
                {
                return Res;
                }
                f_close(&Fwav);
        }
        return 0;
}


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

使用道具 举报

6

主题

17

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-7-20
在线时间
7 小时
 楼主| 发表于 2016-8-20 17:54:08 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-8-24 22:31:45 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 04:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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