Skip to main content
PDieh.1
Associate II
April 13, 2023
Question

Capture egdedirection on input capture with dma

  • April 13, 2023
  • 8 replies
  • 2799 views

Hello,

i am using the STM32F410CBUx and want to detect rising and falling edges with the Timer 5.

I get these values with the help of the DMA because the signal edges are close together and i need accurate meassurments. The edges occure all in a short time frame and after that i have some time to compute them.

Sadly, all other channels are already in use doing the same with other signals so i cant use two for the same signal.

Is it possible to get the polarity of the edge together with the timervalue through DMA?

Thanks for your help.

This topic has been closed for replies.

8 replies

waclawek.jan
Super User
April 13, 2023

> Is it possible to get the polarity of the edge

Unfortunately, no.

JW

PS. Added it as an idea for future STM32, please upvote

PDieh.1
PDieh.1Author
Associate II
April 14, 2023

Thank you for the answer.

Then i have to do it with only one edge.

Joe WILLIAMS
ST Employee
April 14, 2023

Hi PDieh.1

Your question has been routed to the online support team. A case has been created and you'll be contacted shortly

Kind Regards

Joe WILLIAMS

STMicro Support

waclawek.jan
Super User
April 14, 2023

Hi @Joe WILLIAMS​ ,

Isn't the point of a public forum to discuss technical issues for the benefit of all users participating?

So, would you be so kind and share any advice you have to OP, with us all?

Thanks,

JW

@Lina DABASINSKAITE​ 

PDieh.1
PDieh.1Author
Associate II
April 25, 2023

Hello,

to follow @Community member​ request, here the answer I got from an ST Employee:

I confirm that the timer doesn't have the edge polarity information in its registers. It is then not possible to transfer this information together with the counter value through the DMA transfer.

However, as the edge polarity is the opposite for each consecutive counter value transfererd by the DMA, the information needed is only the polarity of the signal when the counter is started.

If the edge polarity is unknown when the timer is started, the first edge of the signal could trigger an interrupt to allow the CPU to read this information.

This can be done by connecting the timer entry pin to another GPIO pin with external interrupt input feature (GPIO EXTI). The priority must be very high (let's say 0) to have a chance to get the timer input level before the next edge.

The code of the interrupt handler is then something like:

TIM5_InputState = GPIOA->IDR & GPIO_PIN_0; // Read the TIM5_CH1 GPIO input data register.

// The GPIO EXTI input data register can be used instead.

__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_x);

Best Regards

PDieh.1
PDieh.1Author
Associate II
April 25, 2023

But I have a followup question, maybe @Community member​ can help.

I start the DMA with the HAL_TIM_IC_Start_DMA function and i write the data in an Array with the size of 20. In my testcase, i get only one edge (later i don't know how much there are, this can and will vary), but the DMA filles the size of the array completly with the same value from the edge. If i have two edges, it filles the array with both values in alternating order.

Is there a way to only geht the values only once and leave the other values in the array at 0?

Thanks for your help and best regards,

Philipp Diehl

waclawek.jan
Super User
April 25, 2023

Thanks for sharing the reply.

> However, as the edge polarity is the opposite for each consecutive counter value transfererd by the DMA,

> the information needed is only the polarity of the signal when the counter is started.

This does works only if there is no overflow, i.e. if all edges are enough far apart that DMA can transfer all the capture values without missing any. It's highly nontrivial to determine what is the limit in a given system. I'm not sure if overcapture detects this case, it might.

> If the edge polarity is unknown when the timer is started, the first edge of the signal

> could trigger an interrupt to allow the CPU to read this information.

Surely, the input level of given pin can be read at the moment when timer is started (assuming there are no edges around this time), and that then determines the subsequent edge.

Perhaps a better solution might be to capture rising and falling edges separately on two channels of the same timer, using the possibility to "redirect" signal to "neighbouring" channel. DMAing them may be not that simple, I'd try to use the DMAR/DCR mechanism triggered from one of the channels but I'm not entirely sure it would work as expected.

> DMA filles the size of the array completly

This is strange. I don't use Cube. Read out and check/post content of DMA and TIM registers.

JW

PDieh.1
PDieh.1Author
Associate II
April 26, 2023

Hello,

i found my problem.

The HAL_TIM_IC_Start_DMA Function needs the number of values it should transfer and since i didn`t know that, i used a higher number. But this means, that it was not automatically finished after i recieved my Edges.

Combined with the time it takes to stop the program with the debugger, it filled the array with the values of the next frame.

My solution was to trigger an interupt bevor my measuring window to start the DMA and one interupt after the frame to stop it with HAL_TIM_IC_Stop_DMA.

Then i only get the values and 0 in all other positions in the array.

Thanks for your help!

Best regards,

Philipp Diehl