Не удается получить данные от UART в режиме DMA - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь получить 8 байт с моего компьютера на плате NUCLEO F446RE stm32. Передача на ПК работает. Проблема в том, что я не могу получать данные, используя DMA. Я видел пример с почти таким же кодом, и он работал на человека. Если я использую режим прерывания (просто измените HAL_UART_Receive_DMA на HAL_UART_Receive_IT, он сработает, и будет вызван обратный вызов RX Complete.

Вот полный файл main.c. DMA находится в круговом режиме.

main.c

https://pastebin.com/1W4BCjxB

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Я понял это, на самом деле это смешно.

Итак, это часть кода, который генерирует CubeMX:

MX_GPIO_Init();
MX_USART2_UART_Init();
MX_DMA_Init();

Если я закажу его следующим образом:

MX_GPIO_Init();
MX_DMA_Init();
MX_USART2_UART_Init();

Работает !!!

0 голосов
/ 24 октября 2019

Вы не инициализировали переменные DMA, а также обработчик прерывания DMA. Вам нужно будет что-то сделать в этом направлении

Инициализировать DMA:

hdma_usart2_rx.Instance = DMA2_Stream1;
hdma_usart2_rx.Init.Channel = DMA_CHANNEL_2;
hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart2_rx.Init.MemInc = DMA_MINC_DISABLE;
hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_rx.Init.Mode = DMA_CIRCULAR;
hdma_usart2_rx.Init.Priority = DMA_PRIORITY_HIGH;
hdma_usart2_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
HAL_DMA_Init(&hdma_usart2_rx);
void DMA2_Stream2_IRQHandler(void)
{
    HAL_NVIC_ClearPendingIRQ(DMA2_Stream2_IRQn);
    HAL_DMA_IRQHandler(&hdma_usart1_rx);
}

HAL_UART_Receive_DMA только запускает DMA и не обрабатывает прерывание и передачу данных.

...