2016-08-14 318 views
1

我在使用STM32F4 DMA时遇到问题。 我已经建立了我的DMA配置如下的循环模式:STM32F4 DMA似乎正在溢出

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); 

这是UART DMA电话:

HAL_UART_Receive_DMA(&huart1,uartRxMsgBuffer, 40); 

每个程序循环我集中检查NDTR值,如果它发生了变化,如果是这样,那么我知道有一些字节被接收并可用于处理。 由于某些原因,当我开发我的代码时,我发现DMA Rx缓冲区uartRxMsgBuffer在向其发送超过40个字节的数据时被破坏。

我得到了一种迷失不知道从这一点去哪里,因为我检查了我的程序,我不直接写入这个缓冲区,有些它被覆盖。我还注意到,当我从我的代码删除以下行的DMA工作:

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

我试图取代上面的代码,相当于一个波纹管,它仍然没有工作:

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

有损坏之前和之后的2个DMA缓冲区图片(请参阅pRxBuffPtr阵列)。我发送123456789\r\n流,当我发送第四次缓冲区被损坏。

enter image description here

enter image description here

回答

2

没有什么错在这里。如果缓冲区已满,它将不再有终止的0字节,调试器不知道它在哪里结束,因为它在huart1结构中声明为unsigned char *,所以它显示了缓冲区后面的其他一些变量的内容。

让你的缓冲有点大,包括在最后一个警戒值,看看它自己:

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

我猜我有点为这个节目的东西哑巴,我不知道如何你得出了这个结论,但你是对的,由于某种原因,调试器不知道发生了什么.........谢谢你的帮助,你为我节省了很多调试时间。 –