嵌入式系统及应用 (19).pdf
嵌入式系统及应用嵌入式系统及应用第十九讲 DMA【课本10.2】直接存储器存取直接存储器存取DMA,也属于深度内容范畴也属于深度内容范畴,当实际应用开发中当实际应用开发中,需需要提高存储器与外设传输速度需要用到要提高存储器与外设传输速度需要用到DMA技术技术。这里给出基本内涵这里给出基本内涵,以以便实际开发中想到还有这种技术可以使用便实际开发中想到还有这种技术可以使用。例如例如,我们在做一个灯光量化我们在做一个灯光量化项目时项目时,使用使用DMA-UART传输传输,解决了解决了CPU的占用问题的占用问题。嵌入式系统及应用嵌入式系统及应用10.2 DMA10.2.1 DMA的通用基础知识的通用基础知识1.DMA含义含义为了为了提高提高CPU的利用效率的利用效率,人们提出了许多减轻人们提出了许多减轻CPU负担的方法负担的方法。直接存储直接存储器存取器存取(Direct Memory Access,DMA)是一种数据传输方式是一种数据传输方式,该方式可以使数该方式可以使数据不经过据不经过CPU直接在存储器与直接在存储器与I/O设备之间设备之间、不同存储器之间进行传输不同存储器之间进行传输。这样的这样的好处是好处是传输速度块传输速度块,且且不占用不占用CPU的时间的时间。DMA传输将数据从一个地址空间复制到另一个地址空间传输将数据从一个地址空间复制到另一个地址空间。当当MCU初始化传初始化传输动作输动作,传输动作本身由传输动作本身由DMA控制器完成控制器完成,而而MCU可以继续处理其它的工作可以继续处理其它的工作。第第2 2页页 共共1515页页嵌入式系统及应用嵌入式系统及应用2.DMA控制器控制器MCU内部的内部的DMA控制器是一种能够通过专用总线将存储器与具有控制器是一种能够通过专用总线将存储器与具有DMA能力的外设连接起来的控制器能力的外设连接起来的控制器。一般而言一般而言,DMA控制器含有地址总线控制器含有地址总线、数据数据总线和控制寄存器总线和控制寄存器。高效率的高效率的DMA控制器具有访问其所需要的任意资源的能控制器具有访问其所需要的任意资源的能力力,而无须处理器本身的介入而无须处理器本身的介入,它它必须能产生中断必须能产生中断,必须能在控制器内部计必须能在控制器内部计算出地址算出地址。实现实现DMA传输时传输时,是由是由DMA控制器直接掌管总线控制器直接掌管总线,因此因此,存在存在着一个着一个总线控制权转移问题总线控制权转移问题。即即DMA传输前传输前,MCU要把总线控制权交给要把总线控制权交给DMA控制器控制器,在结束在结束DMA之后之后,DMA控制器应立即把总线控制权再交回给控制器应立即把总线控制权再交回给MCU。值得注意的是值得注意的是,通常只有数据量较大的外设才需要有支持通常只有数据量较大的外设才需要有支持DMA的能力的能力,如视频如视频、音频和网络等接口音频和网络等接口。第第3 3页页 共共1515页页嵌入式系统及应用嵌入式系统及应用3.DMA的一般操作流程的一般操作流程这里以这里以RAM与与I/O接口之间通过接口之间通过DMA的数据传输为例来说明一个完整的的数据传输为例来说明一个完整的DMA传输传输过程过程,一般需要经过:一般需要经过:请求请求、响应响应、传输传输、结束结束四个步骤四个步骤。(1)CPU向向DMA发出请求发出请求。CPU完成对完成对DMA控制器的初始化控制器的初始化,并向并向I/O接口发出接口发出操作命令操作命令,I/O接口向接口向DMA控制器提出请求控制器提出请求。(2)DMA响应响应。DMA控制器对控制器对DMA请求判别优先级及屏蔽请求判别优先级及屏蔽,向总线裁决逻辑提向总线裁决逻辑提出总线请求出总线请求。当当CPU执行完当前总线周期即可释放总线控制权执行完当前总线周期即可释放总线控制权。此时总线裁决逻辑输此时总线裁决逻辑输出总线应答出总线应答,表示表示DMA已经响应已经响应,由由DMA控制器通知控制器通知I/O接口进行接口进行DMA传输传输。(3)DMA传输传输。DMA控制器获得总线控制权后控制器获得总线控制权后,CPU即刻挂起或只执行内部操即刻挂起或只执行内部操作作,由由DMA控制器输出读写命令控制器输出读写命令,直接控制直接控制RAM与与I/O接口进行接口进行DMA传输传输。(4)DMA结束结束。当完成规定的成批数据发送后当完成规定的成批数据发送后,DMA控制器即刻释放总线控制控制器即刻释放总线控制权权,并向并向I/O接口发出结束信号接口发出结束信号。当当I/O接口收到结束信号后接口收到结束信号后,停止停止I/O设备的工作设备的工作,同同时时CPU发出中断请求发出中断请求,使使CPU从不介入的状态解脱从不介入的状态解脱,并执行一段检查本次并执行一段检查本次DMA传输操传输操作正确性的代码作正确性的代码。最后最后,带着本次操作结果及状态继续执行原来的程序带着本次操作结果及状态继续执行原来的程序。第第4 4页页 共共1515页页嵌入式系统及应用嵌入式系统及应用10.2.2 基于基于构件的构件的DMA模块编程方法模块编程方法1.STM32L431芯片芯片DMA模块的通道源模块的通道源STM32L431芯片中的芯片中的DMA模块可以实现模块可以实现外设到存储器外设到存储器、存储器到外存储器到外设设、存储器到存储器存储器到存储器以及以及外设到外设外设到外设的数据传输的数据传输,并支持外设与存储器之并支持外设与存储器之间的间的双向传输双向传输以及以及循环缓冲区管理循环缓冲区管理;还可以访问片上存储器映射的器件;还可以访问片上存储器映射的器件,如如FLash、SRAM、URAT灯外设灯外设。STM32L431芯片中有两个芯片中有两个DMA模块模块,分别是分别是DMA1和和DMA2,每个模块有每个模块有7个通道个通道。第第5 5页页 共共1515页页嵌入式系统及应用嵌入式系统及应用2.DMA构件的头文件构件的头文件头文件头文件dma.h中给出了中给出了DMA构件提供的构件提供的4个基本对外接口函数个基本对外接口函数,包括包括初始初始化函数化函数、DMA发送函数发送函数、DMA接收函数接收函数、使能使能DMA中断函数中断函数。第第6 6页页 共共1515页页嵌入式系统及应用嵌入式系统及应用3.基于构件的基于构件的DMA编程举例编程举例本节中的以本节中的以DMA与与UART2之间的数据传输为例之间的数据传输为例,将将DMA1的通道的通道6配置成配置成UART2接收接收,通道通道7配置成配置成UART2发送发送,测试工程见电子资源测试工程见电子资源“.04-SoftwareCH10DMA-STM32L431”。(1)初始化初始化DMA模块以及使能模块以及使能DMA模块传输完成中断模块传输完成中断。UART_User表示表示数据传输的串口号数据传输的串口号,DMA_UART_RX和和/DMA_UART_TX分别表示进行内存传分别表示进行内存传输数据到串口和串口传输数据到内存的通道输数据到串口和串口传输数据到内存的通道,当数据传输完成后会触发对应的当数据传输完成后会触发对应的DMA中断中断。dam_urat_init(UART_User);dma_enable_re_init(DMA_UART_RX);dma_enable_re_init(DMA_UART_TX);第第7 7页页 共共1515页页嵌入式系统及应用嵌入式系统及应用(2)DMA传输数据到传输数据到UART。str1表示要进行数据发送的内存地址表示要进行数据发送的内存地址,UART_User表示进行数据接收的串口表示进行数据接收的串口,60表示传输的数据长度表示传输的数据长度。当函数执行完成当函数执行完成后后,会将会将str1为首地址的为首地址的60字节的数据传输到字节的数据传输到UART_User的数据寄存器中的数据寄存器中,并通并通过串口进行输出过串口进行输出。dma_uart_send(uint32_t)&str1,UART_User,60);(3)DMA从从UART接收数据接收数据。UART_User表示进行数据发送的串口表示进行数据发送的串口,data表示保存数据的地址表示保存数据的地址。当当UART_User接收到数据时接收到数据时,将数据传输到将数据传输到data所表示的所表示的地址中地址中。dma_uart_recv(UART_User,&data);第第8 8页页 共共1515页页嵌入式系统及应用嵌入式系统及应用第第9 9页页 共共1515页页嵌入式系统及应用嵌入式系统及应用10.2.3 DMA构件的制作过程构件的制作过程.DMA模块寄存器概述模块寄存器概述STM32L431芯片中含有两个芯片中含有两个DMA模块模块,分别为分别为DMA1和和DMA2,每个模块每个模块均有均有7个通道个通道(通道通道x=17)。以以DMA1为例为例,DMA1包含包含7个寄存器个寄存器,详细的资详细的资料可查阅芯片的参考手册或电子资源的补充阅读材料料可查阅芯片的参考手册或电子资源的补充阅读材料。第第1010页页 共共1515页页嵌入式系统及应用嵌入式系统及应用2.DMA寄存器结构体寄存器结构体类型类型构件制作时使用构件制作时使用“.03_MCUstartupSTM32L431xx.h”文件中的文件中的三个结构体类型三个结构体类型。第第1111页页 共共1515页页嵌入式系统及应用嵌入式系统及应用3.DMA构件接口函数原型分析构件接口函数原型分析(1)初始化函数初始化函数dma_uart_init。该函数中需要使用该函数中需要使用1个参数个参数,即串口号即串口号,通通过传入串口号来进行过传入串口号来进行DMA的不同通道源选择以及使能串口的的不同通道源选择以及使能串口的DMA发送和接收发送和接收。(2)使能中断函数使能中断函数dma_enable_re_init。该函数中需要使用一个参数该函数中需要使用一个参数,即通即通道号道号dmaNo,在该函数中使能对不同通道的传输完成中断在该函数中使能对不同通道的传输完成中断。第第1212页页 共共1515页页嵌入式系统及应用嵌入式系统及应用(3)DMA数据发送函数数据发送函数dma_uart_send。该函数需要三个参数:源数据的地该函数需要三个参数:源数据的地址址SrcAddr、串口号串口号uartNo和传输的数据长度和传输的数据长度Length。(4)DMA数据接收函数数据接收函数dma_uart_recv。该函数中需要使用该函数中需要使用2个参数:串口个参数:串口号号uartNo和数据存放的目的地址和数据存放的目的地址ch。第第1313页页 共共1515页页嵌入式系统及应用嵌入式系统及应用4.DMA构件部分函数源码构件部分函数源码第第1414页页 共共1515页页嵌入式系统及应用嵌入式系统及应用谢谢!谢谢!第第1515页页 共共1515页页