DMA的基本結構和和常用函數,這些都是ST公司提供在庫函數中的。
1、 下面代碼是一個標準DMA設置,當然實際應用中可根據實際情況進行裁減:
DMA_DeInit(DMA_Channel1);
上面這句是給DMA配置通道,根據ST提供的資料,STM3210Fx中DMA包含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定義一個儲存片區,這個參數的單位有三種類型:Byte、HalfWord、word,
我設置的2個half-word ;32位的MCU中1個half-word占16 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級:VeryHigh,High,Medium,Low.
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
上面的這句是設置DMA的2個memory中的變數互相訪問的 DMA_Init(DMA_Channel1,&DMA_InitStructure);
前面那些都是對DMA結構體成員的設置,在次再統一對DMA整個模組做一次初始化,使得DMA各成員與上面的參數一致。 /*DMA Enable*/
DMA_Cmd(DMA_Channel1,ENABLE);
至此,整個DMA總算設置好了,要使DMA與外設建立有效連接,這不是DMA自身的事情,是各個外設的事情,每個外設都有 一個xxx_DMACmd(XXXx,Enable )函數,如果使DMA與ADC建立有效聯繫,就使用ADC_DMACmd(ADC1,Enable); (這裡我啟用了ADC中的ADC1模組)。
Register
|
Description
|
ISR
|
紀錄DMA 中斷狀態的暫存器
|
IFCR
|
計錄DMA 清除中斷的暫存器
|
CCRx
|
紀錄DMA Channelx 設定的暫存器
|
CNDTRx
|
紀錄DMA Channelx待傳輸資料筆數的暫存器
|
CPARx
|
儲存DMA Channelx 周邊記憶體位置的暫存器
|
CMARx
|
儲存DMA Channelx 主記憶體位置的暫存器
|
沒有留言:
張貼留言