我试图在我的 NUCLEO F446RE stm32 板上从我的电脑接收 8 个字节。传输到电脑工作。问题是,我无法使用 DMA 接收数据。我看到了一个代码几乎相同的例子,它对这个人有用。如果我使用中断模式(只需将 HAL_UART_Receive_DMA 更改为 HAL_UART_Receive_IT,它就可以工作,并且正在调用 RX Complete 回调。
这是完整的 main.c。DMA 处于循环模式。
main.c
我试图在我的 NUCLEO F446RE stm32 板上从我的电脑接收 8 个字节。传输到电脑工作。问题是,我无法使用 DMA 接收数据。我看到了一个代码几乎相同的例子,它对这个人有用。如果我使用中断模式(只需将 HAL_UART_Receive_DMA 更改为 HAL_UART_Receive_IT,它就可以工作,并且正在调用 RX Complete 回调。
这是完整的 main.c。DMA 处于循环模式。
main.c
我已经解决了,这实际上是荒谬的。
因此,这是 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,不处理中断和数据传输。