一、DMA简介
DMA (Direct Memory Access) ,直接内存存储器,使用它在做数据传输时能够大大减轻CPU的负担。
DMA,全称 Direct Memory Access,即直接存储器访问。用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。DMA传输无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。
二、主要特性整理
(1)存储器和存储器间的传输。
(2)外设和存储器、存储器和外设之间的传输。
(3)有12个独立的可配置的通道(请求):DMA1有7个通道,DMA2有5个通道。
(4)可编程的数据传输数目:最大为65535。
(5)源和目标地址必须按数据传输宽度对齐。
(6)在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(小的优先于大的)。
(7)支持循环的缓冲器管理每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。
(8)每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。
(9)闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。
三、DMA处理过程
(1)在发生一个事件后,外设向DMA控制器发送一个请求信号。
(2)DMA控制器根据通道的优先权处理请求。
(3)当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给外设一个应答信号。
(4)当从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,DMA控制器同时撤销应答信号。
(5)如果有更多的请求时,外设可以启动下一个周期。
四、在STM32中DMA有norma和circular两种模式,每种模式在数据进行传输时需要告知传输数据的大小
1、Normal mode:
DMA 开始传输数据,当它传输完成后就会停止。下一次开始需要手动处理。
2、Circular mode:
DMA从传输开始,当它传输完成后会自动按照相同配置重新传输,周而复始直至被控制停止或传输发生错误。
五、DMA的普通模式和循环模式
DMA传输模式有两种,普通模式和循环模式。相关寄存器有DMA_CCRx的CIRC位和DMA_CNDTRx。
当工作在普通模式,DMA搬运了设定长度的数据后,CNDTR清0,会产生中断标志,然后DMA就停止工作了,如果再有数据也不接收了。需关断 DMA 使能后再重新配置后才能继续传输。
当工作在循环模式,DMA搬运了设定长度的数据后,CNDTR清0,会产生中断标志,如果再有数据,DMA会循环保存到内存中,覆盖前面的数据。在CNDTR=0时DMA会自动装载初始化时的配置,CNDTR重置为初始值。
DMA传输完成关闭是需要:1、先关闭外设;2、再关闭DMA模块,否则有一定概率导致DMA再次使用时异常。异常表现为DMA不运作。
关于在BP10上的DMA的结构体讲解:
DMA的工作(发送和接收)
1、在DMA接收,定义DMA接收的外设ID和DMA的各种参数
2、在DMA发送,定义DMA发送的外设ID和DMA的各种参数
3、了解DMA的结构体
第一个是DMA通道的传输方向(DMA CHANNEL DIR PERI2MEM意味着DMA将从外设读取数据到内存)(DMA_CHANNEL_DIR_MEM2PERI意味着DMA将内存读取数据到外设)(DMA_CHANNEL_DIR_MEM2MEM意味着DMA将一个内存模块数据读取到另一个内存模块)
第二个是DMA传输模式,分为(DMA_BLOCK_MODE 块传输和DMA_CIRCULAR_MODE循环传输)
第三个是循环模式下的一个阈值或者长度
第四个是DMA源的数据宽度
第五个是DMA目的地数据宽度
第六个是 DMA 操作中源地址的自动增量模式,当设置为 AINCR 时,源地址将会在每次传输后自动增加,以指向下一个数据。这是为了方便从源位置连续地读取数据。
第七个是DMA 操作中目的地地址的自动增量模式,当设置为 AINCR 时,目的地地址将会在每次传输后自动增加,以指向下一个数据。这是为了方便从目的地位置连续地读取数据。
第八个是源地址
第九个是目的地地址
第十个是数据缓存长度Bufferlen
DMA的外设ID值表