3 votes

STM32 DMA du comptage du timer vers la mémoire

J'utilise un STM32H743. J'ai un signal d'horloge externe qui arrive sur une broche GPIO, et je veux mesurer très précisément le temps écoulé entre chaque front montant (ou descendant) du signal d'horloge externe. J'ai donc configuré les choses de manière à ce que TIM4 soit déclenché par l'horloge externe, et TIM5 par l'oscillateur interne.

J'ai écrit une IRQ de sorte que chaque fois que TIM4 se déclenche, une interruption s'exécute et capture la valeur de TIM5. Cela semble fonctionner correctement, mais je me demande si je ne pourrais pas le faire par DMA pour éviter toute la commutation de contexte et libérer le CPU. En gros, je veux mettre en place un DMA pour que chaque événement TIM4 initie un transfert DMA qui copie la valeur du compteur TIM5 dans un buffer circulaire quelque part.

J'ai cherché dans les forums et dans la documentation DMA mais je ne sais pas si un registre timer peut être une source DMA valide. Je me suis dit que je pourrais peut-être faire quelque chose comme ça :

hDma->PAR = (uint32_t) &htim5.Instance->CNT;
hDma->M0AR = (uint32_t) myBufferPtr;
hDma->NDTR = myBufferSize;
hDma->CR |= (uint32_t)DMA_SxCR_EN;

Mais je ne suis pas sûr que cela puisse fonctionner.

Version courte : Puis-je utiliser le registre CNT du timer comme source de transfert DMA ? S'agirait-il d'un transfert périphérique-mémoire ? Ou d'un transfert de mémoire à mémoire ? Y a-t-il d'autres drapeaux dont j'ai besoin pour que cela fonctionne ? Ou n'est-ce pas possible ? Ou existe-t-il une autre fonction du STM32 qui faciliterait le comptage du temps entre les impulsions ?

4voto

HelpingHand Points 1123

Clause de non-responsabilité

Je dois avouer que ma longue expérience pratique avec STM32 s'est limitée aux familles de contrôleurs classiques comme STM32F0, STM32F3, STM32F4 et STM32L4. C'est pourquoi je répondrai en me basant sur ce que ces contrôleurs vous offriraient dans votre situation. La série STM32H7 est beaucoup plus puissante, sans compter qu'elle offre plusieurs technologies DMA supplémentaires comme DMA2D, MDMA et beaucoup d'autres choses dont je ne suis pas sûr. Mais je pense qu'une réponse simplifiée pourrait également vous aider pour le moment, alors j'ose l'écrire.


Puis-je utiliser le registre CNT de la minuterie comme source de transfert DMA ? S'agirait-il d'un transfert périphérique-mémoire ? Ou d'un transfert de mémoire à mémoire ? Y a-t-il d'autres drapeaux dont j'ai besoin pour que cela fonctionne ? Ou est-ce impossible ?

Je m'attendais à ce que cela fonctionne. Je ne vois pas de raison de ne pas lire le registre TIMx_CNT lors d'un transfert DMA.

Le registre CNT est définitivement un adresse périphérique Il faut donc le configurer comme un transfert périphérique-mémoire. Je pense que la séparation périphérique/mémoire fait référence au bus à partir duquel le contrôleur DMA récupère les données (ou au bus auquel il les transmet) dans la matrice de bus implémentée dans chaque STM32.

Ou existe-t-il une autre fonction du STM32 qui faciliterait le comptage du temps entre les impulsions ?

Oui, il y en a une : De nombreux périphériques TIM (tous ne sont pas identiques) offrent une fonction appelée "Input Capture" qui connecte l'ordinateur à l'ordinateur. canal (sous-)périphérique de l'instance TIM à l'entrée et possède la principal du (même !) périphérique TIM effectue l'horloge interne. Une condition préalable est que la broche que vous souhaitez mesurer ait une fonction alternative TIMx_CHy, et pas "seulement" une fonction TIMx_ETR.

Les périphériques TIM offrent un large éventail d'options de configuration différentes - et un désordre compliqué tant que l'on ne s'y est pas habitué. Pour une introduction et une bonne vue d'ensemble, je recommande deux notes d'application de ST :

En recherchant ces deux éléments, j'en ai trouvé un troisième que vous pourriez vouloir vérifier pour une meilleure précision, lié aux minuteries HRTIM :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X