我打算从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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>