Getting started with DMA

Revision as of 14:15, 21 December 2022 by Registered User (→‎Memory to Memory Mode)
Under construction.png Coming soon

This article explains what is DMA and how to use it through examples

1. What is DMA?

DMA stands for Direct Memory Access controller. It is a bus master and system peripheral. The DMA is is used in order to provide high-speed data transfer between peripherals and memory as well as memory to memory. Data can be quickly moved by DMA without any CPU actions. This keeps CPU resources free for other operations.
During this article, we will be using the STM32L476 Nucleo board.
This device embeds 2 DMAs: DMA1 and DMA2. Each channel is dedicated to managing memory access requests from one or more peripherals.
The two DMA controllers have 14 channels in total, each dedicated to managing memory access requests from one or more peripherals. Each has an arbiter for handling the priority between DMA requests.

DMA features DMA1 DMA2
Number of regular channels 7 7

1.1. Objective

  • Learn how to setup DMA transfer in STM32CubeIDE
  • Create simple DMA memory to memory transfer from RAM to RAM, Peripheral to RAM and transfer with Interrupt

1.2. How to

  • Use CubeIDE and Generate Code with DMA
  • Learn how to setup the DMA in HAL
  • Verify the correct functionality by comparing transferred buffers

2. Create the project in STM32CubeIde

'File > New > STM32 Project in main panel.
create STM32CubeIDE project.png

This example uses the NUCLEO-L476RG board.
Start by selecting the NUCLEO-L476RG board using the Board Selector as shown in the figure below:
Select NUCLEO-L476RG board.png
In case you haven't downloaded the STM32L476 Cube library, it will be downloaded automatically. This however may take some time.
Save the project.
Setup menu GPIO.png

  • For DMA we don’t need to configure any pins

stm32l476RG.png

3. Peripheral to Peripheral Mode

Any DMA channel can operate in peripheral-to-peripheral mode:

  • when the hardware request from a peripheral is selected to trigger the DMA channel, this peripheral is the DMA initiator and paces the data transfer from/to this peripheral to/from a register belonging to another memory-mapped peripheral (this one being not configured in DMA mode).
  • when no peripheral request is selected and connected to the DMA channel, the software configures a register-to-register transfer by setting the MEM2MEM bit of the DMA_CCRx register.

4. Memory to Memory Mode

The DMA channels may operate without being triggered by a request from a peripheral. This mode is called memory-to-memory mode, and is initiated by software.
Memory to Memory mode allows transfer from one address location to another without a hardware request.
Once the channel is configured and enabled, the transfer starts immediately.

Info white.png Information
The memory-to-memory mode must not be used in circular mode.

File:Memory to memory.png

4.1. DMA M2M Configuration

In order to run on maximum frequency, setup clock system

File:clock tree.png

5. Circular Mode

The circular mode is in memory-to-peripheral or peripheral-to-memory transfers.

6. Data Transfer over DMA with Interrupt


[[category:Getting_started_with_STM32_system_peripherals | 30]]