在 DMA 模式下无法从 UART 接收数据
Failing to receive data from UART in DMA mode
我正在尝试从我的 NUCLEO F446RE stm32 板上的电脑接收 8 个字节。
传输到 pc 工作。
问题是,我无法使用 DMA 接收数据。
我看到了一个代码几乎相同的例子,它对这个人有用。
如果我使用中断模式(只需将 HAL_UART_Receive_DMA 更改为 HAL_UART_Receive_IT,它就可以工作并且正在调用 RX Complete 回调。
这是完整的 main.c。 DMA 处于循环模式。
main.c
您还没有初始化 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,不处理中断和数据传输。
我解决了,其实很可笑
所以,这是 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 中您可以 select 生成函数的顺序。我将 MX_DMA_Init 移到了顶部,以确保在初始化任何其他外设之前 DMA 已准备就绪。
我正在尝试从我的 NUCLEO F446RE stm32 板上的电脑接收 8 个字节。 传输到 pc 工作。 问题是,我无法使用 DMA 接收数据。 我看到了一个代码几乎相同的例子,它对这个人有用。 如果我使用中断模式(只需将 HAL_UART_Receive_DMA 更改为 HAL_UART_Receive_IT,它就可以工作并且正在调用 RX Complete 回调。
这是完整的 main.c。 DMA 处于循环模式。
main.c
您还没有初始化 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,不处理中断和数据传输。
我解决了,其实很可笑
所以,这是 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 中您可以 select 生成函数的顺序。我将 MX_DMA_Init 移到了顶部,以确保在初始化任何其他外设之前 DMA 已准备就绪。