cancel
Showing results for 
Search instead for 
Did you mean: 

Timer -> DMA -> SPI

Dude
Associate III

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

 

2 ACCEPTED SOLUTIONS

Accepted Solutions
Sarra.S
ST Employee

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.

View solution in original post

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

One.

JW

View solution in original post

12 REPLIES 12
Dude
Associate III

Content shuffled up

Dude
Associate III

Content shuffled up

Which STM32?

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

JW

JW

Sarra.S
ST Employee

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.

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

Dude
Associate III

Dude_0-1688484679026.png

 

 

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

Content shuffled down

Dude
Associate III

Content Shuffled down

@Sarra.S 

 

   Are you sure that the transfers can do as I want? Thanks to you and Waclawek.jan, I am able to get the DMA to trigger, as caused by TIM6 UEV occurrence.

 

Will the DMA in circular buffer mode with N-bytes (CNDTR3 = N-bytes arbitrary number) move one byte per DMA request or N-bytes per DMA request? 

 

thanks