STM32的DMA连接外设到外设

一、前言

  笔者需要将高速采集的ADC数据存储到SD卡中,对速率有要求。这里希望可以采用速度最快的DMA传输方式。经过翻阅数据手册查询,stm32支持设备到设备的DMA传输方式。

  注:DMA的本质是地址到地址,至于两个地址的功能是什么,由该地址上的具体外设决定。所以支不支持DMA传输,不仅取决于DMA,还和外设相关。

二、STM32的DMA说明

2.1 DMA传输方向说明

  • SRAM<————>DEV(内存到设备,例如DA输出)
  • SRAM<————>SRAM(内存到内存,例如前后缓存区数据搬移)
  • DEV <————>SRAM(设备到内存,例如AD采集)
  • DEV <————>DEV(设备到设备,本帖主要讨论内容)

2.2 DMA内部寄存器配置说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DMA_DeInit(DMA_Channel2); //初始化DMA通道,根据用到的不同功能初始化对应通道。
<div align=center>![DMA通道--外设对应](DMA.jpg)</div>
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //设置外设1地址,比如ADC外设地址。
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&SPI1->DR;//这里设置外设2地址,SPI的储存地址。
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//设置传输方向,这里是单向传输。双向传输设置为DMA_DIR_PeripheralDST。
DMA_InitStructure.DMA_BufferSize = 2;//当传输了2个字节的数据后,判断是否设置了循环传输,如果是,则从地址头开始填写数据。如果否,则停止传输。
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//设置优先级。
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //内存到内存模式关闭。
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//循环传输。
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存递增模式打开,当只访问一个内存时可以关闭。(一般打开,只访问一个时,buffsize设置为1就好)。
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址递增模式关闭,外设地址就一个,不必递增。如果是内存到内存的话,需要递增。
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//每次读取外设的数据长度
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//每次读取内存的数据长度。
DMA_Init(DMA1_Channel2, &DMA_InitStructure);
DMA_Cmd(DMA_Channel2,ENABLE); //使能通道1,初始化完毕。

  DMA初始化结束,只能说明,连接外设和外设(内存)的桥已经搭建好了,外设自己还没有同意通过DMA呢,还需要在每个外设设置启用DMA传输方式,如下:

1
2
3
ADC_DMACmd(ADC1,Enable);  // 启用ADC1的DMA使能
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE); //SPI DMA 接收使能
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE); //SPI DMA 发送使能

  当然两个外设还需要配置,不予介绍。

2.3 对设备的要求

  • 只能是ADC到ADC这样的简单的设备

  • 很多在传输数据之前需要有很多寄存器操作的,不适合使用设备到设备的传输方式。

    注:比如ADC到SD卡就不行,因为SD卡存储之前需要有很多的操作。

3 总结

  经过一系列探索,查找资料,DMA的本质是传输数据,并不带有控制。所以虽然设备到设备传输理论上是可行的,但是由于实际上很多设备在传输之前都需要进行一些寄存器的配置,使得大部分情况下设备到设备的传输步骤如下:

  • 设备1->SRAM
  • 触发中断
  • SRAM->设备2

  在最初我是希望AD7764采集的数据直达SD卡,想法很好,现实骨感,失败告终。

-------------本文结束感谢您的阅读-------------
0%