DMA_UR1R_DONE的问题
本帖最后由 beyond0426 于 2024-6-22 01:25 编辑芯片是STC8H系列,为什么DMA_UR1R_DONE读的数一直是0?请教,如何读取DMA_UR1R_DONE的流程?
论坛搜索 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
(出处: 国芯技术交流网站)
乘风飞扬 发表于 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。
这个请问是哪里的问题?
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 乘风飞扬 发表于 2025-9-10 10:54
描述问题时最好先介绍你使用的是什么型号的单片机,不同单片机的一些功能有些差异。
以AI8051U为例介绍, ...
AI8051U-34K64,当DMA接收字节数据长度设置为0xff时,如果收到的数据是256个,i = ((u16)DMA_UR4R_DONEH << 8) + DMA_UR4R_DONE;这个值为0。官方例程也是同样的结果 DMA_XXXX_DONE寄存器在DMA处于空闲状态时会被硬件清零
当DMA完成指定长度数据的收发,或者DMA_XXXX_CR寄存器关闭DMA功能都会让DMA处于空闲状态。
使用超时中断接收不定长数据的话,可以将DMA_XXXX_AMT传输总字节数设置大一些,例如设置0xffff
DMA_XXXX_AMT = 0xff; //设置传输总字节数(低8位)
DMA_XXXX_AMTH = 0xff; //设置传输总字节数(高8位)
乘风飞扬 发表于 2025-9-10 16:55
DMA_XXXX_DONE寄存器在DMA处于空闲状态时会被硬件清零
当DMA完成指定长度数据的收发,或者DMA_XXXX_CR寄存 ...
好的
页:
[1]