硬汉嵌入式论坛

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

STM32的485串口DMA切换收发的正确姿势

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2021-11-6 11:58:16 | 显示全部楼层 |阅读模式
群友问题:

串口的DMA功能发送数据,检测到DMA发送完成后,把使能脚改为接收状态(如图A处)。但是这样子会导致有2个字节数据没发送,485使能脚就被改变为接收状态了(示波器图的绿色线)。最终导致发送数据失败。
如果把485的发送,不用DMA传输。然后再开启串口发送完成中断,在此中断中改变485的接收/发送,这样子是没问题的。

我的想法是:如果我坚持用DMA的方式发送数据,有什么办法能准确切换485的接收/发送引脚的状态的?


QQ截图20211106115553.png

QQ截图20211106115534.png




解决办法。

这个问题的答案就在参考手册里面,等待DMA传输完成后,还有等待TC发送完成标志才是真正的结束。

QQ截图20211106115803.png



回复

使用道具 举报

25

主题

287

回帖

367

积分

高级会员

积分
367
发表于 2021-11-8 22:41:43 | 显示全部楼层
感觉这么做毫无意义,串口数据交给DMA发送后,CPU的工作就是while等待DMA发送完成,也没有干其他事情,这样还不如直接由CPU自己发送串口数据。能否做成这样,CPU交给DMA发送后,先去干别的事情,等DMA发送完成后,在TC flag处产生中断,通知CPU将DE引脚切换为接收模式?
回复

使用道具 举报

210

主题

1044

回帖

1684

积分

至尊会员

More we do, more we can do.

积分
1684
发表于 2021-11-8 23:21:56 | 显示全部楼层
爱恋之燕 发表于 2021-11-8 22:41
感觉这么做毫无意义,串口数据交给DMA发送后,CPU的工作就是while等待DMA发送完成,也没有干其他事情,这样 ...

官方驱动就是DMA中断里使能TC中断,在中断里切换到接收模式
回复

使用道具 举报

210

主题

1044

回帖

1684

积分

至尊会员

More we do, more we can do.

积分
1684
发表于 2021-11-8 23:24:54 | 显示全部楼层
我有款产品MCU主频16.384M,波特率跑115200bps,DMA发送就比查询方式发送更快,字节间间隙很小
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
 楼主| 发表于 2021-11-9 00:26:41 | 显示全部楼层
爱恋之燕 发表于 2021-11-8 22:41
感觉这么做毫无意义,串口数据交给DMA发送后,CPU的工作就是while等待DMA发送完成,也没有干其他事情,这样 ...

他这个是在OS里面使用,死等最方便,简单易用。这个是我之前整理的一个帖子。

谈一下常用的 DMA2D,MDMA和通用DMA1,DMA2应用分类,为什么有些DMA应用是死等
http://www.armbbs.cn/forum.php?mod=viewthread&tid=99646
回复

使用道具 举报

210

主题

1044

回帖

1684

积分

至尊会员

More we do, more we can do.

积分
1684
发表于 2021-11-9 09:31:30 | 显示全部楼层
以前对TC理解不到位,再看手册里的“Figure 297. Transmission using DMA”,理解更准确了。
TC中断在连续发送过程中可以用做发送完标志,发送过程中DR寄存器始终有个待发送的数据,
而且,我F1x的V20RM倒数第2条曲线描述写错了,我图中写的DMA writes SPI DR。
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2023-8-3 14:58:10 | 显示全部楼层
硬汉哥,请问RS485这种半双工传输的,可以做自发自收验证吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
 楼主| 发表于 2023-8-4 09:34:02 | 显示全部楼层
iceburgconner2 发表于 2023-8-3 14:58
硬汉哥,请问RS485这种半双工传输的,可以做自发自收验证吗

在485 PHY芯片前面一级才行。
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2023-8-5 13:28:42 | 显示全部楼层
eric2013 发表于 2023-8-4 09:34
在485 PHY芯片前面一级才行。

好的,谢谢,前级已经验完了
回复

使用道具 举报

3

主题

45

回帖

54

积分

初级会员

积分
54
发表于 2024-1-27 14:27:53 | 显示全部楼层
判断TC标志后,让需要少许延时,因为此时RS485芯片内的信号未必转化完成。测试了几种RS485芯片有的TC标志置位后可直接切换方向,有的必须加延时才行
回复

使用道具 举报

3

主题

45

回帖

54

积分

初级会员

积分
54
发表于 2024-1-27 14:29:12 | 显示全部楼层
TC标志判断后,部分RS485芯片仍需要加少许延时,等待RS485芯片内部信号转化完毕
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
 楼主| 发表于 2024-1-28 09:09:24 | 显示全部楼层
浮生如梦 发表于 2024-1-27 14:27
判断TC标志后,让需要少许延时,因为此时RS485芯片内的信号未必转化完成。测试了几种RS485芯片有的TC标志置 ...

此时推荐使用大厂的485器件,基本都没问题的。之前测试了几款,2Mbps的快速收发切换都正常。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-8 03:02 , Processed in 0.210250 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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