STM32F4 DMA似乎溢出

时间:2016-08-14 23:13:36

标签: stm32 uart dma

我在使用STM32F4 DMA时出现问题。 我在循环模式下按如下方式设置了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值以检查它是否已更改,如果是,我知道已收到一些字节并可用于处理。 出于某种原因,当我开发代码时,我注意到当我向其发送超过40个字节的数据时,DMA Rx缓冲区uartRxMsgBuffer被破坏。

我有点失落,不知道从哪里开始,因为我检查了我的程序,而且我没有直接写入这个缓冲区,有些被覆盖了。我还注意到,当我从代码中删除以下行时,DMA工作:

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

我尝试将上面的代码替换为等效的代码,但它仍无效:

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

在损坏之前和之后有两个DMA缓冲区的图片(请参阅pRxBuffPtr数组)。我发送了123456789\r\n的流,当我第四次发送时,缓冲区被破坏了。

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:3)

这里没有错。如果缓冲区已满,则它不再具有终止0字节,调试器无法知道它的结束位置,因为它已在unsigned char *中声明为huart1 char *uartRxMsgBuffer[50]; strcpy(uartRxMsgBuffer + 40, "--guard--"); 结构,所以它显示缓冲区后面的其他变量的内容。

让你的缓冲区更大,并在最后包含一个保护值,以便自己查看:

source: CRAN