關於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的下一個單元)。

 

 

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