找回密码
 立即注册
查看: 700|回复: 5

关于寄存器DMA_UR1R_DONE的应用问题

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

5

主题

11

回帖

75

积分

注册会员

积分
75
发表于 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
  • 打卡总天数:38
  • 最近打卡:2025-04-30 14:38:57

25

主题

977

回帖

3599

积分

超级版主

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

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


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

使用道具 举报 送花

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

5

主题

11

回帖

75

积分

注册会员

积分
75
发表于 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

回帖

75

积分

注册会员

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:43 , Processed in 0.293963 second(s), 77 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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