beyond0426 发表于 2024-6-22 01:23:55

DMA_UR1R_DONE的问题

本帖最后由 beyond0426 于 2024-6-22 01:25 编辑

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

乘风飞扬 发表于 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
(出处: 国芯技术交流网站)

cyf1029 发表于 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。
这个请问是哪里的问题?

乘风飞扬 发表于 2025-9-10 10:54:49

cyf1029 发表于 2025-9-10 10:34
我遇到的问题比这个要特殊一些。

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

描述问题时最好先介绍你使用的是什么型号的单片机,不同单片机的一些功能有些差异。
以AI8051U为例介绍,官方AI8051U实验箱例程包里面串口超时中断的例子(64-DMA-UART串口与存储器数据自动收发)就有读取DMA_UR1R_DONE来判断接收了多少字节数据:
      if(B_RX1_TimeOut)       //接收一串数据结束,产生超时中断
      {
            B_RX1_TimeOut = 0;

            i = ((u16)DMA_UR1R_DONEH << 8) + DMA_UR1R_DONE; //获取已接收字节个数
            TI = 0; //清除发送标志(DMA发送完不会自动清除标志位)
            printf("cnt=%u\r\n",i);

            DMA_UR1R_CR = 0;
            i--;    //传输字节设置为(i-1)个数据
            DMA_UR1T_AMT = (u8)i;       //设置传输总字节数(低8位):n+1
            DMA_UR1T_AMTH = (u8)(i>>8); //设置传输总字节数(高8位):n+1

            DMA_UR1T_CR = 0xc0;         //bit7 1:使能 UART1_DMA, bit6 1:开始 UART1_DMA 自动发送
            DMA_UR1R_CR = 0xa1;         //bit7 1:使能 UART1_DMA, bit5 1:开始 UART1_DMA 自动接收, bit0 1:清除 FIFO
      }

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

cyf1029 发表于 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。官方例程也是同样的结果

乘风飞扬 发表于 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位)

cyf1029 发表于 2025-9-12 09:46:10

乘风飞扬 发表于 2025-9-10 16:55
DMA_XXXX_DONE寄存器在DMA处于空闲状态时会被硬件清零
当DMA完成指定长度数据的收发,或者DMA_XXXX_CR寄存 ...

好的
页: [1]
查看完整版本: DMA_UR1R_DONE的问题