Skip to main content
Anaghim
Associate II
May 10, 2022
Solved

Bonjour, je veux créer une fonction pour calcule les nombres d'impulsion de signal avec une périodisation de 40 ms j'ai configure le timer en mode ETR et reset le Counter puis en lance le Counter mais on ne peut pas de vérifie si le Counter est incré

  • May 10, 2022
  • 7 replies
  • 6105 views

0693W00000NpgK7QAJ.png

This topic has been closed for replies.
Best answer by waclawek.jan

This is an English language forum. Please don't exclude others from your conversation.

JW

7 replies

Javier1
Principal
May 10, 2022

Buenos dias,

Que IDE estas utilizando para tu desarrollo?

has probado a usar el modo "live expression" en tu sesion de debug?

0693W00000NpgMcQAJ.png

hit me up in https://www.linkedin.com/in/javiermuñoz/
Anaghim
AnaghimAuthor
Associate II
May 10, 2022

j'ai utilise keil V5 mais on peut utilise IDE

Merci pour votre réponse.

Javier1
Principal
May 10, 2022

keilV5 tiene una funcionalidad parecida.

Tambien te puede ser muy util STMStudio

https://www.st.com/en/development-tools/stm-studio-stm32.html

o su primo mas joven

STM32CubeMonitor

https://www.st.com/en/development-tools/stm32cubemonitor.html

hit me up in https://www.linkedin.com/in/javiermuñoz/
Nikita91
Lead II
May 10, 2022

La 4ème ligne de votre code ne fait rien:

TIM1->CR1 = TIM1->CR1 | (0 << 0) ;

Pour arrêter le compteur il faut

  TIM1->CR1 = TIM1->CR1 & ~(1 << 0) ;

Ou mieux (c'est plus clair):

 TIM1->CR1 &= ~TIM_CR1_CEN ;

Grâce au fichier CMSIS chaque bit des registres du MCU a un nom.

Pour lire la valeur du compteur:

N = TIM1->CNT ; // Pas besoin de la HAL...

Pour voir la valeur de N il faut mettre un point d'arêt après la lecture de CNT.

Anaghim
AnaghimAuthor
Associate II
May 10, 2022

0693W00000NpgjMQAR.pngMerci pour votre réponse.

Maintenait si on remplace le vtaskdelay par un interruption pour temporisation est ce que mon code est vrai :

0693W00000NpgjCQAR.png

Tesla DeLorean
Guru
May 10, 2022

I would avoid the TIM1->SR RMW forms, the register is designed to automatically mask the writes such that there aren't race conditions, where you clear flags indiscriminately.

TIM1->SR &= 0xFE; // BAD FORM

TIM1->SR = 0xFE; // HOW HARDWARE WAS DESIGNED

Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
Nikita91
Lead II
May 10, 2022

Pour démarrer le compteur:

TIM1->CR1 |= TIM_CR1_CEN ;

La notation (1 <<0) ressemble à ce qui se faisait en AVR, mais avec les STM32 chaque bit a un nom.

Je ne comprend pas ce que vous cherchez à faire.

Votre code ci dessus va compter de 0 jusqu'au débordement du compteur (dépend de TIM1->ARR) qui déclenchera l'interruption. Donc toujours compter le même nombre.

Et pourquoi utilisez vous le timer en mode ETR?

D'autre par il ne faut pas utiliser printf() dans un handler d'interruptions.

Vous utilisez TIM1 mais vous utilisez le handler d'interruption de TIM2!!!!!

Et hrtim2 dans les appels de fonction de la HAL: beau mélange.

Il n'est pas bon de mélanger une utilisation directe par registre et l'utilisation de la HAL. Par exemple dans la boucle for vous démarrez le timer, et vous le faites de nouveau avec HAL_TIM_Base_Start_It().

D'autre part cette boucle for tourne en continu: comme HAL_TIM_Base_Start_It() revient immédiatement après avoir démarré le timer, vous êtes en permanence en train de mettre le compteur à 0 et à démarrer le timer. Il n'y aura donc jamais d'interruption.

Je pense que vous devez lire plus attentivement le manuel de référence.

Si vous voulez utiliser la HAL pour le timer, lisez les exemples fournis pour les timers.

Définissez exactement ce que vous voulez obtenir avant d'écrire du code.

 Cette note d'application sur les timers pourrait vous être utile:

General-purpose timer cookbook (st.com)

Anaghim
AnaghimAuthor
Associate II
May 10, 2022

j'ai utiliser le timer en mode ETR pour calcule les nombre d'impulsion de signal , le lecture de nombre d'impulsion est chaque 40 ms pour cela j'ai fait une routine d'interruption avec une autre timer pour gêner le temps de lecture N

Anaghim
AnaghimAuthor
Associate II
May 10, 2022

0693W00000NphLBQAZ.png

waclawek.jan
waclawek.janBest answer
Super User
May 10, 2022

This is an English language forum. Please don't exclude others from your conversation.

JW

Anaghim
AnaghimAuthor
Associate II
May 10, 2022

what ?

waclawek.jan
Super User
May 10, 2022

In TIM2 interrupt, you don't need to anything else, just read out TIM1->CNT and subtract it from previously read out value to find out the difference, and store the new value. Don't stop TIM1, don't clear TIM1->CNT. TIM1 is 16-bit counter, so you have to take this into account when TIM1->CNT overflows.

But first make sure TIM1 works - simply set it up as you intended, enable, and then without doing anything with it just observe in register view of debugger, if TIM1->CNT counts accordingly to the input signal.

JW

Nikita91
Lead II
May 11, 2022

I think it's a student's school homework, and he's trying to realize what's in the statement. Obviously it seems more efficient to achieve something other than what is requested...