I had gone through few texts on this topic (listed below), but was not able to figure out the speed limitation of STM32´s DMA.

What is needed: Take 8bit parallel burst input from external ADC (20 kB per burst). Frequency of input signal - 22,5 MHz. Buffer one burst send it to PC with slower speed via USB and wait for another burst. No data processing on MCU side. MCU will know about comming data by trigger on GPIO pin.

Delay between bursts is higher than 1 second.

What is limit of input signal frequency if I would like to use higher frequency?

STM32 family has many types and I feel completely lost in this. Is any of the STM32 capable of such a task? If yes is it available on any dev board? I´m not very familiar with HW designing so dev board seems like a better solution for me.

FPGA is maybe better for this but definitely harder to HW(PCB) design. Also FPGA devboards are more expensive.

AN4104 App Note - Using the STM32F0xx DMA controller

AN4031 App Note - Using the STM32F2,F4,F7 Series DMA controller

AN4666 App Note - Parallel synchronous transmission using GPIO and DMA

How to use STM32 DMA

embedded.fm DMA - Alittle help from my friends

Discovering the STM32 MCU

External ADC & DMA

Deska STFM32F746ZG

Using DMA in STM32 projects

  • \$\begingroup\$ I think you need some more detail before we can really help. Here are the questions in my mind: 1) What rate is data coming in to the processor? You have 20kB/burst, is that at 22,5MHz? 2) What interface are you using to xfer to the PC? 3) how much data does the board you want to make have to store? Do you want the ADC to run for.. say an hour before the transfer? \$\endgroup\$
    – pgvoorhees
    Commented Mar 25, 2017 at 18:58
  • \$\begingroup\$ Done. I edited original question. \$\endgroup\$
    – ToKra
    Commented Mar 26, 2017 at 8:05
  • 1
    \$\begingroup\$ What ADC are you looking at using (full part number). Honestly though, if you are talking about 20kB every second, I don't think you'll have any trouble at all. But knowing the ADC will help me tell you how it can (or can't) work \$\endgroup\$
    – pgvoorhees
    Commented Mar 26, 2017 at 13:05
  • \$\begingroup\$ Not sure about this yet. I will add info about ADC tomorrow evening/night (GMT + 1) \$\endgroup\$
    – ToKra
    Commented Mar 26, 2017 at 13:20
  • \$\begingroup\$ Sorry, I'm still not sure about the ADC. \$\endgroup\$
    – ToKra
    Commented Apr 2, 2017 at 14:07

2 Answers 2


Most efficient way is to transfer contents of IDR register of GPIOx with DMA to memory buffer at every trigger event. Here it is assumed that you have arranged the pins as an array of the same GPIOx with a known sequence and offset.

For the trigger event, just make a 50% duty cycle pwm mode timer as the clock source for the ADC and make it trigger for the DMA.

Make the trigger edge of DMA opposite of trigging edge of the DAC.

  • \$\begingroup\$ ADC parallel output can be connected directly to MCU without use of SPI. Burst frequency is low - one burst per tens of seconds. Definitely not higher then 1 Hz. Added this info to question. \$\endgroup\$
    – ToKra
    Commented Mar 26, 2017 at 12:40
  • 1
    \$\begingroup\$ What do you mean by saying 'directly', software polling? And it is not clear that if you think it is not possible to use SPI. @tokra \$\endgroup\$
    – Ayhan
    Commented Mar 26, 2017 at 12:57
  • \$\begingroup\$ Ah, very sorry :-) My mistake. Of course you can't use SPI for that. It is DMA and GPIO IDR registers and specifying a trigger for DMA requests. Later I will modify or delete my answer. \$\endgroup\$
    – Ayhan
    Commented Mar 26, 2017 at 13:10

I had searched through ST community forum and probably found the answer.

I'm using a STM32F429 operating at 168 MHz


Read AN4031. You won't find a definitive number, though, for the obvious reasons that this depends on several factors - trigger source synchronization, bus contention. You may also want to consider using FMC and/or DCMI, and/or some external glue logic.


Hi, thanks for the replies. The maxim speed I achieved was around ~30 MHz. According to Clive One's comment, I think that's the upper end .

Here is forum question link

Interesting blog post on similar topic:

enter link description here


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.