Отказ от приема данных от UART в режиме DMA
Я пытаюсь получить 8 байтов с моего компьютера на моей плате NUCLEO F446RE stm32. Передача на компьютер работает. Проблема в том, что я не могу получать данные с помощью DMA. Я видел пример с почти таким же кодом, и он сработал для человека. Если я использую режим прерывания (просто меняю HAL_UART_Receive_DMA на HAL_UART_Receive_IT, он работает, и вызывается обратный вызов RX Complete.
Вот полный файл main.c. DMA находится в круговом режиме.
main.c
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 и не обрабатывает прерывания и передачу данных.