板载 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,直到我单击重置后才会亮起,数据接收/传输无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
在 `cellForRowAt` 中激活 NSLayoutConstraint 直到滚动后才会呈现
iOS 通知:WhatsApp 在强制关闭后如何接收通知和处理?