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

DMA的串口通信疑问

[复制链接]
  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 134 天

    [LV.7]常住居民III

    20

    主题

    1039

    回帖

    2459

    积分

    金牌会员

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

    点评

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:06
  • 签到天数: 141 天

    [LV.7]常住居民III

    34

    主题

    325

    回帖

    605

    积分

    高级会员

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

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

    点评

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

    使用道具 举报

    该用户从未签到

    551

    主题

    9307

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 134 天

    [LV.7]常住居民III

    20

    主题

    1039

    回帖

    2459

    积分

    金牌会员

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:06
  • 签到天数: 141 天

    [LV.7]常住居民III

    34

    主题

    325

    回帖

    605

    积分

    高级会员

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

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

    使用道具 举报

    该用户从未签到

    46

    主题

    2933

    回帖

    6613

    积分

    超级版主

    积分
    6613
    发表于 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%。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:06
  • 签到天数: 141 天

    [LV.7]常住居民III

    34

    主题

    325

    回帖

    605

    积分

    高级会员

    积分
    605
     楼主| 发表于 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
    纸上得到终觉浅,绝知此事要躬行。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2933

    回帖

    6613

    积分

    超级版主

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

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

    使用道具 举报

  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 134 天

    [LV.7]常住居民III

    20

    主题

    1039

    回帖

    2459

    积分

    金牌会员

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

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

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

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:06
  • 签到天数: 141 天

    [LV.7]常住居民III

    34

    主题

    325

    回帖

    605

    积分

    高级会员

    积分
    605
     楼主| 发表于 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, 2024-5-4 05:28 , Processed in 0.078409 second(s), 73 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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