0. 前言
DMA(Direct Memory Access,直接内存访问)是一种计算机系统中用于高效地实现数据传输的技术。它允许数据在外设和内存之间直接传输,而无需CPU的干预和数据复制。
传统上,在计算机系统中,外设(如硬盘、网络适配器、音频设备等)与内存之间的数据传输通常需要通过CPU进行中转。这意味着CPU需要花费大量的时间和计算资源来处理数据传输操作,同时限制了CPU执行其他任务的能力。
而DMA技术的引入解决了这个问题。DMA控制器是一种专用的硬件设备,它可以直接访问系统内存和外设,完成数据的传输。当需要进行数据传输时,CPU只需配置DMA控制器的参数,并将控制权交给DMA控制器,然后就可以继续执行其他任务,而不需要参与具体的数据传输过程。
DMA控制器通过使用内存地址总线和外设地址总线,直接将数据从外设读取到内存,或者将数据从内存发送到外设,实现高速的数据传输。这样可以大大提高数据传输的效率,减轻CPU的负担,允许CPU集中精力处理其他任务。
以下是STM32中DMA的主要特点和用法:
-
高速数据传输:DMA允许外设与内存之间的高速数据传输,而无需CPU的干预。这对于需要大量数据传输的外设(例如串行通信接口、SPI接口、I2C接口等)非常有用。
-
降低CPU负担:使用DMA功能可以将数据传输任务从CPU上分担下来,使CPU能够专注于其他任务。这有助于提高系统的响应能力和并行处理能力。
-
多通道支持:STM32的DMA控制器通常支持多个DMA通道,每个通道可以与一个外设进行连接。这意味着多个外设可以同时执行DMA传输,而不会相互干扰。
-
中断和循环模式:DMA传输完成后,可以生成中断请求来通知CPU。此外,DMA还支持循环模式,可以在传输完成后自动重新启动传输,从而实现连续的数据传输。
-
灵活的配置:STM32提供了灵活的DMA配置选项,可以根据特定应用的需求进行设置。可以选择传输方向(从外设到内存或从内存到外设)、数据宽度、传输模式等。
使用STM32的DMA功能,可以实现高效的数据传输和处理,尤其适用于需要处理大量数据的应用场景。它提供了一种快速、可靠且低功耗的数据传输方式,有助于优化嵌入式系统的性能。
1. DMA作用
DMA的传输方式无需CPU参与,可以直接控制传输。
DMA给外部设备和内存开辟了一条直接数据传输的通道。
目的:给CPU节省资源,使CPU的工作效率提高
DMA(Direct Memory Access)是一种功能强大的技术,它允许数据在外设和内存之间直接传输,而无需CPU的直接干预。DMA的作用是提高数据传输的效率和性能,减轻CPU的负担,同时允许CPU集中精力处理其他任务。
以下是STM32中DMA的一些主要作用:
-
数据传输:DMA可以在外设和内存之间进行高速数据传输。它可以在不占用CPU时间的情况下,自动地将数据从外设读取到内存,或者从内存发送到外设。
-
提高效率:通过使用DMA,数据传输可以在后台进行,而不会占用CPU的时间。这样,CPU可以专注于执行其他任务,而不必等待数据传输的完成。
-
减少中断:使用DMA可以减少中断的频率。在传统的方式中,每传输一个数据,都需要一个中断来通知CPU。而使用DMA,可以将多个数据一次性传输,从而减少中断的数量。
-
外设协议支持:许多外设,如UART、SPI、I2C等,都支持DMA传输。通过使用DMA,可以实现高速的数据传输,提高外设的性能。
-
数据处理:DMA还可以在内存之间执行数据处理操作,例如内存之间的拷贝、填充等。这样可以减少CPU的负担,提高数据处理的效率。
总的来说,DMA在STM32中的作用是通过提供直接的内存访问功能,加速数据传输,减轻CPU负担,提高系统性能和效率。它特别适用于需要高速数据传输和对CPU资源要求较高的应用场景。
2. DMA特性
DMA的特性包括直接访问内存、硬件控制、高效数据传输、中断支持、多通道支持、数据流控制和内存保护等。这些特性使得DMA成为一种有效的数据传输技术,可以在计算系统中提高性能和效率。
1)同一个DMA模块可以有多个优先级请求:很高 高 中等 低
2)每个通道有3个事件标志: DMA半传输 DMA传输完成 DMA传输出错
3)数据源 目标源 数据传输宽度对齐
4)传输数据 字节8位 半字16位 全字32位
5)存储器<->存储器 外设<->存储器 外设<->外设
6)闪存(flash) SRAM APB AHB 外设均可以作为源或者目标
7)搬移数据的最大长度为65535字节
3. DMA寄存器
DMA_CPARx :设置外设地址的寄存器
DMA_CMARx :设置存储器地址的寄存器
DMA_CCRx :设置数据传输方向
DMA_CNDTRx:设置传输的数据量
4. DMA的增量或者循环模式
1)增量 外设搬移到存储器的时候 ,不希望覆盖上一个会将内存设置为增量模式
2)循环 DMA不停循环的搬移数据,一组的数据传输完成时,计数寄存器将会自动地被恢复成配置该通道时设置的初值.
DMA的增量或循环模式是DMA传输过程中的一种配置选项,用于确定数据传输时内存地址的增加方式。具体来说,增量或循环模式决定了DMA传输过程中数据源和目的地地址的自动增加方式。
- 增量模式:在增量模式下,DMA传输过程中的数据源和目的地地址会自动递增。例如,如果数据源地址是0x1000,每次传输后增量模式会自动将数据源地址递增,使下一次传输从地址0x1001开始。同样,目的地地址也会按相同的方式自动递增。
增量模式的优点是可以方便地传输连续的数据块,减少了在每次传输时手动更新地址的工作量。这对于从连续内存区域读取或写入数据非常有用。
- 循环模式:在循环模式下,DMA传输过程中的数据源和目的地地址在达到事先设定的终点地址后会重新回到起始地址。这意味着传输可以在源和目的地之间循环进行。
循环模式的优点是可以重复传输一定长度的数据,而无需在每次传输后重新配置DMA寄存器。这对于需要周期性地传输数据或循环缓冲区的应用非常有用。
增量模式和循环模式可以单独或同时使用,具体取决于应用需求。在配置DMA通道时,开发人员可以根据数据的存储方式和传输需求选择适当的模式。使用这些模式可以简化DMA传输的配置和管理,提高数据传输的效率和灵活性。
5. 练习
通过DMA搬移ADC转换完成的数据
不了解ADC的家人们,点击这里跳转——》ADC(模数转换)详解
不了解ADC的家人们,点击这里跳转——》ADC(模数转换)详解
不了解ADC的家人们,点击这里跳转——》ADC(模数转换)详解
从外设 -> 内存(以STM32G030为例)
HAL_StatusTypeDef HAL_ADC_Start_DMA (ADC_HandleTypeDef * hadc, uint32_t * pData, uint32_t Length)
功能:启动ADC开始转换,并通过DMA搬移转换结果。
参数:ADC_HandleTypeDef * hadc 句柄
uint32_t * pData 数据存放地址
uint32_t Length 数据长度
在主函数中启动ADC并用DMA进行数据搬移,将数据搬移到buf中。
重写ADC转换完成回调函数,停止ADC并输出buf中的数据文章来源:https://www.toymoban.com/news/detail-757972.html
文章来源地址https://www.toymoban.com/news/detail-757972.html
到了这里,关于DMA详解及应用(嵌入式学习)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!