我在使用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
的流,当我第四次发送时,缓冲区被破坏了。
答案 0 :(得分:3)
这里没有错。如果缓冲区已满,则它不再具有终止0
字节,调试器无法知道它的结束位置,因为它已在unsigned char *
中声明为huart1
char *uartRxMsgBuffer[50];
strcpy(uartRxMsgBuffer + 40, "--guard--");
结构,所以它显示缓冲区后面的其他变量的内容。
让你的缓冲区更大,并在最后包含一个保护值,以便自己查看:
source: CRAN