STM32F429第二十七篇之DMA

前言

DMA(Direct memory access)用于内存与内存之间或者内存与外设之间的高度数据传输。而且使用DMA进行数据传输不占用CPU任何资源,从而解放CPU去做别的操作。F429中共有两个DMA控制器,每个控制器用户8个数据流。

基本流程

DMA的事务处理就是一系列一定数量的数据传送。传送的数据宽度可以通过编程改变。每个DMA传送都包含以下几个步骤:

  1. 从外设寄存器或者内存中加载数据,该外设或者内存的地址存储在寄存器DMA_SxPAR 或者 DMA_SxM0AR 中。
  2. 将数据存储在外设寄存器或者内存中,同样的,地址存放在寄存器DMA_SxPAR 或者 DMA_SxM0AR 中。
  3. 寄存器DMA_SxNDTR自动递减,该寄存器中数据表示剩余未传输的数据量。

当事件发生时,外设将会向DMA发送请求信号。DMA的响应速度取决于当前外设的优先级大小。一旦DMA响应了该设备,就会向该设备回送一个响应信号。外设获得DMA的响应信号就会释放请求。若外设还要继续请求,则启动下一个事物。

通道选择

每个数据流都包含8个备选的通道,可以通过寄存器 DMA_SxCR的位CHSEL[2:0] 选择。下标表示所有可选情况:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

优先级

数据流与数据流之间的传输优先级通过软件和硬件两个方面决定:

  • 软件:可以通过DMA_SxCR寄存器配置数据流的优先级,总共有四个等级:非常高、高、中、低。
  • 硬件:若两个请求的软件优先级相同时,序号较小的数据流优先级更高。

传输模式

在DMA中,源地址和目的地址可以包含整个4G空间(0x0000 0000 - 0xFFFF FFFF).传输模式通过寄存器DMA_SxCR中位 DIR[1:0]设置,包含以下三种:

  • 内存到外设
  • 外设到内存
  • 内存到内存

在这里插入图片描述

外设到内存

在这里插入图片描述
如上图所示,当DMA使能时,将 DMA_SxCR 寄存器中的位 EN 置 1。则每当有外设源发送请求时,则数据流就会启动传输。

当多个数据流同时发送传输请求时,仲裁器会根据数据流的优先级确定先响应的数据流。而优先级通过DMA_SxCR寄存器中的PL[1:0]位确定。

在直接模式(当 DMA_SxFCR 寄存器中的 DMDIS 值为“0”时)下,不使用FIFO,每一次外设数据到达FIFO时,直接将相应的数据移送到目标内存中。而在FIFO模式中,数据缓存在FIFO中,直到FIFO达到阈值等级,数据会被一次发送到内存中。

DMA在以下几种情况发生的时候会停止传输:

  1. DMA_SxNDTR寄存器的值为0
  2. DMA_SxCR寄存器使能位EN被清零。
  3. 若外设支持流控制,请求中止传输。

内存到外设

在这里插入图片描述
内存到外设和上文基本类似,不再详细介绍。

内存到内存

在这里插入图片描述
内存到内存和上文介绍也基本一致,其不同之处在于不存在外设,所以同样的不会存在外设的各种请求。另外还有几点需要注意:

  1. 直接模式不允许使用
  2. 循环模式不允许使用
  3. 只有DMA2可以使用内存到内存模式。

双缓冲区模式

双缓冲区模式通过寄存器DMA_SxCR中的DBM位来使能。该模式适用于DMA1和DMA2。

若DMA被设置成双缓冲区,那么,其自动设置为循环模式。双缓冲区比正常模式多了一个内存指针,当到达传输最后,两个内存指针会发生交换。换言之,DMA控制器在每次事件最后,从一个目标内存指针跳到另一个。这样,就可以当DMA使用其中一块内存的时候,通过软件操作另一块内存。在双缓冲模式中,缓冲内存即可以是源端也可以是目标端。

在这里插入图片描述

  • 当 DMA_SxCR 寄存器中的 CT 位为“0”时,可以写入 DMA_SxM1AR 寄存器。当 CT =“1”时,试图写入此寄存器会将错误标志位 (TEIF) 置 1,并自动禁止数据流。
  • 当 DMA_SxCR 寄存器中的 CT 位为“1”时,可以写入 DMA_SxM0AR 寄存器。当 CT =“0”时,试图写入此寄存器会将错误标志位 (TEIF) 置 1,并自动禁止数据流。

直接模式

默认的情况下,FIFO模式时被禁止,使用的是直接模式,通过寄存器DMA_SxFCR的DMDIS位配置。当对数据传输的实时性要求较高时,可以使用直接模式。

当DMA为直接模式,且数据方向为内存到外设时,DMA会从内存中预加载一个数据到FIFO中,从而保证当外设请求时,会立刻响应。

该模式适用以下情况:

  • 源和目的数据宽度是相同的,且通过寄存器DMA_SxCR的PSIZE[1:0] 位设置。(位MSIZE[1:0]被忽略)。
  • 突发模式不可用。
  • 不用于内存到内存方式。

循环模式

循环模式可用于处理循环缓冲区和连续数据流(例如 ADC 扫描模式)。可以使用 DMA_SxCR 寄存器中的 CIRC 位使能此特性。

当激活循环模式时,要传输的数据项的数目在数据流配置阶段自动用设置的初始值进行加载,并继续响应 DMA 请求。

如果是在非循环模式下配置数据流,传输结束后(即要传输的数据数目达到零),除非软件重新对数据流编程并重新使能数据流(通过将 DMA_SxCR 寄存器中的 EN 位置 1),否则 DMA 即会停止传输(通过硬件将 DMA_SxCR 寄存器中的 EN 位清零)并且不再响应任何 DMA 请求。

DMA中断

对于每个 DMA 数据流,可在发生以下事件时产生中断:

  • 达到半传输
  • 传输完成
  • 传输错误
  • FIFO 错误(上溢、下溢或 FIFO 级别错误)
  • 直接模式错误

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32F429 HAL ADC DMA是指在STM32F429系列微控制器上使用HAL库进行ADC数据采集,并使用DMA传输数据的功能。 STM32F429微控制器是STMicroelectronics公司推出的一款高性能ARM Cortex-M4内核的单片机。HAL库是STMicroelectronics公司提供的用于快速开发STM32微控制器的硬件抽象层。ADC(Analog to Digital Converter)是模数转换器,用于将模拟信号转换为数字信号。DMA(Direct Memory Access)是直接内存访问技术,能够在微控制器和外设之间高速传输数据。 使用STM32F429 HAL ADC DMA功能,首先需要初始化ADC和DMA相关的寄存器和参数。然后,配置ADC通道、采样时间和转换模式等。可以使用HAL库提供的函数来完成这些配置。接下来,需要配置DMA传输通道,并设置传输方向和传输缓冲区的地址等参数。然后,使能ADC和DMA,并启动转换过程。转换完成后,会自动触发DMA传输,并将采样到的数据存储到指定的内存地址中。 通过使用STM32F429 HAL ADC DMA功能,可以实现高效的ADC数据采集。由于使用了DMA技术,数据的传输速度比较快,可以更加灵活地处理和存储采集到的数据。同时,HAL库提供了丰富的函数和接口,方便开发者进行配置和操作。使用这些功能,可以简化开发流程,提高开发效率。 总之,STM32F429 HAL ADC DMA功能是一种在STM32F429微控制器上进行ADC数据采集和DMA数据传输的功能,它结合了硬件抽象层库和直接内存访问技术,可以方便地实现高效的数据采集和传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值