经过前几天对于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]
@正点原子
一周热门 更多>