找回密码
 立即注册
查看: 2134|回复: 7

关于寄存器DMA_UR1R_DONE的应用问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-13 13:22:49

5

主题

11

回帖

79

积分

注册会员

积分
79
发表于 2023-10-18 15:05:25 | 显示全部楼层 |阅读模式
本帖最后由 mengxuan1303 于 2023-10-18 15:20 编辑

准备用串口溢出寄存器进行接收串口数据,方案为:发现溢出读取接收完成寄存器DMA_UR1R_DONE的数据长度,如果没有则清除溢出标记,知道溢出标记和接收完成寄存器同时出现,然后获得串口的DMA数据。调试过程中发现DMA_UR1R_DONE是累计接收数据长度,并且清除不掉,请问他是只读的么?有什么方式在我接收完数据后进行给他清零?


        if(DMA_UR1R_DONE == 0)UR1TOSR &= 0xFE;
        else
        {
                if((UR1TOSR & 0x01) == 0x01)
                {
                        
                        gbR_Len = DMA_UR1R_DONE;
                        for(bI = 0;bI<gbR_Len;bI++)gbpRx[bI] = gbpR_Buff[bI];
                        gwMsg |= MSG_UR1R;
                        DMA_UR1R_DONE = 0;
                        DMA_UR1R_DONEH = 0;
                        DMA_UR1R_CR = 0xA1;
                        SBUF = gbR_Len;     //调试用,发现DMA_UR1R_DONE没有被清零,每次电脑端发送数据后,这个数据进行累加。
                }
        }

这是定时器中截取的一小段。

本帖被以下淘专辑推荐:

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:145
  • 最近打卡:2026-04-29 09:41:40

31

主题

1266

回帖

4796

积分

超级版主

积分
4796
发表于 2023-10-18 16:39:43 | 显示全部楼层
本帖最后由 zhp 于 2023-10-18 16:41 编辑

DMA_UR1R_DONE是只读寄存器
任何时候将DMA_UR1R_CR寄存器的最高位(ENUR1R)位写零,
就可以对DMA_UR1R_DONE进行清零

代码可以这样写:
                        gbR_Len = DMA_UR1R_DONE;
                        for(bI = 0;bI<gbR_Len;bI++)gbpRx[bI] = gbpR_Buff[bI];
                        gwMsg |= MSG_UR1R;
                        DMA_UR1R_CR = 0x00;
                        DMA_UR1R_CR = 0xA1;
                        SBUF = gbR_Len;     //调试用,发现DMA_UR1R_DONE没有被清零,每次电脑端发送数据后,这个数据进行累加。

点评

淘帖理由:此楼层正解。PS:是只读寄存器的话是不是应该在手册中说明呢?  发表于 2024-7-22 13:35
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:711
  • 最近打卡:2026-05-07 12:22:27
已绑定手机
已实名认证

131

主题

3419

回帖

8936

积分

版主

积分
8936
发表于 2023-10-18 16:46:22 | 显示全部楼层
这个接受数据长度按道理来讲应该就是只读的。
如果想要清除接收数据长度,可以清除一次状态寄存器后重新开始接收,并且通过置位DMA_UR1R_CR的bit0,在操作前清空fifo。


其他建议:
==接受定长数据可以直接设置指定长度后启动完成中断
==不定长度可以讲接受长度设定为0xffff,然后通过两个位之间的时间判断是否发完了一个包。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-13 13:22:49

5

主题

11

回帖

79

积分

注册会员

积分
79
发表于 2023-10-19 08:19:34 | 显示全部楼层
zh*** 发表于 2023-10-18 16:39
DMA_UR1R_DONE是只读寄存器
任何时候将DMA_UR1R_CR寄存器的最高位(ENUR1R)位写零,
就可以对DMA_UR1R_DON ...

谢谢!验证过了,好用。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-13 13:22:49

5

主题

11

回帖

79

积分

注册会员

积分
79
发表于 2023-10-19 08:22:35 | 显示全部楼层
王*** 发表于 2023-10-18 16:46
这个接受数据长度按道理来讲应该就是只读的。
如果想要清除接收数据长度,可以清除一次状态寄存器后重新开 ...

谢谢,不定长数据,最简单的办法还是利用好接收长度寄存器,和超时溢出寄存器,充分利用硬件资源。
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:196
  • 最近打卡:2026-04-30 06:49:07

25

主题

135

回帖

840

积分

高级会员

积分
840
发表于 2026-4-19 11:44:43 | 显示全部楼层
8H型号,有:DMA_UR1R_DONE 和 DMA_UR1R_DONEH 两个寄存器?我的手册里怎么只有 DMA_UR1R_DONE 一个8位寄存器?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:674
  • 最近打卡:2026-05-08 09:06:14
已绑定手机

52

主题

2618

回帖

9119

积分

论坛元老

积分
9119
发表于 2026-4-20 09:15:09 | 显示全部楼层
Mr_*** 发表于 2026-4-19 11:44
8H型号,有:DMA_UR1R_DONE 和 DMA_UR1R_DONEH 两个寄存器?我的手册里怎么只有 DMA_UR1R_DONE 一个8位寄存 ...

DMA_UR1R_DONE寄存器,8H系列一个字节,32系列2个字节
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-5-9 00:35 , Processed in 0.120638 second(s), 88 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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