中级会员
 
- 积分
- 447
- 金钱
- 447
- 注册时间
- 2020-7-16
- 在线时间
- 85 小时
|

楼主 |
发表于 2020-11-8 14:28:26
|
显示全部楼层
有点找不到思路,因为播放的SAI外设也是用的DMA,然后DMA开了两个中断,一个是传输完成,一个是传输一半的。这个是DMA的中断服务函数,下面那段是播放一首曲子的函数。
void DMA2_Channel1_IRQHandler(void)
{
if( __HAL_DMA_GET_FLAG(&SAI1_TXDMA_Handler,DMA_FLAG_TC1) != RESET )
{
__HAL_DMA_CLEAR_FLAG(&SAI1_TXDMA_Handler,DMA_FLAG_TC1);
wavtransferend = WAV_SAI_TX_DMA_BUFSIZE/2;
}
if( __HAL_DMA_GET_FLAG(&SAI1_TXDMA_Handler,DMA_FLAG_HT1) != RESET )
{
__HAL_DMA_CLEAR_FLAG(&SAI1_TXDMA_Handler,DMA_FLAG_HT1);
wavtransferend = 0;
}
}
/*播放音乐*/
audio_stop();
res=f_open(audiodev.file,(TCHAR*)fname,FA_READ); //打开文件
if(res==0)
{
f_lseek(audiodev.file, wavctrl.datastart); //跳过文件头
fillnum=wav_buffill(audiodev.saibuf,WAV_SAI_TX_DMA_BUFSIZE,wavctrl.bps);
audio_start();
HAL_SAI_Transmit_DMA(&SAI1A_Handler,audiodev.saibuf,WAV_SAI_TX_DMA_BUFSIZE/2);
while(res==0)
{
while(wavtransferend==-1)//等待wav传输完成;
{
if(fillnum<(WAV_SAI_TX_DMA_BUFSIZE/2))//播放结束播放下一首
{
res=1;
break;
}
}
loc = wavtransferend;
wavtransferend=-1;
fillnum=wav_buffill(audiodev.saibuf+loc,WAV_SAI_TX_DMA_BUFSIZE/2,wavctrl.bps);
wav_get_curtime(audiodev.file,&wavctrl);//得到总时间和当前播放的时间
}
audio_stop();
}
|
|