硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5633|回复: 3
收起左侧

[有问必答] STM32f4 播放WAV音频出现问题

[复制链接]

1

主题

2

回帖

1

积分

新手上路

积分
1
发表于 2016-8-20 20:30:51 | 显示全部楼层 |阅读模式
我打算从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)//á¢ìåéù           10110010         10110010
                {
                        if(Bitnum==8)//8λ¾«¶è
                        {
                                DAC->DHR12R1=wav_buf[DApc]*10/volume;//í¨μà2μÄ12λóò¶ÔÆëêy¾Y
                                DApc++;
                                DAC->DHR12R2=wav_buf[DApc]*10/volume;//í¨μà2μÄ12λóò¶ÔÆëêy¾Y
                                DApc++;
                                DAC->SWTRIGR|=0x01;//èí¼tÆô¶ˉὸöí¨μàμÄ×a»»
                        }
                        else if(Bitnum==16)//16λ¾«¶è(Ïèμíλoó¸ßλ)
                        {
                                DAC->DHR12L1=(((u8)(wav_buf[DApc+1]-0x80)<<4)|(wav_buf[DApc]>>4))*10/volume;//í¨μà1μÄ12λóò¶ÔÆëêy¾Y
                                DApc+=2;
                                DAC->DHR12L2=(((u8)(wav_buf[DApc+1]-0x80)<<4)|(wav_buf[DApc]>>4))*10/volume;//í¨μà1μÄ12λóò¶ÔÆëêy¾Y
                                DApc+=2;
                                DAC->SWTRIGR|=0x01;//èí¼tÆô¶ˉὸöí¨μàμÄ×a»»                                
                        }               
          }        

                  if(DApc==16384)   // 处理完16K数据之后标志位:DACdone=1
                 {
                        DApc=0;
                        DACdone=1;
                        }        
                 }
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //Çå3yÖD¶Ï±ê־λ
}


//播放部分
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;
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117563
QQ
发表于 2016-8-21 09:31:08 | 显示全部楼层
曾经初学STM32的时候,研究过DAC播放WM8978采用的音频数据,稍有点印象,说下我的思路。

使用DAC播放的话,建议采用DAC的DMA方式,并用定时器触发,定时器触发频率就是WAV的采样率。这样就CPU解放出来了,大大降低CPU利用率。
回复

使用道具 举报

1

主题

2

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2016-8-24 20:12:43 | 显示全部楼层
谢谢啦,正在按这个思路走
回复

使用道具 举报

1

主题

2

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2016-8-24 20:13:12 | 显示全部楼层

回 eric2013 的帖子

eric2013:曾经初学STM32的时候,研究过DAC播放WM8978采用的音频数据,稍有点印象,说下我的思路。

使用DAC播放的话,建议采用DAC的DMA方式,并用定时器触发,定时器触发频率就是WAV的采样率。这样就CPU解放出来了,大大降低CPU利用率。 (2016-08-21 09:31) 
谢谢你啦
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 16:17 , Processed in 0.050321 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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