基于STM32 F401 Discovery板:
DMA2在AHB1總線上
步驟一:使能DMA
#defineDMA_STREAM_CLOCKRCC_AHB1Periph_DMA2
RCC_AHB1PeriphClockCmd(DMA_STREAM_CLOCK,ENABLE);
步驟二:reset DMA Stream register:
/*ResetDMAStreamregisters(fordebugpurpose)*/
DMA_DeInit(DMA_STREAM);
步驟三:
/*CheckiftheDMAStreamisdisabledbeforeenablingit.
NotethatthisstepisusefulwhenthesameStreamisusedmultipletimes:
enabled,thendisabledthenre-enabled...Inthiscase,theDMAStreamdisable
willbeeffectiveonlyattheendoftheongoingdatatransferanditwill
notbepossibletore-configureitbeforemakingsurethattheEnablebit
hasbeenclearedbyhardware.IftheStreamisusedonlyonce,thisstepmight
bebypassed.*/
while(DMA_GetCmdStatus(DMA_STREAM)!=DISABLE)
{
}
步驟四:初始化DMA 結(jié)構(gòu)體
/*ConfigureDMAStream*/
DMA_InitStructure.DMA_Channel=DMA_CHANNEL;
DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)SRC_Const_Buffer;
DMA_InitStructure.DMA_Memory0BaseAddr=(uint32_t)DST_Buffer;
DMA_InitStructure.DMA_DIR=DMA_DIR_MemoryToMemory;
DMA_InitStructure.DMA_BufferSize=(uint32_t)BUFFER_SIZE;
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Enable;
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority=DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode=DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold=DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst=DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single;
DMA_Init(DMA_STREAM,&DMA_InitStructure);
其中:
DMA_PeripheralBaseAddr--》外設(shè)地址,可以選擇USART,I2C,ADC等
DMA_Memory0BaseAddr-》memory地址,用于外設(shè)和內(nèi)存的數(shù)據(jù)傳輸
DMA_DIR -》傳送方向,分別有外設(shè)到內(nèi)存,內(nèi)存到外設(shè),內(nèi)存到內(nèi)存
DMA_BufferSize -》傳輸?shù)腷uffer size
DMA_PeripheralInc -》外設(shè)地址是否自加
DMA_MemoryInc -》內(nèi)存地址是否自加
DMA_PeripheralDataSize -》外設(shè)每個data的size,分別有1byte,半字,全字
DMA_MemoryDataSize -》內(nèi)存的每個data的size,如上
DMA_Mode -》DMA mode,分別是傳輸完了是否循環(huán)還是正常
步驟四:DMA使能中斷:
DMA_ITConfig(DMA_STREAM,DMA_IT_TC,ENABLE);
其中DMA有發(fā)送完成中斷,完成一半中斷,和錯誤中斷等
步驟五:開始傳輸
/*DMAStreamenable*/
DMA_Cmd(DMA_STREAM,ENABLE);