我正在使用通过RS232连接的两个STM32H743。这两个模块连接到相同的电源。它们将UART与DMA结合使用。当我同时打开模块时,UART和DMA正确启动。但是,当我重新启动一个模块,而另一个模块处于唤醒状态时,重置模块的UART和DMA无法启动,因此它们无法相互通信。
这个问题以前在STM32F4系列中也发生过。单片机与FPGA相连,通过串口进行通信。当FPGA在MCU之前启动时,DMA和UART不能正常启动。导致此问题的原因是什么?在启动UART之前,我是否需要具有高z或浮动引脚状态?
发布于 2020-07-23 04:07:12
经过几个小时的调试,我终于找到了原因和解决方案。当第一个字节到达UART外设时,由于时钟不匹配,它会触发帧错误,然后停止DMA。当UART数据速率非常高时,这种情况会比平时发生得更多。但是我已经添加了ErrorCallback函数来处理中断。不幸的是,我滥用了这个函数。
我的用途:
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
HAL_UART_MspDeInit();
HAL_UART_Receive_DMA(...);
}
HAL_UART_MspDeInit不清除结构和初始化,因此Receive_DMA函数不能再次启动它。所以,我的交流停止了。
正确使用:
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
HAL_UART_DeInit();
HAL_UART_Receive_DMA(...);
}
多亏了我的代码中的三个打字错误,它给我带来了很多时间。但最终,它得到了解决。
发布于 2020-04-21 08:57:23
UART和DMA外设通常有一个错误检测器,因此将其标志写入状态寄存器。当发生错误时,STM32硬件抽象层将停止任何正在进行的传输,并等待您处理此故障。您可以使用debug模块检查HAL状态寄存器以解决问题,并在代码中添加处理方法。首先,您可以通过运行DeInit()重置外设,然后立即运行出错的外设的Init()例程,并重置任何其他代码片段,例如状态机和使用来自此外设的数据的内容。
https://stackoverflow.com/questions/61321020
复制相似问题