Stm32 DMA配置(库函数笔记)

1.简介

<1>:DMA,全称为:Direct Memory Access,即直接存储器访问。实际上,DMA作为一个硬件电路,实现在无CPU干预的情况下,内存(memory)和外设之间的联系

<2>:STM32最多有两个DMA的控制器,DMA1有7个通道,DMA2有5个通道,也存在一个仲裁器来判断优先级(共四级 很高 高 中 低)

<3>:DMA的通道连接着专用硬件的DMA请求,可以通过软件来配置

<4>:在DMA中,每个通道存在着三个事件标志(半传输,传输完成,传输失败),通过读取其中的0/1判断是否配置成功

<5>:可以实现外设(Peripheral)和内部存储器(Memory)之间的传输(单向,可相互转换)

<6>:可以实现内存到内存之间的传输(M2M)


2.配置过程

1.实现DMA时钟使能

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA1

2.实现DMA的初始化

    
        DMA_InitTypeDef DMA_InitStruct;        
        DMA1_MEM_LEN=cndtr;//设置每一次的数据传输量
	DMA_DeInit(DMA_CHx);//刷新设置
	//开始初始化
	DMA_InitStruct.DMA_BufferSize=cndtr;//数据传输量
	DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralDST;//director(目标)  DST(外设为目标) SRC(外设为源头)
	DMA_InitStruct.DMA_M2M= DMA_M2M_Disable;//不采用存储器到存储器
	DMA_InitStruct.DMA_MemoryBaseAddr=cmar;//设置存储器地址
	DMA_InitStruct.DMA_MemoryDataSize=DMA_PeripheralDataSize_Byte;//8位
	DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;//设置增量模式
	DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;//设置循环模式
	DMA_InitStruct.DMA_PeripheralBaseAddr=cpar;
	DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//8位
	DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
	DMA_InitStruct.DMA_Priority=DMA_Priority_Medium;//设置优先级
	
	DMA_Init(DMA_CHx,&DMA_InitStruct);//设置结构体
	
} 

3.开启传输过程(注意实现DMA数据值的刷新)

void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{ 
	DMA_Cmd(DMA_CHx,DISABLE);//关闭通道,设置DMA的数据值
	DMA_SetCurrDataCounter(DMA_CHx,DMA1_MEM_LEN);//设置传输数据
	DMA_Cmd(DMA_CHx,ENABLE);//使能,产生数据传输
}	  

注:对于DMA初始化详解:

typedef struct {   
uint32_t DMA_PeripheralBaseAddr;   uint32_t DMA_MemoryBaseAddr;       uint32_t DMA_DIR;                uint32_t DMA_BufferSize;     
 uint32_t DMA_PeripheralInc;       uint32_t DMA_MemoryInc;        
uint32_t DMA_PeripheralDataSize;   uint32_t DMA_MemoryDataSize;      uint32_t DMA_Mode;             
uint32_t DMA_Priority;    
uint32_t DMA_M2M;      }
DMA_InitTypeDef; 

1.第一个参数 DMA_PeripheralBaseAddr 用来设置 DMA 传输的外设基地址,比如要进行串口 DMA 传输,那么外设基地址为串口接受发送数据存储器 USART1->DR 的地址,表示方法为 &USART1->DR,在传输之前要设置外设和内存的地址,一般是以指针的形式

 第二个参数DMA_MemoryBaseAddr为内存基地址,也就是我们存放DMA传输数据的内存地址。

 第三个参数 DMA_DIR 设置数据传输方向,决定是从外设读取数据到内存还送从内存读取数 据发送到外设,也就是外设是源地还是目的地,DST(distraction 目标),SRE(source 源头)所以选择值为 DMA_DIR_PeripheralDST。

 第四个参数 DMA_BufferSize 设置一次传输数据量的大小,(不超过65535)

 第五个参数 DMA_PeripheralInc 设置传输数据的时候外设地址是不变还是递增。如果设置 为递增,那么下一次传输的时候地址加 1

第六个参数 DMA_MemoryInc 设置传输数据时候内存地址是否递增。这个参数和 DMA_PeripheralInc 意思接近,只不过针对的是内存。

第七个参数 DMA_PeripheralDataSize 用来设置外设的的数据长度是为字节传输(8bits), 半字传输(16bits)还是字传输(32bits),这里我们是 8 位字节传输,所以值设置为 DMA_PeripheralDataSize_Byte。

 第八个参数 DMA_MemoryDataSize 是用来设置内存的数据长度,和第七个参数意思接近,这 里我们同样设置为字节传输 DMA_MemoryDataSize_Byte




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值