STM32f4 播放WAV音频出现问题

2019-07-20 20:37发布

我打算从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;
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。