c - STM32:UART DMA 未正确启动
问题描述
我正在使用通过 RS232 连接的两个 STM32H743。这两个模块连接到同一个电源。他们使用 UART 和 DMA。当我同时打开模块时,UART 和 DMA 正确启动。但是当我重新启动其中一个模块而另一个模块处于唤醒状态时,重置模块的 UART 和 DMA 不会启动,因此它们无法相互通信。
STM32F4系列之前也出现过这个问题。MCU 连接到 FPGA,它们通过 UART 进行通信。当 FPGA 在 MCU 之前启动时,DMA 和 UART 不能正常启动。什么可能导致这个问题?在启动 UART 之前,我是否需要有一个高阻抗或浮动引脚状态?
解决方案
经过大量的调试,我终于找到了原因和解决方案。当第一个字节到达 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(...);
}
由于我的代码中有三个错别字,这给我带来了很多时间。但最后,它解决了。
推荐阅读
- iot - 用户无法使用 rest api thingsboard
- react-native - 运行 onpress 功能时出现问题:反应导航
- reactjs - 检查一个元素是否在 React 的中心
- oracle - 无法将此 SQL 查询转换为 PL/SQL
- javascript - 如何在 React Native 中使用带有可滚动屏幕的 React Native swiper
- javascript - 在绑定方法中获取类的 this 上下文,同时保留绑定 this
- typescript - TypeScript 命名空间要停止使用?
- python-3.x - 为每个元素生成具有唯一范围的 numpy 矩阵
- sql-server - 将今天的日期附加到 sp_spaceUsed 的结果中
- python-3.x - 如何在不同的分辨率下使用经过训练的深度学习模型?