welcom ! Handel home

2014年7月2日 星期三

ST公司提供在庫函數中的 DMA的基本結構和和常用函數

DMA的基本結構和和常用函數,這些都是ST公司提供在庫函數中的。 

1、  下面代碼是一個標準DMA設置,當然實際應用中可根據實際情況進行裁減:
 DMA_DeInit(DMA_Channel1); 
上面這句是給DMA配置通道,根據ST提供的資料,STM3210FxDMA包含7個通道(CH1~CH7),也就是說可以為外設或memory提供7座“橋樑” 

DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; 
上面語句中的DMA_InitStructure是一個DMA結構體,在庫中有聲明了,當然使用時就要先定義了;DMA_PeripheralBaseAddr是該結構體中一個資料成員,給DMA一個起始位址,好比是一個buffer起始位址,資料流程程是:外設寄存器 DMA_PeripheralBaseAddàmemory中變數空間(或flash中資料空間等),ADC1_DR_Address是我定義的一個ADD var 

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue; 
上面這句很顯然是DMA要連接在Memory中變數的位址,ADC_ConvertedValue是我自己在memory中定義的一個變數; 

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; 
上面的這句是設置DMA的傳輸方向,就如前面我所說的,DMA可以雙向傳輸,也可以單向傳輸,這裡設置的是單向傳輸,如果需要雙向傳輸:把DMA_DIR_PeripheralSRC改成DMA_DIR_PeripheralDST即可。 

DMA_InitStructure.DMA_BufferSize = 2; 
上面的這句是設置DMA在傳輸時緩衝區的長度,前面有定義過了buffer的起始地址:ADC1_DR_Address ,為了安全性和可靠性,一般需要給buffer定義一個儲存片區,這個參數的單位有三種類型:ByteHalfWordword
我設置的2half-word 32位的MCU1half-word16 bits 

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 
上面的這句是設置DMA的外設遞增模式,如果DMA選用的通道(CHx)有多個外設連接,需要使用外設遞增模式:DMA_PeripheralInc_Enable;我的例子裡DMA只與ADC1建立了聯繫,所以選用DMA_PeripheralInc_Disable 

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
上面的這句是設置DMA的記憶體遞增模式,DMA訪問多個記憶體參數時,需要使用DMA_MemoryInc_Enable,當DMA只訪問一個記憶體參數時,可設置成:DMA_MemoryInc_Disable 

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; 
上面的這句是設置DMA在訪問時每次操作的資料長度。有三種資料長度類型,前面已經講過了,這裡不在敘述。 

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; 與上面雷同。在此不再說明。 

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; 
上面的這句是設置DMA的傳輸模式:連續不斷的迴圈模式,若只想訪問一次後就不要訪問了(或按指令操作來反問,也就是想要它訪問的時候就訪問,不要它訪問的時候就停止),可以設置成通用模式:DMA_Mode_Normal 

DMA_InitStructure.DMA_Priority = DMA_Priority_High; 
上面的這句是設置DMA的優先順序別:可以分為4級:VeryHighHigh,Medium,Low. 

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; 
上面的這句是設置DMA2memory中的變數互相訪問的 DMA_Init(DMA_Channel1,&DMA_InitStructure); 
前面那些都是對DMA結構體成員的設置,在次再統一對DMA整個模組做一次初始化,使得DMA各成員與上面的參數一致。 /*DMA Enable*/ 

DMA_Cmd(DMA_Channel1,ENABLE); 
至此,整個DMA總算設置好了,要使DMA與外設建立有效連接,這不是DMA自身的事情,是各個外設的事情,每個外設都有 一個xxx_DMACmd(XXXx,Enable )函數,如果使DMAADC建立有效聯繫,就使用ADC_DMACmd(ADC1,Enable); (這裡我啟用了ADC中的ADC1模組)。 

Register
Description
ISR
紀錄DMA 中斷狀態的暫存器
IFCR
計錄DMA 清除中斷的暫存器
CCRx
紀錄DMA Channelx 設定的暫存器
CNDTRx
紀錄DMA Channelx待傳輸資料筆數的暫存器
CPARx
儲存DMA Channelx 周邊記憶體位置的暫存器
CMARx
儲存DMA Channelx 主記憶體位置的暫存器

沒有留言: