DMA笔记

PSIZE:外设数据宽度
MSIZE:存储器数据宽度

DMA工作流程

一个DMA控制器有8个数据流,其中的每个数据流有8个通道与其他外设连接。当一个外设请求占用某一数据流通道时,相同数据流的其他通道处于不可用状态。

8个数据流会进入仲裁器,仲裁器会先后根据软件上的数据流优先级配置、硬件上的数据流编号来选择要输出的数据流,相同软件优先级配置下,数据流编号越低越具有优先权。

DMA传输具有FIFO模式和直接模式,数据流会通过不同模式进入目标地址。在FIFO模式下,可通过配置FIFO的阈值为:1/4、1/2、3/4、满。如果数据存储量达到阈值级别时,FIFO内容将传输到目标中。该模式可用于处理源数据与目标地址数据宽度要求不同时的矛盾。

直接模式下,DMA接收到传输请求后立即传输过去。如果DMA配置为存储器到外设传输,那DMA会将一个数据存放在FIFO内,如外设启动DMA传输请求就可以马上将数据传输过去。

DMA通过AHB总线可以访问存储器、外设,同时DMA本身也是AHB从设备,通过编程接口对DMA做出配置。

DMA工作模式

DMA传输方向

  • 外设到存储器传输
  • 存储区到外设传输
  • 存储器到存储器传输(配置和外设到存储器传输一样)

DMA模式:

  • 单次模式
  • 循环模式

DMA传输类型:

  • 单次传输:必须通过AHB的总线仲裁多次控制才传输完成
  • 突发传输(Burst):要占用AHB总线,保证要求每个数据项在传输过程不被分割,一次性把数据全部传输完才释放AHB总线

突发传输与FIFO密切相关,突发传输需要结合FIFO使用,具体要求FIFO阈值一定要是内存突发传输数据量的整数倍。

DMA使用记录(HAL库)

  • DMA初始化要配置的Init结构体内容是和DMA传输的数据格式、如何处理数据等相关,因此只有初始化是不完整的;
  • 如果不使用HAL里将DMA与其他外设结合的函数(比如HAL_ADC_Start_DMA),而是单独的DMA,则需要 HAL_DMA_Start 等开启函数配置源地址、目标地址;
  • 如果是使用将DMA与其他外设结合的函数,则要通过 __HAL_LINKDMA 将其他外设的句柄和DMA句柄绑定以实现函数中的互通使用(实测ADC中的 HAL_DMA_Start 也有同样效果),再调用与DMA结合的开启函数。

posted on 2025-01-26 09:34  fhbui  阅读(70)  评论(0)    收藏  举报