板载 LED,直到我单击重置后才会亮起,数据接收/传输无法正常工作

Posted

技术标签:

【中文标题】板载 LED,直到我单击重置后才会亮起,数据接收/传输无法正常工作【英文标题】:On-board LED, doesn't turn on until I click reset, data receive/trasmit dosn't work correctly 【发布时间】:2021-08-30 03:12:25 【问题描述】:

我刚开始使用 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);
        
  

【问题讨论】:

【参考方案1】:
        HAL_UART_Receive_DMA(&huart3,receive,20);
        
        HAL_UART_Transmit_DMA(&huart3,receive,20);

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

【讨论】:

但是如果我在它们中间放一个延迟,它就不起作用了。 你怎么知道延迟足够长来接收缓冲区?【参考方案2】:

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

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

HAL_UART_Receive() 在接收到 20 字节数据或经过 1000 毫秒时返回。 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或其他引脚的定义,你就会明白了。

【讨论】:

以上是关于板载 LED,直到我单击重置后才会亮起,数据接收/传输无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

STM32F4程序只有在按下复位按钮后才会运行

ngOnInit 直到我导航到另一个组件后才会运行

在 `cellForRowAt` 中激活 NSLayoutConstraint 直到滚动后才会呈现

iOS 通知:WhatsApp 在强制关闭后如何接收通知和处理?

直到 company_repository 的更新间隔已过或强制更新后才会尝试解析

双向通信-Processing接收字符串