找回密码
 立即注册
查看: 1007|回复: 6

DMA取出串口2收到的数据顺序错误

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:253
  • 最近打卡:2025-07-29 21:26:02

52

主题

170

回帖

1995

积分

金牌会员

积分
1995
发表于 2024-7-21 17:11:09 | 显示全部楼层 |阅读模式
MCU:STC32G8K64

实验目的:
用DMA接收串口2收到的数据
遇到的问题:
只是想尝试下使用DMA接收串口数据,本次改用DMA接收也是把原来的串口2接收部分改成DMA,能不能解决,没啥影响。但是,不解决吧,心里老有个事装着,所以才来提问的。
改成DMA接收之前串口收到的数据按照0,1,2,3,....,9的顺序读出,但是改用DMA接收串口2的数据后从xdata段读的顺序非得按照6,7,8,9,0,1,2,3,4,5这样读,才能对,不知道为什么?
其他疑问:
1. 假设,串口2每次会收到 10 个字节。那么,很显然,应该在xdata段为DMA申请10个字节的空间。可是,寄存器DMA_UR2R_AMT是什么情况,给它赋值9还是10?(实验中赋值为9)
2. UR2RIF什么时候会置位?是收到寄存器DMA_UR2R_AMT指定的字节数后产生中断还是每收到一个字节就中断一次?
3. 寄存器DMA_UR2R_DONE指示的是实际已收到的字节数吗?会累加吗?20240513发布的STC32G手册第30章12节的2个例程都没提到这个寄存器有什么用。
感谢先 :-)

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:514
  • 最近打卡:2025-08-01 07:33:38
已绑定手机

87

主题

5776

回帖

1万

积分

超级版主

DebugLab

积分
10368
发表于 2024-7-21 17:47:13 | 显示全部楼层
感觉是指针的位置不正确,刚开始接收的时候不在起始地址
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:491
  • 最近打卡:2025-08-01 11:12:54

33

主题

2464

回帖

5333

积分

论坛元老

积分
5333
发表于 2024-7-22 09:48:11 | 显示全部楼层
1.关于DMA_UR2R_AMT 寄存器用法
截图202407220948004052.jpg
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:491
  • 最近打卡:2025-08-01 11:12:54

33

主题

2464

回帖

5333

积分

论坛元老

积分
5333
发表于 2024-7-22 09:51:06 | 显示全部楼层
2.关于UR2RIF的描述
截图202407220948491787.jpg
这里说的是UR2R_DMA接收完成的时候,指的是一次DMA传输完成。
你所说的接收一个字节就中断一次的是串口接收中断。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:491
  • 最近打卡:2025-08-01 11:12:54

33

主题

2464

回帖

5333

积分

论坛元老

积分
5333
发表于 2024-7-22 10:11:03 | 显示全部楼层
3.1关于这个DMA_UR2R_DONE寄存器,,我用STC8H8K进行测试的时候这个寄存器只有8位,一次DMA最多只能发送接收256个字节,, 当接受了256个字节时 读这个寄存器会变成0。
3.2 关于累计问题,我测试的时候不会累计,只会显示最近一次DMA时发送或接收的字节数。
3.3 官方的例程都是固定字节的发送和接收,根本不用考虑这个寄存器的数值,只能说写得很基础
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:480
  • 最近打卡:2025-08-01 08:54:12
已绑定手机

44

主题

2130

回帖

7419

积分

论坛元老

积分
7419
发表于 2024-7-22 13:27:26 | 显示全部楼层
完成一次DMA接收后,关闭接收DMA,下次接收的数据重新存放在起始地址位置,否则下次接收数据继续往后面存放。
如设置:DMA_URxR_CR = 0x00;
可参考STC32G实验箱例程包,63-DMA-UART串口与存储器数据自动收发->串口4使用DMA中断模式与电脑收发不定长数据-软件超时

DMA_URxR_DONE是只读寄存器
任何时候将DMA_URxR_CR寄存器的最高位(ENURxR)位写零,
就可以对DMA_URxR_DONE进行清零
参考帖子:
https://www.stcaimcu.com/forum.p ... ptid=4675&pid=31660
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:253
  • 最近打卡:2025-07-29 21:26:02

52

主题

170

回帖

1995

积分

金牌会员

积分
1995
发表于 2024-8-2 16:33:33 | 显示全部楼层
_奶*** 发表于 2024-7-22 09:51
2.关于UR2RIF的描述

这里说的是UR2R_DMA接收完成的时候,指的是一次DMA传输完成。

感谢指导
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-1 11:34 , Processed in 0.128735 second(s), 88 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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