首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >STM32: UART DMA未正确启动

STM32: UART DMA未正确启动
EN

Stack Overflow用户
提问于 2020-04-20 19:09:30
回答 2查看 2.3K关注 0票数 0

我正在使用通过RS232连接的两个STM32H743。这两个模块连接到相同的电源。它们将UART与DMA结合使用。当我同时打开模块时,UART和DMA正确启动。但是,当我重新启动一个模块,而另一个模块处于唤醒状态时,重置模块的UART和DMA无法启动,因此它们无法相互通信。

这个问题以前在STM32F4系列中也发生过。单片机与FPGA相连,通过串口进行通信。当FPGA在MCU之前启动时,DMA和UART不能正常启动。导致此问题的原因是什么?在启动UART之前,我是否需要具有高z或浮动引脚状态?

EN

回答 2

Stack Overflow用户

发布于 2020-07-23 04:07:12

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

我的用途:

代码语言:javascript
运行
复制
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
    HAL_UART_MspDeInit();   
    HAL_UART_Receive_DMA(...);
}

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

正确使用:

代码语言:javascript
运行
复制
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
    HAL_UART_DeInit();  
    HAL_UART_Receive_DMA(...);
}

多亏了我的代码中的三个打字错误,它给我带来了很多时间。但最终,它得到了解决。

票数 1
EN

Stack Overflow用户

发布于 2020-04-21 08:57:23

UART和DMA外设通常有一个错误检测器,因此将其标志写入状态寄存器。当发生错误时,STM32硬件抽象层将停止任何正在进行的传输,并等待您处理此故障。您可以使用debug模块检查HAL状态寄存器以解决问题,并在代码中添加处理方法。首先,您可以通过运行DeInit()重置外设,然后立即运行出错的外设的Init()例程,并重置任何其他代码片段,例如状态机和使用来自此外设的数据的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61321020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档