0

我刚开始使用STM32F407GZ,一开始我想打开/关闭板上的LED。我正在使用 CubeMX 生成初始化代码。我可以接收和传输数据,但无法正确接收到数据。此外,在我单击重置按钮之前,LED 不会亮起。当我单击重置按钮时,LED 会亮起,但我停止接收和传输数据。

这是代码:

 MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART3_UART_Init();

  HAL_UART_Receive_DMA(&huart3,receive,20);
    
  while (1)
  {
        HAL_Delay(100);
        HAL_UART_Receive_DMA(&huart3,receive,20);
        
        HAL_UART_Transmit_DMA(&huart3,receive,20);
        
        HAL_Delay(100);
        HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOF,GPIO_PIN_6,GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOF,GPIO_PIN_7,GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOF,GPIO_PIN_8,GPIO_PIN_SET);
        
        HAL_Delay(500);
        
  }
4

2 回答 2

0

正如0___________所说,DMA 是非阻塞接收。它会自动从总线读取数据并将数据移动到您指定的内存位置(receive在您的情况下)。
这是使用阻塞函数的简单解决方案:

  HAL_UART_Receive(&huart3, receive, 20, 1000);
  HAL_UART_Transmit(&huart3, receive, 20, 1000);

HAL_UART_Receive()当接收到 20 个字节的数据或经过 1000 ms 时返回。 HAL_UART_Transmit()当传输 20 字节数据或经过 1000 毫秒时返回。这两个函数确保接收和发送的执行遵循语句的顺序。

这不是您要问的问题,但我认为这可能会对您有所帮助。开启led的部分可以简化为一行:

HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_SET);

您可以查看GPIO_PIN_6或其他引脚的定义,您就会明白这一点。

于 2021-06-14T15:46:50.110 回答
0
        HAL_UART_Receive_DMA(&huart3,receive,20);
        
        HAL_UART_Transmit_DMA(&huart3,receive,20);

这是错误的。DMA 功能没有阻塞。他们不会等到操作完成。他们立即返回。您指示 UART 接收 20 个字节,同时,您希望从同一个缓冲区发送数据(尚未收到任何内容)。

于 2021-06-14T07:48:16.067 回答