本帖最后由 877049204 于 2018-6-1 11:29 编辑
- <div>上表就列出了 DMA2 所有可能的选择情况,来总共 64 种组合,比如本章我们要实现串口 1的 DMA 发送,即 USART1_TX,就必须选择 DMA2 的数据流 7,通道 4,来进行 DMA 传输。这里注意一下,有的外设(比如 USART1_RX)可能有多个通道可以选择,大家随意选择一个就可以了。
- </div>
上表就列出了 DMA2 所有可能的选择情况,来总共 64 种组合,比如本章我们要实现串口 1的 DMA 发送,即 USART1_TX,就必须选择 DMA2 的数据流 7,通道 4,来进行 DMA 传输。这里注意一下,有的外设(比如 USART1_RX)可能有多个通道可以选择,大家随意选择一个就可以了。
具体步骤见附件:STM32F4开发指南——库函数版本
这里主要介绍函数具体怎么使用
- #include "dma.h"
- //DMAx µÄ¸öͨµÀÅäÖÃ
- //´«ÊäÐÎʽ¹Ì¶¨
- //´æ´¢Æ÷->ÍâÉèģʽ/8λÊý¾Ý¿í¶È/´æ´¢Æ÷ÔöÁ¿Ä£Ê½
- //DMA_Streamx:DMAÊý¾ÝÁ÷,DMA1_Stream0~7/DMA2_Stream0~7
- //chx:DMAͨµÀÑ¡Ôñ, [url=home.php?mod=space&uid=144993]@ref[/url] DMA_channel DMA_Channel_0~DMA_Channel_7
- //par:ÍâÉèµØÖ· mar:´æ´¢Æ÷µØÖ· ndtr:Êý¾Ý´«ÊäÁ¿
- void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
- {
- DMA_InitTypeDef DMA_InitStructure;
- if((u32)DMA_Streamx>(u32)DMA2)//µÃµ½µ±Ç°streamÊÇDMA2»¹ÊÇ DMA1
- {
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2ʱÖÓʹÄÜ
- }else
- {
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1ʱÖÓʹÄÜ
- }
- DMA_DeInit(DMA_Streamx);
- while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//µÈ´ýDMA¿ÉÅäÖÃ
- /* ÅäÖÃDMA Stream */
- DMA_InitStructure.DMA_Channel = chx; //ͨµÀÑ¡Ôñ
- DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMAÍâÉèµØÖ·
- DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA ´æ´¢Æ÷0µØÖ·
- DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//´æ´¢Æ÷µ½ÍâÉèģʽ
- DMA_InitStructure.DMA_BufferSize = ndtr;//Êý¾Ý´«ÊäÁ¿
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //ÍâÉè·ÇÔöÁ¿Äģʽ
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//´æ´¢Æ÷ÔöÁ¿Ä£Ê½
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //ÍâÉèÊý¾Ý³¤¶È8λ
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //´æ´¢Æ÷Êý¾Ý³¤¶È:32 λ
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ÆÕͨģʽ
- DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//ÖеÈÓÅÏȼ¶
- DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//FIFOģʽ½ûÖ¹
- DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;//FIFOãÐÖµ
- DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; //´æ´¢Æ÷Í»·¢µ¥´Îģʽ
- DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; //ÍâÉèÍ»·¢µ¥´Îģʽ
- DMA_Init(DMA_Streamx, &DMA_InitStructure);//³õʼ»¯ DMA Stream
- }
- //¿ªÆôÒ»´ÎDMA´«Êä
- //DMA_Streamx:DMAÊý¾ÝÁ÷,DMA1_Stream0~7/DMA2_Stream0~7
- //ndtr:Êý¾Ý´«ÊäÁ¿
- void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
- {
- DMA_Cmd(DMA_Streamx, DISABLE); //??DMA ??
- while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){} //??DMA?????
- DMA_SetCurrDataCounter(DMA_Streamx,ndtr); //?????
- DMA_Cmd(DMA_Streamx, ENABLE); //?? DMA ??
- }
|