嵌入式开发之STM32学习笔记day14
STM32F103C8T6 DMA直接存储器存储
1 DMA简介
直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。 两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。
- 每个通道都支持软件触发和特定的硬件触发
- STM32F103C8T6 DMA资源:DMA1(7个通道)
2 DMA主要特性
- 12个独立的可配置的通道(请求):DMA1有7个通道,DMA2有5个通道
- 每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。
- 在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、 中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推) 。
- 独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。
- 支持循环的缓冲器管理
- 每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。
- 存储器和存储器间的传输
- 外设和存储器、存储器和外设之间的传输
- 闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。
- 可编程的数据传输数目:最大为65535
3 存储器映像
类型 | 起始地址 | 存储器 | 用途 |
ROM | 0x0800 0000 | 程序存储器Flash | 存储C语言编译后的程序代码 |
0x1FFF F000 | 系统存储器 | 存储BootLoader,用于串口下载 | |
0x1FFF F800 | 选项字节 | 存储一些独立于程序代码的配置参数 | |
RAM | 0x2000 0000 | 运行内存SRAM | 存储运行过程中的临时变量 |
0x4000 0000 | 外设寄存器 | 存储各个外设的配置参数 | |
0xE000 0000 | 内核外设寄存器 | 存储内核各个外设的配置参数 |
- 程序存储器Flash: 用于存储用C语言编写的程序代码,经过编译和链接后生成的机器码。这是微控制器的主要非易失性存储器,用于存放程序代码,即使在断电后也能保持代码不丢失。
- 系统存储器: 用于存储BootLoader。BootLoader是微控制器启动时首先运行的代码,负责初始化硬件和加载主程序到RAM中执行。此外,它还支持通过串口下载程序,方便程序的更新和调试。
- 选项字节: 存储一些独立于程序代码的配置参数,如读写保护、用户配置选项等。这些选项字节可以用来配置微控制器的一些特定功能,如调试模式、内存保护等。
- 运行内存SRAM: 用于存储运行过程中的临时变量和数据。SRAM是易失性存储器,断电后数据会丢失,但它提供了快速的数据存取速度,适合用于需要频繁读写的场合。
- 外设寄存器: 存储各个外设的配置参数。STM32F103C8T6具有丰富的外设,如GPIO、ADC、USART等,这些外设通过寄存器进行配置和控制。外设寄存器允许开发者自定义外设的行为,如设置引脚模式、配置通信参数等。
- 内核外设寄存器: 存储内核各个外设的配置参数。这些寄存器用于配置STM32的内核外设,如NVIC(嵌套向量中断控制器)、SysTick定时器等,它们对于系统级的控制和中断管理至关重要。
4 DMA基本结构
分析:
该流程图描述了微控制器中存储器和外设之间的数据传输机制。流程开始于外设,它包含起始地址、数据宽度和地址是否自增等信息。外设通过外设寄存器与Flash和SRAM进行数据交互,这些存储器也具有起始地址、数据宽度和地址自增等属性。数据传输由传输计数器控制,该计数器管理传输过程中的数据量,并与自动重装器协同工作,后者用于自动重新加载计数器的值。M2M(Memory-to-Memory)模块允许在存储器之间直接传输数据,无需CPU介入,提高数据传输效率。整个数据传输过程可以由硬件触发或软件触发启动,并通过开关控制进行管理。该流程图展示了一个高效的数据传输系统,旨在优化微控制器内部资源的使用,支持复杂的嵌入式应用需求。
5 DMA请求
这张图片展示了STM32微控制器中DMA1(直接存储器访问)请求的映射和优先级设置。图中详细描述了各种外设如何通过不同的通道发起DMA请求,以及这些请求的优先级配置。
- 外设请求信号:图中左侧列出了多种外设,包括ADC(模数转换器)、USART(通用同步/异步收发传输器)、TIM(定时器)、SPI(串行外设接口)等。每个外设可以通过硬件请求或软件触发(MEM2MEM位)来发起DMA请求。
- 硬件请求与软件触发:硬件请求:直接由外设的硬件事件触发,如定时器溢出、串口接收到数据等;软件触发:通过软件设置特定的控制位来触发DMA传输,通常用于内存到内存的数据复制。
- 通道映射:每个外设的DMA请求被映射到特定的DMA通道。例如,ADC1的DMA请求映射到通道1,USART3_TX(USART3的发送数据)映射到通道2等。图中显示了7个DMA通道,每个通道可以配置为响应特定的外设请求。
- 优先级配置:DMA通道的优先级分为高优先级和低优先级。图中右侧的方框内显示了优先级的配置,高优先级的通道在图中位于上方。这种优先级设置确保了关键任务能够及时得到处理,例如实时性要求高的任务。
- 通道使能位(EN位):每个通道都有一个使能位(EN位),用于控制该通道是否激活。只有使能的通道才能响应外设的DMA请求。
- 内部DMA1请求:图中还显示了内部DMA1请求,这些请求可能来自微控制器内部的其他模块或处理器。
总结:这张图详细展示了STM32微控制器中DMA请求的配置和优先级设置,帮助开发者理解如何配置和使用DMA来优化数据传输效率。通过合理配置DMA通道和优先级,可以显著提高系统的数据处理能力和响应速度。
6 数据宽度与对齐
7 数据转运DMA
分析:该图片展示了一个数据传输的示意图,涉及到两个数据数组(DataA 和 DataB)以及两种触发数据传输的方式(DMA 和软件触发)。
- 数据数组:左侧是源数据数组(DataA),包含7个元素:DataA[0] 到 DataA[6];右侧是目标数据数组(DataB),同样包含7个元素:DataB[0] 到 DataB[6]。
- 数据传输:图中用箭头表示数据从源数组(DataA)传输到目标数组(DataB)的过程。每个 DataA 中的元素对应传输到 DataB 中的相应位置,即 DataA[0] 传输到 DataB[0],DataA[1] 到 DataB[1],依此类推。
- 触发方式:图片底部有两个触发机制:DMA(直接存储器访问)和软件触发。DMA:表示数据传输可以由硬件自动完成,无需CPU介入,通常用于高效的数据搬运,以减轻CPU的负担并提高系统性能。软件触发:表示数据传输由软件控制,可能涉及到CPU的指令执行,适用于数据传输不需要特别高效率的场景。
总结:该图表明了在系统中可以通过DMA硬件机制或软件方式来实现两个数据数组之间的数据传输。DMA方式因其高效性,特别适合于需要快速大量数据传输的应用场景,而软件触发则提供了更多的灵活性和控制能力。
8 ADC扫描模式+DMA
分析:该图示详细描述了基于STM32微控制器的模拟数字转换器(ADC)的工作流程,其中涉及DMA(直接存储器访问)控制器和ADC硬件触发机制。当触发信号激活时,ADC将按顺序对配置的多个模拟输入通道(如通道0至通道6)进行采样,并将转换得到的数字信号存储在ADC数据寄存器(ADC_DR)中。随后,DMA控制器可以被配置为自动从ADC_DR寄存器中读取这些数据,并将它们传输到内存中的指定位置,无需CPU的直接干预,从而提高数据传输效率并减轻CPU的负担。同时,转换结束信号(EOC)可用于指示ADC转换已完成,允许系统执行后续操作,例如处理数据或准备下一次转换。整个流程不仅优化了数据采集过程,还通过硬件触发和DMA传输提高了系统的响应速度和整体性能。
9 面试问题
Q1:DMA和软件触发有什么区别?
DMA(直接存储器访问)和软件触发是两种不同的数据传输机制,它们在控制方式、性能、应用场景等方面有显著的区别:
1. 控制方式
DMA:由硬件控制,不依赖于CPU。DMA控制器负责管理数据传输,允许外设直接与内存进行数据交换,无需CPU干预。
软件触发:由CPU控制,需要通过软件指令来启动和控制数据传输。CPU必须参与数据传输的每个步骤,包括从源地址读取数据和写入目标地址。
2. 性能
DMA:通常提供更高的性能,因为它允许数据传输与CPU执行其他任务并行进行,从而提高系统的整体效率。
软件触发:性能较低,因为CPU必须暂停其当前任务来处理数据传输,这可能导致处理延迟和效率降低。
3. 资源占用
DMA:DMA传输过程中,CPU可以执行其他任务,因此CPU资源占用较少。
软件触发:CPU需要持续参与数据传输过程,因此CPU资源占用较多。
4. 应用场景
DMA:适用于需要快速、大量数据传输的场景,如视频处理、音频处理、高速数据采集等。
软件触发:适用于数据量较小或对实时性要求不高的场景,或者在没有DMA硬件支持的系统中。
5. 复杂性和灵活性
DMA:配置相对复杂,需要设置DMA通道、源地址、目标地址、传输大小等参数。但一旦配置完成,可以非常灵活地处理各种数据传输任务。
软件触发:实现简单,易于理解和控制,但灵活性较低,每次数据传输都需要编写相应的代码。
6. 实时性
DMA:由于DMA传输独立于CPU,因此可以提供更好的实时性能,特别是在需要快速响应的系统中。
软件触发:实时性较差,因为数据传输依赖于CPU的调度,可能会受到其他任务的影响。
总结来说,DMA提供了一种高效、灵活且资源占用低的数据传输方式,特别适合于需要高性能和实时性的应用。而软件触发则因其简单性和易于控制的特点,适用于数据量小或对性能要求不高的场景。
Q2:DMA控制器如何优化数据传输效率?
-
降低CPU负载:DMA传输过程中,CPU无需参与数据的逐个搬运,从而可以处理其他任务,提高系统整体性能。
-
提高传输效率:DMA控制器专门设计用于数据传输,速度远高于CPU逐字节操作,从而提高数据传输效率。
-
多通道设计:STM32的DMA模块通常包含多个独立通道,每个通道可以配置不同的传输任务,支持并行处理。
-
灵活的传输模式:支持内存到内存、内存到外设、外设到内存等多种传输模式,满足不同应用需求。
-
高带宽:STM32的DMA模块支持高速数据传输,能够匹配高速外设如SPI、USART等的数据处理需求。
-
中断管理:提供传输完成、传输错误等多种中断机制,便于CPU及时响应和处理。
-
优化内存对齐:合理选择数据宽度并进行数据对齐,可以减少传输次数,提高传输效率。
-
使用中断和回调函数:合理配置DMA中断和回调函数,可以在数据传输完成后及时进行后续处理,避免CPU的无效等待。
-
双缓冲(乒乓)机制:在需要连续数据传输的应用中,使用双缓冲机制可以有效提高传输效率。
-
优先级配置:根据任务的紧急程度和数据传输的重要性,合理配置DMA通道的优先级,可以确保关键任务的及时完成。
-
利用DMA的FIFO功能:STM32的DMA控制器通常带有FIFO缓冲区,合理配置FIFO阈值可以提高数据传输的稳定性。