这两天在做F4上MP3软解(不带UCOS,裸奔的)
在自己的探索板上把原子哥的综合测试里面的MP3解码那一块单独拿出来了,想通过定时器按MP3采样率中断,中断中给DAC发送数据来播放MP3
移植完成后,可以听到音乐(44.1k,128kbps),但是背景音有间断,声音不连贯,用示波器测试定时器的中断频率并不是采样率,而是在低于采样率一些42k左右,并且还在来回跳动,
定时器用的TIM2,中断优先级0,0,并且只有这一个中断程序,中断中只给DAC1写一个值,
后来发现
readptr+=offset; //MP3读指针偏移到同步字符处.
bytesleft-=offset; //buffer里面的有效数据个数,必须减去偏移量
err=MP3Decode(mp3decoder,&readptr,&bytesleft,(short*)audiodev.tbuf,0);//解码一帧MP3数据
if(err!=0)
{
printf("decode error:%d
",err);
break;
}
else
{
MP3GetLastFrameInfo(mp3decoder,&mp3frameinfo); //得到刚刚解码的MP3帧信息
if(mp3ctrl->bitrate!=mp3frameinfo.bitrate) //更新码率
{
mp3ctrl->bitrate=mp3frameinfo.bitrate;
}
mp3_fill_buffer((u16*)audiodev.tbuf,mp3frameinfo.outputSamps,mp3frameinfo.nChans);//填充pcm数据
把红字那一句,就是MP3解码的函数注释掉,定时器中断频率就正常了,也不跳变了.
之后修改了程序,改用TIM2的TRGO触发DAC的DMA,噪音消失,应该采样率正常了,但是加入红外遥控的程序,也是原子哥例程的红外程序,用于做歌曲切换,但是发现异常不灵敏,
由于红外程序是TIM1中由捕获和溢出中断做的,就又把红字的MP3解码那一句注释掉了,之后遥控器就灵敏了,
所以怀疑MP3软解码的过程中是不是有影响到STM32的中断系统,比如当中屏蔽了全局中断一类什么的,搞不明白,所以还请大神不吝赐教,谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
多谢原子哥回复,问题找到了,是在SDIO读取函数里里面关闭了总中断,默认例程用的是查询方式,不是DMA方式,在查询方式的分支下面关闭了总中断
if (DeviceMode == SD_POLLING_MODE)
{
INTX_DISABLE();//关闭总中断(POLLING模式,严禁中断打断SDIO读写操作!!!)
while(!(SDIO->STA&((1<<10)|(1<<4)|(1<<1)|(1<<3)|(1<<9))))//数据块发送成功/下溢/CRC/超时/起始位错误
把方式改成DMA并且把中断抢占优先级设定的低于我的中断就可以了,
之前注释掉MP3解码函数就恢复正常是因为MP3不解码了,SDIO读完一帧的数据,继续读取数据的指针并没有改变,所以没有继续读取,也就不会重复关闭总中断了
还是谢谢原子哥的回复,不过问一下 为什么SDIO读取默认不用DMA方式而用查询方式呢?
一周热门 更多>