利用前一篇文章讲解的IIS知识,只是不是利用轮询,而是利用DMA控制器,让数据在内存和IIS的发送FIFO之间传送。这样在音乐播放过程中,进行暂停,静音,播放,音量增减都不会使音乐产生卡顿的感觉。
注意DMA的请求是由发送FIFO自动发起的。
可以设置DMAMSKTRIG的STOP位停止DMA,但是真正的停止需要参考ON_OFF位。ON_OFF位当为非自动重载,且CURR_TC为0,该位自动为OFF。STOP位置位,该位也置为OFF。所以需要注意,一次DMA传输结束,假设开启了DMA中断,那么再DMA中断需要再次打开DMA,因为CURR_TC=0使其停止了。
当CURR_TC=0,且DMA ACK=1的话,TC的数值又再次加载了到CURR_TC中。下一次传输又开始了。
int main(void)
{
。。。。。。
while(1)
{
printf("\r\nplease select the following alpa");
printf("\r\n r--run music s--stop music");
printf("\r\n p--pasue music m--mute music");
printf("\r\n u--up voice d--down voice\r\n");
putchar((swt = getchar()));
switch(swt)
{
//play
case 'r':
if(STOP == I2S_CTL.state)
{
volume = 0x00; //初始化音量,默认最大
mute = 0xa0; //初始化为不静音
playsound(music + 44, sizeof(music) - 44);
}
else
printf("\r\nRUNNING......\r\n");
break;
//stop
case 's':
if(RUNNING

基于S3C2440的简易音乐播放器通过DMA和IIS接口实现流畅播放,避免操作时的卡顿。通过设置DMA控制器,数据自动在内存与IIS发送FIFO间传输。注意DMA的STOP位和ON_OFF位管理,以及在DMA中断中重新开启传输以实现连续播放。此设计为进一步扩展如循环播放、切换歌曲等功能提供了基础。

159

被折叠的 条评论
为什么被折叠?



