cancel
Showing results for 
Search instead for 
Did you mean: 

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ément

Anaghim
Associate II

0693W00000NpgK7QAJ.png

1 ACCEPTED SOLUTION

Accepted Solutions

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

JW

View solution in original post

17 REPLIES 17
Javier1
Principal

Buenos dias,

Que IDE estas utilizando para tu desarrollo?

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

0693W00000NpgMcQAJ.png

we dont need to firmware by ourselves, lets talk

j'ai utilise keil V5 mais on peut utilise IDE

Merci pour votre réponse.

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

we dont need to firmware by ourselves, lets talk
Nikita91
Lead II

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.

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

merci.

Nikita91
Lead II

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
Associate II

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
Associate II

0693W00000NphLBQAZ.png