硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3874|回复: 12
收起左侧

[UART] STM32H7 UART7 DMA 发送模式触发帧错误

[复制链接]

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2019-11-15 19:45:22 | 显示全部楼层 |阅读模式
请教一下,USART3 使用DMA能正确发送数据,但是把同样配置放到UART7的时候 触发了 USART_ISR_FE
  1. void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
  2. {
  3.   uint32_t isrflags   = READ_REG(huart->Instance->ISR);
  4.   uint32_t cr1its     = READ_REG(huart->Instance->CR1);
  5.   uint32_t cr3its     = READ_REG(huart->Instance->CR3);

  6.   uint32_t errorflags;
  7.   uint32_t errorcode;

  8.   /* If no error occurs */
  9.   errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_RTOF));
复制代码

errorflags 读取到的值是 0x006200D2

查看ISR的寄存器的FE被置1,但是这时候的数据已经发出去了,串口助手也接收到了,但是后续的发送就再也发不出去了。

手册中说到:当检测到去同步化,过度的噪声或break 字符时 该位由硬件置1.

这里的去同步化不明白时什么意思。使用非DMA的时候可以正常收发,MODBUS 收发数据也正常。那么为什么会出现这个错误呢?

CACHE配置的WT模式,数据定义在AXI SRAM。发送直接做了SCB_InvalidateDCache();
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2019-11-15 19:55:51 | 显示全部楼层
USART1,我也配置过DMA,没有这种问题。

有一个重要的问题,如果串口句柄是局部变量,清零了没有,这点很关键。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-11-15 23:27:12 | 显示全部楼层
eric2013 发表于 2019-11-15 19:55
USART1,我也配置过DMA,没有这种问题。

有一个重要的问题,如果串口句柄是局部变量,清零了没有,这点 ...

换个板子就好了,但是非DMA能发送成功,DMA就错误,就不是太明白了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2019-11-15 23:41:07 | 显示全部楼层
王海靖 发表于 2019-11-15 23:27
换个板子就好了,但是非DMA能发送成功,DMA就错误,就不是太明白了。

好的,这个问题,我记录下,后面专门测试下UART7的DMA问题。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-11-16 08:55:24 | 显示全部楼层
eric2013 发表于 2019-11-15 23:41
好的,这个问题,我记录下,后面专门测试下UART7的DMA问题。

UART7 DMA本身应该是没问题的,只是我的其中一个板子有问题,而且是非DMA跑MODBUS都没问题,DMA模式报错误,好奇会是什么原因导致的。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2020-6-17 17:09:02 | 显示全部楼层
请问找到原因了吗?
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-1-28 11:14:41 | 显示全部楼层
我在多块板子上试过,UART7在DMA模式下不能通讯,非DMA模式下,有概率性不能接收数据问题且不能接收后就再不能接收了,只能重新上电才能恢复
回复

使用道具 举报

1

主题

15

回帖

18

积分

新手上路

积分
18
发表于 2023-11-29 15:24:45 | 显示全部楼层
F4遇到相似的问题,板子对外接口用的是232,这个232如果接我自己的串口助手没有问题,但如果接上位机串口的话,发现机器上电有概率会触发HAL_UART_ERROR_FE,导致串口再也收不到数据,手册所说的,当检测到去同步化,过度的噪声或break 字符时报这个错,没有理解这是什么意思,来此求教下大家,该如何解决这个问题
回复

使用道具 举报

13

主题

89

回帖

128

积分

初级会员

积分
128
发表于 2023-11-29 16:11:42 | 显示全部楼层
mark一下,没遇到过,学习一下
回复

使用道具 举报

1

主题

15

回帖

18

积分

新手上路

积分
18
发表于 2023-12-7 10:55:55 | 显示全部楼层
LeslieChia 发表于 2023-11-29 15:24
F4遇到相似的问题,板子对外接口用的是232,这个232如果接我自己的串口助手没有问题,但如果接上位机串口的 ...

已找到原因,我使用HAL_UARTEx_ReceiveToIdle_DMA使能DMA接收并开启空闲中断,发现这个函数内部会开启串口错误侦测,当波特率不匹配或一些其他原因会触发错误中断从而进入串口中断处理,中断处理中判断有错误就会关闭串口。
上位机开机时串口处于不稳定状态,向下位机发送了一些“不合规矩”的信息导致下位机侦测到错误而关闭了串口,目前我的解决方法是在HAL_UART_ErrorCallback函数中通过调用HAL_UARTEx_ReceiveToIdle_DMA重启串口。
回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

积分
16
发表于 2024-2-27 20:06:43 | 显示全部楼层
LeslieChia 发表于 2023-12-7 10:55
已找到原因,我使用HAL_UARTEx_ReceiveToIdle_DMA使能DMA接收并开启空闲中断,发现这个函数内部会开启串 ...

使用同样的方法解决了,确实是因为使用了HAL_UARTEx_ReceiveToIdle_DMA函数导致出现了FE错误,在RTThread论坛中找到的方法是在串口IO初始化时把TX和RX拉高处理。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2024-2-28 11:06:14 | 显示全部楼层
eric2013 发表于 2019-11-15 23:41
好的,这个问题,我记录下,后面专门测试下UART7的DMA问题。

这个问题我在STM32H7A3上也遇到了,串口收发配置DMA+空闲中断初始化就会进入错误中断,接收数据时有概率进入错误中断。目前使用了串口错误回调函数处理来解决,楼上的初始化串口电平的方法我也试试。

不知道和H7的内存配置有无关系,根据H7手册:
1、DTCM和ITCM不支持DMA1,DMA2和BDMA,仅支持MDMA
2、AXI SRAM,SRAM1,SRAM2,SRAM3不支持BDMA,支持MDMA,DMA1和DMA2
如果H7串口使用DMA的话,内存如何分配比较好。话说硬汉哥什么时候出STM32H7串口DMA驱动教程,还会做吗?
回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

积分
16
发表于 2024-2-28 19:39:57 | 显示全部楼层
最佳幕僚 发表于 2024-2-28 11:06
这个问题我在STM32H7A3上也遇到了,串口收发配置DMA+空闲中断初始化就会进入错误中断,接收数据时有概率 ...

我现在的方法1是在串口错误回调函数中重启IDLE+DMA处理,目前看来是没问题的,方法2就是我上面讲的,在初始化的时候GPIO作PULLUP处理。也没遇见问题。对于串口DMA的处理,我是把buff内存指定放在SRAM1里。DMA可以访问到SRAM1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 03:49 , Processed in 0.306802 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表