关于STM32的DMA的详细介绍见前文,另外可以参考这篇通俗易懂的文章。
1.概述
DMA传输是内核授权总线给DMA控制器,把数据传输的工作交给DMA控制器来进行管理的一种数据传输方式。关键的参数是需要指定数据源地址、目标地址、传输的数据个数。
2. 配置步骤
2.1 抽象的配置过程
DMA通道x的配置步骤如下:
1. 在DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将
是数据传输的源或目标。
2. 在DMA_CMARx寄存器中设置数据存储器的地址。发生外设数据传输请求时,传输的数
据将从这个地址读出或写入这个地址。
3. 在DMA_CNDTRx寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减。
4. 在DMA_CCRx寄存器的PL[1:0]位中设置通道的优先级。
5. 在DMA_CCRx寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外
设和存储器的数据宽度、传输一半产生中断或传输完成产生中断。
6. 设置DMA_CCRx寄存器的ENABLE位,启动该通道。
2.2 具体的配置过程
以串口DMA发送为例,串口1的发送在ADC1的通道4上。
- (1)使能DMA时钟
- DMA1和DMA2的时钟源均为AHB
- void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
- (2)复位DMA通道寄存器
- void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx);
- (3)初始化所用到的DMA通道参数
- void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);
这个函数主要配置前文《STM32-一文搞懂DMA》提到的DMA通道x配置寄存器(DMA_CCRx)(x = 1…7),其中参数结构体如下
typedef struct { uint32_t DMA_PeripheralBaseAddr; /*!< Specifies the peripheral base address for DMAy Channelx. */ uint32_t DMA_MemoryBaseAddr; /*!< Specifies the memory base address for DMAy Channelx. */ uint32_t DMA_DIR; /*!< Specifies if the peripheral is the source or destination. This parameter can be a value of @ref DMA_data_transfer_direction */ uint32_t DMA_BufferSize; /*!< Specifies the buffer size, in data unit, of the specified Channel. The data unit is equal to the configuration set in DMA_PeripheralDataSize or DMA_MemoryDataSize members depending in the transfer direction. */ uint32_t DMA_PeripheralInc; /*!< Specifies whether the Peripheral address register is incremented or not. Th