微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 DMA理解

STM32 DMA理解

时间:11-11 来源:互联网 点击:
通道配置过程

1、在DMA_CPARx寄存器总设置外设寄存器的地址。发生外设数据传输请求时,这个地址将是传输的源或目标

2、在DMA_CMARx寄存器中设置数据存取器的地址,发生外设数据传输请求时,传输的数据将从这个地址读出或写入这个地址

3、在DMA_CMARx寄存器中设置要传输的数据量,在每个数据传输后,这个数值递减。

4、在DMA_CCRx寄存器的PL位中设置通道的优先级

5、在DMA_CCRx寄存器中设置数据传输方向、循环模式、外设和寄存器的增量模式、外设和存储器的数据宽度、传输一半产生中断或传输完成产生中断

6、设置DMA_CCRx寄存器的ENABLE位,启动该通道

一旦启动了DMA通道,它即可响应连到该通道上的外设的DMA请求

当传输一般的数据后,半传输标志(HTIF)将被置1,当设置了半传输中断位时,

将产生一个中断请求,在数据传输结束后,传输完成标志被置1,当设置了允许传输完成中断位后,将产生一个中断请求。

循环模式

循环模式用于处理循环缓冲区和连续的数据传输(如ADC的扫描模式),在DMA_CCRx寄存器中的CIRC位用于开启这一功能,当启动了循环模式,数据传输的数目变为0时,将会自动地被恢复成配置通道时设置的初值,DMA操作将会继续进行。

存储器到存储器模式

DMA通道的操作可以在没有外设请求的情况下进行,这种操作就是存储器到存储器模式。当设置了DMA_CCRx寄存器中的MEM2MEM位之后,在软件设置了DMA_CCRx寄存器中的EN位启动DMA通道时,DMA传输将马上开始,当DMA_CNDTRx寄存器变为0时,DMA传输结束,存储器到存储器模式不能与循环模式同时使用

DMA首先,初始化,要了解触发源,也可通过软件编程设置具体的时间,具体条件来触发DMA数据传输,DMA的触发源是事件(1)、首先开启时钟

RCC_APBPeriphClockCmd(RCC_APBPeriph_DMA1,ENABLE);//开启DMA时钟

结构体(DMA_InitTypeDef)说明:

PeripheralBaseAddr:外设地址 CPAR

MemoryBaseAddr: 存储器地址 CMAR

DIR:        传输方向(从外设读/从存储器读)

BufferSize:     传输数量

PeripheralInc:    外设地址增量模式(传完一个数后地址是否+1)

MemoryInc:     存储器地址增量模式

PeripheralDataSize: 外设数据宽度(Byte / Half Word / Word)

MemoryDataSize:  存储器数据宽度

Mode:        循环/正常

Priority:       优先级

M2M:        存储器到存储器模式

DMA_DeInit(DMA_Channel1);

默认初始化配置

DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;

DMA_PeripheralBaseAddr是给DMA一个起始地址,在程序中如果这个是内存模式,这给的是一个定义的一个数组的指针,如buffer;其中USART1_DR_Base是自己定义的一个地址,这个地址的定义就是USART1_DR这个寄存器的地址。

需要注意的是,这个地址的定义,是由两部分组成的,基准地址+偏移地址,在此过程中,基准地址=0x4001 3800而偏移地址=0x04,所以最终地址为:0x4001 3804

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)Send_Buffer;

这个同样也是一个地址变量,这个地址的存放要发送的数据的

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

设置DMA的传输方向,这个可以是双向传输,也可以是单向传输,在库文件中有这样的定义;指定该外设是DMA的源还是目的地
DMA_DIR_PeripheralDST:该外设是DMA的目的地(要接受的设备地址)
DMA_DIR_PeripheralSRC:该外设是DMA的源(及要传输的数据)

DMA_InitStructure.DMA_BufferSize = Send_BufferSize;

这句话时设置DMA在传输时缓冲区的长度,一般需要给此缓冲区定义一个存储区,这个参数的单位有三种类型:Byte、HalfWord、Word,其中有:
Byte:8位
HalfWord:16位
Word:32位

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

设置DMA的外设递增模式,如果是设置成SPI模式,则读取数据的时候会向下一个地址移位在这里因为我们的外设是USART,则这个外设的地址始终是USART1_DR_Base,不需要进行自加即递增模式。

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

这句是设置DMA的内存递增模式,当需要访问多个内存参数时,需要使用这个

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

设置DMA在访问外设时操作的数据长度为Byte

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

设置DMA在访问内存时操作的数据长度为Byte

DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

设置DMA模式,这里是普通模式,即传输完成后就关闭了DMA,还有循环模式,后面说明。

DMA_InitStructure.DMA_Priority = DMA_Priority_High;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top