Отказ от приема данных от UART в режиме DMA

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

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

main.c

https://pastebin.com/1W4BCjxB

3 ответа

Решение

Я решил, это действительно смешно.

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

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

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

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

Оно работает!!!

У меня такая же проблема. Вот решение с использованием интегрированного представления CubeMX. В CubeMX-> Project Manager-> Advanced Settings вы можете выбрать порядок генерируемых функций. Я переместил свой MX_DMA_Init наверх, чтобы убедиться, что DMA готов перед инициализацией других периферийных устройств.

Вы не инициализировали переменные 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 и не обрабатывает прерывания и передачу данных.

Другие вопросы по тегам