找回密码
 立即注册
楼主: 飞捷

DMA的串口通信疑问

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2023-12-21 09:30:59 | 显示全部楼层
由加站外地址需要审核,,,
截图202312210930477488.jpg
这个图片你可以看看

点评

&a在数值上等于&a[0],也等于a。 长知识了  发表于 2023-12-21 10:02
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-02 01:28:16
已绑定手机

40

主题

371

回帖

843

积分

高级会员

积分
843
发表于 2023-12-21 10:05:23 | 显示全部楼层
cofmilk 发表于 2023-12-19 19:26
woc老哥这想法有点意思啊,,,我这里测试的时候没有你想的那么细,,,我这里测试的是 关闭DMA再打开DMA之后就 ...

昨晚已经实现了这个功能了,告别串口中断了。 另外,STC32G的DMA功能是不是也是最多只能接收和发送256个字节

点评

老哥牛的,这个代码可以开源一下么,,不行的话就算了,,也没有用串口的超时中断么  发表于 2023-12-21 10:53
纸上得到终觉浅,绝知此事要躬行。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-12-21 10:08:15 | 显示全部楼层
STC32G的DMA缓冲区是 xdata的大小, 《= 64K
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2023-12-21 10:56:20 | 显示全部楼层
我也是上网查了之后才知道的,,,属于是共同进步的说。。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-02 01:28:16
已绑定手机

40

主题

371

回帖

843

积分

高级会员

积分
843
发表于 2023-12-21 11:19:00 | 显示全部楼层
飞*** 发表于 2023-12-21 10:05
昨晚已经实现了这个功能了,告别串口中断了。 另外,STC32G的DMA功能是不是也是最多只能接收和发送256个 ...

整个项目的代码无法割分开,按这个思路去做就能实现,利用这个已接收的数量做为基准就好,禁用使能和同时禁用自动收发,就会把已接收数量的寄存器清零。
纸上得到终觉浅,绝知此事要躬行。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2023-12-21 14:35:25 | 显示全部楼层
根据多年来的应用,说点个人看法。
我是从90年代开始用MODBUS协议的,30年来,但凡能让我自己选择协议的,MODBUS-RTU协议是首选,协议全球通用(特别是控制领域),兼容性好,数据域不定长,CRC16校验。
对于发送,比较简单,没有DMA的,准备好数据,启动中断发送,发送完一个字节进入中断,发下一个字节,现在STC8这样的MCU,时间也就2us左右@24MHz,对于115200的波特率,86.8us一个字节,2us开销没有任何压力。
有DMA的就简单多了,准备好数据启动DMA发送即可。
对于接收,麻烦一点,因为MODBUS-RTU协议是基于超时结束的,所以要超时处理,按协议最小是35个位时间,我常用50位时间。无DMA的MCU,直接串口接收中断处理,定时器配合做超时。有DMA的,则要有硬件超时配合(比如STC32G8K64/STC32F12K54硬件判断超时功能)比较好。如果没有硬件超时处理,则用串口中断比较简单,收到一个字节进中断保存一下,大约2us左右@24MHz,对于115200的波特率,86.8us一个字节,2us开销没有任何压力。
4个串口同时在接收或发送(115200,半双工),时间开销大约2*4/86.8=0.092=9.2%,这个时间占比不大,而一般传输距离不会很短,所以波特率往往使用比115200低,则时间开销占比就更小了,比如波特率9600时,时间开销占比不到0.8%。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-02 01:28:16
已绑定手机

40

主题

371

回帖

843

积分

高级会员

积分
843
发表于 2023-12-21 15:06:47 | 显示全部楼层
本帖最后由 飞捷 于 2023-12-21 15:14 编辑
梁*** 发表于 2023-12-21 14:35
根据多年来的应用,说点个人看法。
我是从90年代开始用MODBUS协议的,30年来,但凡我能自己定协议的,MODBU ...

一般工业产品都习惯用9600 19200,特别是9600基本是默认的标准,像变频,触摸屏,PLC都基本选择9600,可能是环境干扰比较大的原因。
然后关于资源,因为串口中断,如果串口中断优先级低,则被其它中断打断,时间长一点可能会少接收了数据,如果串口中断优先级打高,则会影响其它中断处理,例如发脉冲,脉冲一般是100K的速度,就需要200K的频率,5US如果中间被串口打断了,会影响脉冲质量。  
以前发脉冲功能用得少,所以没在意这个问题。
所以能用DMA是最好的。

点评

用200KHz的中断频率发脉冲不是一个好方法,占用CPU时间太多了。 而各个中断运行最长时间是可知的,并且一般都尽量缩短中断时间(特别是任务很多时),可以保证不会丢数据的。 有DMA+硬件超时当然是最好的。  详情 回复 发表于 2023-12-21 15:30
纸上得到终觉浅,绝知此事要躬行。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2023-12-21 15:30:46 | 显示全部楼层
飞*** 发表于 2023-12-21 15:06
一般工业产品都习惯用9600 19200,特别是9600基本是默认的标准,像变频,触摸屏,PLC都基本选择9600,可能 ...

用200KHz的中断频率发脉冲不是一个好方法,占用CPU时间太多了。
而各个中断运行最长时间是可知的,并且一般都尽量缩短中断时间(特别是任务很多时),可以保证不会丢数据的。
有DMA+硬件超时当然是最好的。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2023-12-21 15:35:39 | 显示全部楼层
梁*** 发表于 2023-12-21 14:35
根据多年来的应用,说点个人看法。
我是从90年代开始用MODBUS协议的,30年来,但凡我能自己定协议的,MODBU ...

个人想法,选用DMA的来接收串口数据的目的就是来减少串口中断产生的。
虽然到目前为止,没有对时序这个有过高的要求。对这个串口中断开不开得没什么体验上的区别。但是,从个人原则上说,用上了DMA那就一定要比之前的传统中断式接收要有提升。如果没有超时中断,这就好像STC8A单片机上的PWM只能输出波形,不能输入捕获。

所以希望能给有DMA的单片机加上超时中断,以及这个楼主上面说的校验位问题。

真得不想说,啊这款单片机有,换这款单片机吧。。个人开发怎么都好说,但是到了公司里换单片机不是一个简单的事情呀。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-02 01:28:16
已绑定手机

40

主题

371

回帖

843

积分

高级会员

积分
843
发表于 2023-12-22 17:25:40 | 显示全部楼层
梁*** 发表于 2023-12-21 15:30
用200KHz的中断频率发脉冲不是一个好方法,占用CPU时间太多了。
而各个中断运行最长时间是可知的,并且一 ...

有什么好办法可以不用中断频率发脉冲?求指导

点评

如果不需要计数,则定时器输出高速脉冲(注意不要开中断)可以输出超过10MHz的方波信号。 如果需要计数,可以将输出信号接到另一个计数器输入端,设定计数值,计满进中断关闭脉冲输出。 用中断取反输出脉冲,一般不  详情 回复 发表于 2023-12-22 18:24
纸上得到终觉浅,绝知此事要躬行。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:12 , Processed in 0.184045 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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