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

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

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-05-01 10:06:01

44

主题

124

回帖

1437

积分

金牌会员

积分
1437
发表于 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
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

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

使用道具 举报 送花

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

33

主题

2351

回帖

4860

积分

论坛元老

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

使用道具 举报 送花

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

33

主题

2351

回帖

4860

积分

论坛元老

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

使用道具 举报 送花

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

33

主题

2351

回帖

4860

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-05-01 10:06:01

44

主题

124

回帖

1437

积分

金牌会员

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

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

感谢指导
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 06:47 , Processed in 0.253681 second(s), 85 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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