目录
一、初识DMA
1.简介
2.主要特性整理
3.DMA处理过程
二、DMA结构组成
1.DMA结构框图
2.相关寄存器
(1)DMA通道x配置寄存器(DMA_CCRx x= 1...7)
(2)中断状态寄存器(DMA_ISR)——查询当前DMA传输状态
(3)中断标志清除寄存器(DMA_IFCR)
(4)DMA通道x传输数量寄存器(DMA_CNDTRx)(x = 1...7)
(5)DMA通道x外设地址寄存器(DMA_CPARx)(x= 1..7)
(6)DMA通道x存储器地址寄存器(DMA_CMARx)(x = 1...7)
3.DMA优先级
4.DMA请求映像
(1)DMA1请求
(2)DMA2请求
三、配置DMA
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外设均可作为访问的源和目标。
(1)在发生一个事件后,外设向DMA控制器发送一个请求信号。
(2)DMA控制器根据通道的优先权处理请求。
(3)当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给外设一个应答信号。
(3)当从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,DMA控制器同时撤销应答信号。
(4)如果有更多的请求时,外设可以启动下一个周期。
补充:DMA就是建立数据传输通道。
位14(MEM2MEM):存储器到存储器模式。(DMA通道的操作可以在没有外设请求的情况下进行。该模式不能与循环模式同时使用)
位4(DIR):数据传输方向。
位13:12( PL[1:0] ):通道优先级。
位0(EN):开启通道。
位11:10( MSIZE[1:0] ):存储器数据宽度。(8、16、32位)
位9:8( PSIZE[1:0] ):外设数据宽度。(8、16、32位)
位5(CIRC):循环模式。(用于处理循环缓冲区和连续的数据传输。当启动了循环模式,数据传输的数目变为0时,将会自动地被恢复成配置通道时设置的初值,DMA操作将会继续进行)
位6(PINC):外设地址增量模式。
位7(MINC):存储器地址增量模式。
仲裁器管理DMA通道请求分为两个阶段:软件阶段和硬件阶段。
(1)软件阶段:每个通道的优先级可在DMA_CCRx寄存器中设置,分为最高、高、中和低优先级。
(2)硬件阶段:如果两个请求有相同软件优先级,较低编号的通道比较高编号的通道有较高的优先级。(大容量芯片中,DMA1控制器拥有高于DMA2控制器的优先级)
注:多个请求通过逻辑或输入到DMA控制器,只能有一个请求有效。
1. 使能DMA时钟:__HAL_RCC_DMA1_CLK_ENABLE
2. 初始化DMA:HAL_DMA_Init( 函数初始化DMA相关参数)、__HAL_LINKDMA( 函数连接DMA和外设)
3. 使能串口的DMA发送,启动传输: HAL_UART_Transmit_DMA
4. 查询DMA传输状态:__HAL_DMA_GET_FLAG( 查询通道传输状态 )、__HAL_DMA_GET_COUNTER( 获取当前传输剩余数据量 )
5. DMA中断使用:编写中断服务函数 xxx_IRQHandle( HAL_NVIC_EnableIRQ、HAL_NVIC_SetPriority )
可以结合这篇文章:
嵌入式——直接存储器存取(DMA)补充
http://t.csdnimg.cn/XFj0vhttp://t.csdnimg.cn/XFj0v