Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stm32 在DMA模式下无法从UART接收数据_Stm32_Stm32f4_Nucleo_Cubemx_Stm32cubeide - Fatal编程技术网

Stm32 在DMA模式下无法从UART接收数据

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

我正在尝试从我的NucleoF446RE stm32板上的pc接收8个字节。 传输到pc机工作。 问题是,我无法使用DMA接收数据。 我看到了一个几乎使用相同代码的示例,它对该人员起到了作用。 如果我使用中断模式(只需将HAL_UART_Receive_DMA更改为HAL_UART_Receive_),它确实工作,并且正在调用RX Complete回调

这是完整的主程序。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);

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效果很好。