STM32F4 HAL DMA UART TX
Je vais essayer d'obtenir de l'UART transmettre de travail sur le DMA sur un stm32f405. Cette partie de mon application est conçue pour envoyer des chaînes de texte comme une interface de ligne de commande. J'ai le RX partie de l'UART de travail avec DMA fines (à l'aide de 1 octet circulaire DMA pour gérer tout ce qui vient), mais le TX côté, elle s'avère un peu plus compliqué.
Je suis capable d'envoyer des chaînes de données à l'aide de: HAL_UART_Transmit_DMA(&handle, pData[], strlen(pData))
à condition qu'il existe un délai entre deux appels de la fonction. Dès que mon programme décide d'envoyer deux chaînes, l'une après l'autre, le nouveau pointeur de données est ignorée.
En utilisant while(HAL_UART_Transmit_DMA(...) != HAL_OK){}
je suis en mesure d'avoir le programme attendre le temps nécessaire et envoyer des chaînes consécutives.
Cela fonctionne pendant un certain temps (quelques dizaines de transferts), puis se coince en raison de HAL_NOT_OK.
Pour référence, mon paramètres DMA sont: DMA2 stream 7
, channel 4
, mem to periph
, periph inc disabled
, mem inc enabled
, mem and periph align byte
, normal mode (not circular)
, low priority
, fifo disabled
.
UART ensemble de 9600 baud
, 8 bit word
, 1 stop bit
, no parity
, no hw control
, 16 oversampling
.
Je suis en train de voir si l'aide FIFO va m'aider ici, si je ne suis pas totalement sûr si je comprends bien, il encore. Si je voulais envoyer un octet de données, j'ai pu le faire avec FIFO? est-il 1 mot min limite ici?
J'ai mis en place un tx complete callback
que je ne suis pas en train d'utiliser. Je ne me demande si il y a des drapeaux j'avais besoin de vider lors de cette interruption, mais pas sûr..
Toute aide appréciée!
OriginalL'auteur HammerFet | 2015-02-12
Vous devez vous connecter pour publier un commentaire.
Vous DEVEZ attendre que le
tx complete
de rappel avant d'utiliserHAL_UART_Transmit_DMA
de nouveau. Quelque chose comme:OriginalL'auteur ECO
HammerFet, je crois que vous aurez besoin d'utiliser le mode circulaire (par exemple,
DMA_Mode_Circular
). Donner que d'essayer.Veuillez lire également la très courte section 1.1.8 dans le STM32F4 Note d'Application, qui stipule ce qui suit:
Un exemple de DMA config configuration comme suit peut être vu ci-dessous:
OriginalL'auteur bunkerdive
FIFO pour la transmission est utile si vous êtes à la transmission à un débit élevé (>1MBaud). Ce qui se passe est que le processeur ne peut pas nourrir l'UART assez vite et puis un type dépassement de tampon liées erreur peut se produire. Vous pouvez également modifier la priorité de la DMA canal d'alimentation de l'UART.
Mode circulaire n'est pas très utile pour l'émission, car il va à l'infini retransmettre les données dans la mémoire tampon, sauf si vous avez mis à jour dans le temps. Bien que je trouve circulaire tampons très utile pour recevoir les données.
J'ai aussi eu des questions où si le nombre d'octets transmis est de petite taille (<10Bytes) que le DMA transmission échoue après un certain temps. À l'aide de la fonction informatique a fonctionné sans problème. Je n'ai jamais été en mesure de trouver la raison. Ainsi, pour la transmission de messages de < 10 octets, j'utilise le transmettre de la fonction et des messages >= 10 octets, j'utilise le DMA transmettre fonction.
OriginalL'auteur Flip