2016-08-14 4 views
1

Je rencontre un problème avec STM32F4 DMA. J'ai mis ma config DMA comme suit en mode circulaire:STM32F4 DMA semble déborder

hdma_usart1_rx.Instance = DMA2_Stream2; 
hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4; 
hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; 
hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE; 
hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE; 
hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; 
hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; 
hdma_usart1_rx.Init.Mode = DMA_CIRCULAR; 
hdma_usart1_rx.Init.Priority = DMA_PRIORITY_HIGH; 
hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; 
HAL_DMA_Init(&hdma_usart1_rx); 

__HAL_LINKDMA(huart,hdmarx,hdma_usart1_rx); 

Ceci est l'appel DMA UART:

HAL_UART_Receive_DMA(&huart1,uartRxMsgBuffer, 40); 

Chaque cycle de programme I POOL la valeur NDTR pour vérifier si elle a changé, si c'est le cas, je sais que certains octets ont été reçus et sont disponibles pour traitement. Pour une raison quelconque, lorsque j'ai développé mon code, j'ai remarqué que le tampon DMA Rx uartRxMsgBuffer était corrompu lorsque j'envoyais plus de 40 octets de données.

Je suis un peu perdu, je ne sais pas où aller à partir de maintenant parce que j'ai vérifié mon programme et je n'écris pas directement dans ce tampon et quelque peu il est écrasé. J'ai aussi remarqué que lorsque je retire la ligne suivante de mon code fonctionne le DMA:

uartm->msgProcessingBuffer[uartm->currentMsgProcessingBufferPointer][uartm->msgProcessingBufferCharPointer] = uartm->uartRxMsgBuffer[uartm->RxMsgPointerStart]; 

J'ai essayé de remplacer le code ci-dessus pour l'équivalent d'un soufflet et il ne fonctionne toujours pas:

strncpy(&uartm->msgProcessingBuffer[uartm->currentMsgProcessingBufferPointer][uartm->msgProcessingBufferCharPointer],&uartm->uartRxMsgBuffer[uartm->RxMsgPointerStart],1); 

Il y a 2 images du tampon DMA avant et après la corruption (voir le tableau pRxBuffPtr). J'envoie des flux de 123456789\r\n, quand j'envoie pour la 4ème fois le tampon est corrompu.

enter image description here

enter image description here

Répondre

2

Il n'y a rien de mal ici. Si le tampon est rempli, il n'aura plus d'octet de fin 0, le débogueur ne sait pas où il se termine, puisqu'il est déclaré unsigned char * dans la structure huart1, donc il montre le contenu d'une autre variable derrière le tampon .

Faites votre tampon un peu plus grand, et comprennent une valeur de garde à la fin pour voir par vous-même:

char *uartRxMsgBuffer[50]; 
strcpy(uartRxMsgBuffer + 40, "--guard--"); 
+0

Je suppose que je suis un peu stupide pour ce genre de choses de la programmation, je ne sais pas comment vous avez tiré cette conclusion, mais vous aviez raison, pour une raison quelconque, le débogueur ne sait pas ce qui se passe ... Merci pour votre aide, vous m'avez sauvé beaucoup de temps de débogage. –