繁体   English   中英

STM32:UART DMA 未正确启动

[英]STM32: UART DMA does not start correctly

我正在使用通过 RS232 连接的两个 STM32H743。 这两个模块连接到同一个电源。 他们使用 UART 和 DMA。 当我同时打开模块时,UART 和 DMA 正确启动。 但是当我重新启动其中一个模块而另一个模块处于唤醒状态时,重置模块的 UART 和 DMA 不会启动,因此它们无法相互通信。
STM32F4系列之前也出现过这个问题。 MCU 连接到 FPGA,它们通过 UART 进行通信。 当 FPGA 在 MCU 之前启动时,DMA 和 UART 不能正常启动。 什么可能导致这个问题? 在启动 UART 之前,我是否需要有一个高阻抗或浮动引脚状态?

UART 和 DMA 外设通常有一个错误检测器,因此将它的标志放入状态寄存器。 发生错误时,STM32 HAL 将停止任何正在进行的传输并等待直到您处理此失败。 您可以使用调试模块检查 HAL 状态寄存器以解决问题,并在您的代码中添加处理方法。 首先,您可以通过运行 DeInit() 并在运行有错误的外围设备的 Init() 例程之后立即重置外围设备,并重置任何其他代码,例如 state 机器和使用来自该外围设备的数据的东西。

经过大量的调试,我终于找到了原因和解决方案。 当第一个字节到达 UART 外设时,由于时钟不匹配,它会触发帧错误,然后停止 DMA。 当 UART 数据速率非常高时,这种情况比平常更常见。 但是我添加了 ErrorCallback function 来处理中断。 不幸的是,我误用了 function。

我的用途:

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
    HAL_UART_MspDeInit();   
    HAL_UART_Receive_DMA(...);
}

HAL_UART_MspDeInit 不会清除结构和初始化,因此 Receive_DMA function 无法再次启动它。 所以,我的交流停止了。

正确使用:

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
    HAL_UART_DeInit();  
    HAL_UART_Receive_DMA(...);
}

由于我的代码中有三个错别字,这给我带来了很多时间。 但最后,它解决了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM