关于F28335的DMA用法

参考资料:TI的ControlSuit例程里面的Example_2833xAdcToDMA.c和TI的关于DMA的Reference Guide(SPRUFB8D)

https://e2echina.ti.com/question_answer/microcontrollers/c2000/f/56/p/30915/105409

http://bbs.elecfans.com/jishu_900708_1_1.html

F28335的DMA中有几个概念不容易理解,分别是,Burst、Transfer和Wrap。

Burst:外设中断一次传输的数据,由最多32个字(16bits)组成,Burst大小用BURST_SIZE定义。

Transfer:每个通道进行一次传输时,一共传送的Burst数据,其大小用TRANSFER_SIZE定义。

Burst:每传送完一个字,将source或destination对应的BURST_STEP值加到SRC_ADDR或DST_ADDR中。

TRNSFER:有两种改变地址方式。第一种,将SRC/DST_TRANSFER STEP加到对应地址指针上,第二种,通过Wrapping方式。在wrap方式下,SRC/DST_TRANSFER STEP无效。

Wrap不好理解,结合官方的例子去看,Example_2833xAdcToDMA.c

第一个函数DMACH1BurstConfig(3,1,10);里面的三个参数分别是BURST_SIZE,SRC_BURST_STEP和DST_BURST_STEP,因为ADC的一次SOC可以采集4个通道(A0~A3),根据前面DMA的Burst介绍,可知BURST_SIZE应设置为3(=4-1);SRC_BURST_STEP应设置为1(通道连续);程序中DST_BURST_STEP设置为10通过仿真可以看到第一个ADC通道A0从DMABuf1[0]开始存储,第二个ADC通道A0从DMABuf1[11]开始存储,第三个ADC通道A0从DMABuf1[21]开始存储,第四个ADC通道A0从DMABuf1[31]开始存储,也可将该值改为其他,修改后各个ADC通道对应的DMABuf1起始地址将发生变化。

第二个函数DMACH1TransferConfig(9,1,0);里面的三个参数分别是TRANSFER_SIZE,SRC_TRANSFER_STEP和DST_TRANSFER_STEP,因为一共要进行10次SOC,每次转换4个通道,每个通道需要10个存储单元,因此TRANSFER_SIZE设置为9(=10-1);因为需要设置成Wrap方式,所以SRC_TRANSFER_STEP和DST_TRANSFER_STEP忽略。

注:Transfer结束触发DMA中断。

第三个函数DMACH1WrapConfig(1,0,0,1);里面的四个参数分别是SRC_WRAP_SIZE,SRC_WRAP_STEP,DST_WRAP_SIZE和DST_WRAP_STEP。每进行完2次burst以后,源地址回到初始位置(两次Burst正好对应4个通道每个都转换2次),每进行完1次burst,目的地址变为起始地址+1(指向DMABuf1的下一个单元)。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章