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

DMA_UR1R_DONE的问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-03-01 18:16:22

1

主题

1

回帖

33

积分

新手上路

积分
33
发表于 2024-6-22 01:23:55 | 显示全部楼层 |阅读模式
本帖最后由 beyond0426 于 2024-6-22 01:25 编辑

芯片是STC8H系列,为什么DMA_UR1R_DONE读的数一直是0?请教,如何读取DMA_UR1R_DONE的流程?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:517
  • 最近打卡:2025-09-18 12:36:09
已绑定手机

45

主题

2228

回帖

7828

积分

论坛元老

积分
7828
发表于 2024-6-22 11:26:46 | 显示全部楼层
论坛搜索 DMA_UR1R_DONE 就能找到相关的参考资料:
例如:
串口1使用DMA中断+软件超时接收不定长数据心得
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=2710
(出处: 国芯技术交流网站)

关于寄存器DMA_UR1R_DONE的应用问题
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4675
(出处: 国芯技术交流网站)
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:67
  • 最近打卡:2025-09-18 09:16:34

10

主题

46

回帖

456

积分

中级会员

积分
456
发表于 2025-9-10 10:34:17 | 显示全部楼层
乘风*** 发表于 2024-6-22 11:26
论坛搜索 DMA_UR1R_DONE 就能找到相关的参考资料:
例如:
串口1使用DMA中断+软件超时接收不定长数据心得

我遇到的问题比这个要特殊一些。

我把串口4的DMA_UR4R_AMT设置为255,也就是能DMA接收256个字节。当我给串口4发送256个字节的数据后,读取DMA_UR4R_DONE寄存器为0。
当我把串口4的DMA_UR4R_AMT设置为2256,也就是能DMA接收257个字节。当我给串口4发送256个字节的数据后,读取DMA_UR4R_DONE寄存器为256。
这个请问是哪里的问题?

截图202509101033574624.jpg
截图202509101034118047.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:517
  • 最近打卡:2025-09-18 12:36:09
已绑定手机

45

主题

2228

回帖

7828

积分

论坛元老

积分
7828
发表于 2025-9-10 10:54:49 | 显示全部楼层
cyf1*** 发表于 2025-9-10 10:34
我遇到的问题比这个要特殊一些。

我把串口4的DMA_UR4R_AMT设置为255,也就是能DMA接收256个字节。当我给 ...

描述问题时最好先介绍你使用的是什么型号的单片机,不同单片机的一些功能有些差异。
以AI8051U为例介绍,官方AI8051U实验箱例程包里面串口超时中断的例子(64-DMA-UART串口与存储器数据自动收发)就有读取DMA_UR1R_DONE来判断接收了多少字节数据:
  1.         if(B_RX1_TimeOut)       //接收一串数据结束,产生超时中断
  2.         {
  3.             B_RX1_TimeOut = 0;
  4.             i = ((u16)DMA_UR1R_DONEH << 8) + DMA_UR1R_DONE; //获取已接收字节个数
  5.             TI = 0; //清除发送标志(DMA发送完不会自动清除标志位)
  6.             printf("cnt=%u\r\n",i);
  7.             DMA_UR1R_CR = 0;
  8.             i--;    //传输字节设置为(i-1)个数据
  9.             DMA_UR1T_AMT = (u8)i;       //设置传输总字节数(低8位):n+1
  10.             DMA_UR1T_AMTH = (u8)(i>>8); //设置传输总字节数(高8位):n+1
  11.             DMA_UR1T_CR = 0xc0;         //bit7 1:使能 UART1_DMA, bit6 1:开始 UART1_DMA 自动发送
  12.             DMA_UR1R_CR = 0xa1;         //bit7 1:使能 UART1_DMA, bit5 1:开始 UART1_DMA 自动接收, bit0 1:清除 FIFO
  13.         }
复制代码


实验箱例程包下载页面:https://www.stcai.com/syx
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:67
  • 最近打卡:2025-09-18 09:16:34

10

主题

46

回帖

456

积分

中级会员

积分
456
发表于 2025-9-10 13:01:06 | 显示全部楼层
乘风*** 发表于 2025-9-10 10:54
描述问题时最好先介绍你使用的是什么型号的单片机,不同单片机的一些功能有些差异。
以AI8051U为例介绍, ...

AI8051U-34K64,当DMA接收字节数据长度设置为0xff时,如果收到的数据是256个,i = ((u16)DMA_UR4R_DONEH << 8) + DMA_UR4R_DONE;这个值为0。官方例程也是同样的结果
截图202509101259133319.jpg
截图202509101259343923.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:517
  • 最近打卡:2025-09-18 12:36:09
已绑定手机

45

主题

2228

回帖

7828

积分

论坛元老

积分
7828
发表于 2025-9-10 16:55:35 | 显示全部楼层
DMA_XXXX_DONE寄存器在DMA处于空闲状态时会被硬件清零
当DMA完成指定长度数据的收发,或者DMA_XXXX_CR寄存器关闭DMA功能都会让DMA处于空闲状态。
使用超时中断接收不定长数据的话,可以将DMA_XXXX_AMT传输总字节数设置大一些,例如设置0xffff

    DMA_XXXX_AMT = 0xff;    //设置传输总字节数(低8位)
    DMA_XXXX_AMTH = 0xff;   //设置传输总字节数(高8位)

回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:67
  • 最近打卡:2025-09-18 09:16:34

10

主题

46

回帖

456

积分

中级会员

积分
456
发表于 6 天前 | 显示全部楼层
乘风*** 发表于 2025-9-10 16:55
DMA_XXXX_DONE寄存器在DMA处于空闲状态时会被硬件清零
当DMA完成指定长度数据的收发,或者DMA_XXXX_CR寄存 ...

好的
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-9-18 13:22 , Processed in 0.125100 second(s), 86 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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