STM32F4 DMA似乎已溢出

STM32F4 DMA似乎已溢出,stm32,uart,dma,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.In

我在使用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值以检查它是否已更改,如果已更改,则我知道已收到一些字节并可供处理。 由于某种原因,在开发代码时,我注意到当我向DMA Rx缓冲区发送超过40字节的数据时,它被损坏了

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

uartm->msgProcessingBuffer[uartm->currentMsgProcessingBufferPointer][uartm->msgProcessingBufferCharPointer] = uartm->uartRxMsgBuffer[uartm->RxMsgPointerStart];
我尝试将上面的代码替换为等效的一个bellow,但它仍然不起作用:

strncpy(&uartm->msgProcessingBuffer[uartm->currentMsgProcessingBufferPointer][uartm->msgProcessingBufferCharPointer],&uartm->uartRxMsgBuffer[uartm->RxMsgPointerStart],1);
有两张DMA缓冲区损坏前后的图片(请参阅
pRxBuffPtr
阵列)。当我第四次发送缓冲区损坏时,我正在向它发送
123456789\r\n


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

将缓冲区放大一点,并在末尾添加一个保护值,以便自己查看:

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

我想我对这种编程的东西有点笨,我不知道你是怎么得出这个结论的,但是你是对的,出于某种原因调试器不知道发生了什么。。。。。。。。。谢谢你的帮助,你为我节省了很多调试时间。