Stm32 在DMA模式下无法从UART接收数据
我正在尝试从我的NucleoF446RE stm32板上的pc接收8个字节。 传输到pc机工作。 问题是,我无法使用DMA接收数据。 我看到了一个几乎使用相同代码的示例,它对该人员起到了作用。 如果我使用中断模式(只需将HAL_UART_Receive_DMA更改为HAL_UART_Receive_),它确实工作,并且正在调用RX Complete回调 这是完整的主程序。c.DMA处于循环模式Stm32 在DMA模式下无法从UART接收数据,stm32,stm32f4,nucleo,cubemx,stm32cubeide,Stm32,Stm32f4,Nucleo,Cubemx,Stm32cubeide,我正在尝试从我的NucleoF446RE stm32板上的pc接收8个字节。 传输到pc机工作。 问题是,我无法使用DMA接收数据。 我看到了一个几乎使用相同代码的示例,它对该人员起到了作用。 如果我使用中断模式(只需将HAL_UART_Receive_DMA更改为HAL_UART_Receive_),它确实工作,并且正在调用RX Complete回调 这是完整的主程序。c.DMA处于循环模式 main.c 您还没有初始化DMA变量以及DMA中断的处理程序。您需要按照这些思路进行操作 初始化D
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);
HAL\u UART\u Receive\u DMA
只启动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);
HAL\u UART\u Receive\u DMA
只启动DMA,不处理中断和数据传输。我把它解决了,这真是荒谬
这是CubeMX生成的代码的一部分:
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_DMA_Init();
如果我按如下方式订购:
MX_GPIO_Init();
MX_DMA_Init();
MX_USART2_UART_Init();
它能用!!!我把它解决了,真是可笑 这是CubeMX生成的代码的一部分:
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_DMA_Init();
如果我按如下方式订购:
MX_GPIO_Init();
MX_DMA_Init();
MX_USART2_UART_Init();
有效!!!不知何故,这段代码确实有效:不知何故,这段代码确实有效:谢谢你的回答。我在生成的文件stm32f4xx_hal_msp.c中的函数hal_UART_MspInit中看到了这些行。我在main中强制运行此函数,现在在发送“xyz”时我只得到了“z”。但是,正如我所说的,这段代码工作:仍然没有找到重要的区别。HAL_UART_Init调用该函数,所以它被设置。但是,这只初始化UART。对吗?您的DMA还没有配置。嗯,但是当我从github复制代码时它是如何工作的?这是函数。它初始化DMA。谢谢您的回答。我在函数hal_UART_MspInit中生成的文件stm32f4xx_hal_msp.c中看到了这些行。我强制在main中运行此函数,现在在发送“xyz”时运行此函数我只得到了“z”。但是,正如我所说的,这段代码工作:仍然没有找到重要的区别。HAL_UART_Init调用该函数,所以它被设置。但是,这只初始化UART。对吗?您的DMA还没有配置。嗯,但是当我从github复制代码时它是如何工作的?这是函数。它初始化DMA。相互询问,它是打开的使用集成在STM32CUBEIDE中的CubeMX时可能会出现问题。Stand-alon-CubeMX效果很好。相反,只有使用集成在STM32CUBEIDE中的CubeMX时才会出现问题。Stand-alon-CubeMX效果很好。