在理解adc灵活dma扫描以后,再看这一连。 上一连中,如果我将EDMA_SetChannelLink中仅设置为minor link,major link不用,理论上应该获得相同结果
Minor link在每次minorloop结束产生一次链接 Major link在major loop结束产生一次链接 如果我不用major link,只用minor link链接,应当是可以实现相同效果。所以注释掉EDMA_SetChannelLink(DMA0, DMAChannel_1, kEDMA_MajorLink, DMAChannel_0); 事实上这是运行结果图,最后一组数据没有打印出来。为什么呢? 首先查看接受数据的buffer里面数据情况,发现里面12个数据都有 那么为什么没有打印出来。根据while里面判断语句if (g_Transfer_Done_ch0)可以知道,每次dma通道0传输完成,g_Transfer_Done_ch0为true就打印数据,既然最后一次没打印,那就说明dma通道0并没有传输完成,g_Transfer_Done_ch0为false。可是确实是12个数据都有了啊,按照通道0传输3个参数配置,然后dma通道1传输12个adc通道值。12/3能整除,应该刚好都传输完啊?问题就出现在这里。 需要注意的是第一次dma通道1传输的adc值,其中adc的配置不是由dma通道0传输过来的,而是直接配置的12通道。而dma通道0传输的配置是从通道30开始,通道次序是30,29,12。 我们的buffer接收的12个数据,通道顺序是 12 30 29 12 30 29 12 30 29 12 30 29 12通道不是dma传过来的,dma通道0顺序又是30,29,12,所以在dma通道1传完最后一个数据时,其实dma通道0才传了一个通道29配置,最后的12通道并没有传过去,所以dma通道0并没有完成传输,也就不会调用回调函数将dma通道0的g_Transfer_Done_ch0置1。所以靠major link再触发一次dma通道0,让dma通道0传完数据,触发回调,将g_Transfer_Done_ch0置1。
|