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 ?