我初始代码是:按键点亮LED,定时器关闭LED,开通音频的DMA传输。耳机能听到声音。
现在改了一下:按键1点LED的时候,开启DMA====>Enable_DMA_Sport1();
按键2点亮LED的时候,关闭DMA==>Disable_DMA_Sport1();
功能可以实现,发现问题:
1:开启DMA:能听到声音的时候,按1,结果发现听不到声音了。
2:开启DMA:按键速度快的时候,发现灯点亮了。但是收不到声音。必须长按才能收到声音。
请问:是否在开启和关闭DMA这2个程序中要先关中断再运行?还是运行后要添加延时。
你在按键的时候,可以查一下SPROT和DMA各个寄存器的值,在代码中打一些断电,运行时多查看各个标志位和寄存器的状态。查看DMA状态寄存器运行是否完成或者出错,可以用示波器测量一下在听不到声音时,SPROT接口的波形是否正常。
if(keydata & LUK) { *pLED_DAT &=~LED0; Disable_DMA_Sport1(); } if(keydata & LLK) { *pLED_DAT &=~LED1; Enable_DMA_Sport1(); }
在Enable_DMA_Sport1();那里设断点的话,运行正常,如果不设断点,多按几次后将不执行主程序,扫描不到按键,停止的时候一直在EX_INTERRUPT_HANDLER(Sport1_RX_ISR)中运行。
你在关闭DMA之后加个长延时,使能DMA前加个长延时看看