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

введите описание изображения здесь

введите описание изображения здесь


person Gilberto Melo Jr    schedule 14.08.2016    source источник


Ответы (1)


Здесь нет ничего плохого. Если буфер заполнен, у него больше не будет завершающего байта 0, отладчик не знает, где он заканчивается, поскольку он объявлен как unsigned char * в структуре huart1, поэтому он показывает содержимое некоторой другой переменной за буфером .

Увеличьте размер буфера и укажите в конце значение защиты, чтобы убедиться в этом:

char *uartRxMsgBuffer[50];
strcpy(uartRxMsgBuffer + 40, "--guard--");
person followed Monica to Codidact    schedule 15.08.2016
comment
Я думаю, что я тупой в этом программировании, я не знаю, как вы пришли к такому выводу, но вы были правы, по какой-то причине отладчик не знает, что происходит ......... Спасибо за вашу помощь, вы сэкономили мне много времени на отладку. - person Gilberto Melo Jr; 16.08.2016