本帖最后由 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 ??
}
|
附件太大啦,不上传了