Skip to main content
Dude
Associate III
July 3, 2023
Solved

Timer -> DMA -> SPI

Hi, 

 

    I am having trouble getting the Timer to trigger a DMA -> SPI operation. Namely, I want to set the timer up to run,. Then, get every overflow event to trigger the DMA to move a byte into the SPI. The SPI should auto-send. Then, the cycle repeats until the DMA has moved a N-bytes. 

I am feeling really blind, because I cannot figure out the problem. At first, I was trying to find the right setting to get the Timer to trigger a DMA request upon UEV generation. However, I could not find such a feature. So instead, I setup DMA1 Channel 3. TIM6 should map to this DMA. Then I setup TIM6 to generate a UEV upon Overflow (URS = 1, UDIS = 0). Finally, I setup TIM6 to generate a DMA request upon update (UDE = 1).

 

Still nothing. 

Can I get some input? 

 

Dude_0-1688422688371.png

Dude_1-1688422704488.png

Dude_2-1688422711868.png

 

--------------------------------------------------------------------------------------------------------------------------

What I am trying to do may not be possible in the way that I thought. 

Would the DMA rapid fire send N-bytes to the SPI upon the first successful DMA request? Is there a way to get it to send only 1 byte at a time, triggered by the timer? 

--------------------------------------------------------------------------------------------------------------------------

And auto-increment through memory? So..

  • Timer6 -> Overflow -> UEV -> DMA -> Byte 0 -> SPI
  • Timer6 -> Overflow -> UEV -> DMA -> Byte 1 -> SPI
  • Timer6 -> Overflow -> UEV -> DMA -> Byte 2 -> SPI
  • ...
  • Timer6 -> Overflow -> UEV -> DMA -> Byte N -> SPI

 

This topic has been closed for replies.
waclawek.jan
waclawek.janBest answer
Super User
July 4, 2023

> Will the DMA move 1 byte per request (TIM6 UEV) or 28 bytes?

One.

JW

12 replies

Dude
DudeAuthor
Associate III
July 3, 2023

Content shuffled up

Dude
DudeAuthor
Associate III
July 3, 2023

Content shuffled up

waclawek.jan
Super User
July 4, 2023

Which STM32?

How do you trigger DMA? Show the register which selects the trigger source.

JW

JW

ST Employee
July 4, 2023

Hello @Dude, thank you for your post, 

The problem could be related to the time trigger or the DMA config as well as the SPI peripheral! 

So, first, make sure -by looking at the datasheet- that the DMA  request is lined to the right SPI peripheral 

Regarding your question about the DMA; ofc it is possible -in the DMA config- by setting the DMA transfer size to 1 byte and enabling auto-increment for the DMA source address.

Regarding the timer trigger, I think one way to know if the UEV is triggered is the use an interrupt handler for the timer's UEV and use a GPIO pin or print a message... to see if the UEV is even triggered! -Maybe it's not the easiest way but  you need to localize exactly where comes the problem

Hope that helps! 

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
Dude
DudeAuthor
Associate III
July 4, 2023

Okay so the Timer is triggering an UEV event when I use interrupts. 

Dude
DudeAuthor
Associate III
July 4, 2023

Dude_0-1688484679026.png

 

 

So Channel 3 should be able to be triggered by TIM 6 and cause SPI1 TX to transmit...? 

waclawek.jan
waclawek.janBest answer
Super User
July 4, 2023

> Will the DMA move 1 byte per request (TIM6 UEV) or 28 bytes?

One.

JW