这只是一个简单的应用,其目的是将4次 ADCResult 6 / 7 的数据搬移到RAM (占用8个16Bit 空间)中(后面用于ADC 滤波处理),且产生中断,ADC 结果的放置方式为 6 7 6 7 6 7 6 7 :
实例代码:
// Configure DMA Channel
DMADest = &DMABuf1[0];
DMASource = &AdcResult.ADCRESULT6;
// 6 7 6 7 6 7 6 7
DMACH1AddrConfig(DMADest, DMASource);
// 1 Burst will move 2 AdcResults
DMACH1BurstConfig(1, 1, 1);
// 4 Bursts will be moved in 1 transfer,
// so 8 Grids will be filled in 1 transfer
DMACH1TransferConfig(3, 0, 1);
// 1 Burst will wrap SRC Address
// 4 Burst will wrap Dest Address
DMACH1WrapConfig(0, 0, 3, 0);
//Use DMA_SEQ2INT to start the x-fer.
DMACH1ModeConfig(DMA_SEQ2INT,
PERINT_ENABLE,
ONESHOT_DISABLE,
CONT_ENABLE,
SYNC_DISABLE,
SYNC_SRC,
OVRFLOW_DISABLE,
SIXTEEN_BIT,
CHINT_END,
CHINT_ENABLE);
StartDMACH1();
通俗易懂的解释:
DMACH1BurstConfig(1, 1, 1) 参数依次解释如下:
1,表示一次触发搬移 (1 + 1)个Word(这里也就是两个16Bits 的数据);
1,表示每搬完一个Word,源地址继上次偏移1个单位;
1,表示每搬完一个Word,目的地址继上次偏移1个单位;
特别注意:每个Burst 内部,地址会自动按照设置值进行偏移,但最后一次搬移,地址会停留在最后一个有效地址,比如pDest 起初为0,搬完第一个Word后,pDest = pDest + 1 (也就是1),搬完第二个地址后,pDest 仍然等于1;
DMACH1TransferConfig(3, 0, 1) 参数依次解释如下:
3,表示每完成(3 + 1)次Burst搬移(此例也就是每2个Word)之后,即产生中断(字面理解,4次Burst 等同于一次Transfer);
0,表示相对于前一次Burst结束的基础上,源地址需要进一步的偏移值,此例不偏移,是由于每搬完两个Word后(也就是一次Burst)就需要地址绕回,所以配置多少无所谓;
1,表示相对于前一次Burst结束的基础上,目的地址需要进一步的偏移值,此例偏移1,表示接着上一次Burst 完成后连续放置数据,注意避坑:如果此处配置为0,则会出现4次Burst的目的地址使用情况为 0 1,1 2,2 3,3 4,也就是只会出现在前5个单元,而不是8个目的地址单元均会出现数据;
DMACH1WrapConfig(0, 0, 3, 0) 参数依次解释如下:
0,表示(0 + 1)次Burst之后源地址需要绕回;
0,表示源地址直接绕回到0;
3,表示(3 + 1)次Burst 之后目的地址需要绕回;
0,表示目的地址直接绕回到0;
DMACH1ModeConfig() 这里重点配置有选择DMA 传输触发源,此例为ADCInt2 : DMA_SEQ2INT;是否需要使能中断ISR,此例为需要使能DMA 返回中断;
PS : 如有理解不当的地方,欢迎批评指正