У меня проблема с 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 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
, когда отправляю в 4-й раз, буфер повреждается.