利用前一篇文章讲解的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 == I2S_CTL.state)
{
rIISCON = 0x0;
rIISFCON = 0x0;
rDMASKTRIG2 = 1<<2;
I2S_CTL.flag =