DMA取出串口2收到的数据顺序错误
MCU:STC32G8K64实验目的:
用DMA接收串口2收到的数据
遇到的问题:
只是想尝试下使用DMA接收串口数据,本次改用DMA接收也是把原来的串口2接收部分改成DMA,能不能解决,没啥影响。但是,不解决吧,心里老有个事装着,所以才来提问的。
改成DMA接收之前串口收到的数据按照0,1,2,3,....,9的顺序读出,但是改用DMA接收串口2的数据后从xdata段读的顺序非得按照6,7,8,9,0,1,2,3,4,5这样读,才能对,不知道为什么?
其他疑问:
1. 假设,串口2每次会收到 10 个字节。那么,很显然,应该在xdata段为DMA申请10个字节的空间。可是,寄存器DMA_UR2R_AMT是什么情况,给它赋值9还是10?(实验中赋值为9)
2. UR2RIF什么时候会置位?是收到寄存器DMA_UR2R_AMT指定的字节数后产生中断还是每收到一个字节就中断一次?
3. 寄存器DMA_UR2R_DONE指示的是实际已收到的字节数吗?会累加吗?20240513发布的STC32G手册第30章12节的2个例程都没提到这个寄存器有什么用。
感谢先 :-)
感觉是指针的位置不正确,刚开始接收的时候不在起始地址 1.关于DMA_UR2R_AMT 寄存器用法
2.关于UR2RIF的描述
这里说的是UR2R_DMA接收完成的时候,指的是一次DMA传输完成。
你所说的接收一个字节就中断一次的是串口接收中断。
3.1关于这个DMA_UR2R_DONE寄存器,,我用STC8H8K进行测试的时候这个寄存器只有8位,一次DMA最多只能发送接收256个字节,, 当接受了256个字节时 读这个寄存器会变成0。
3.2 关于累计问题,我测试的时候不会累计,只会显示最近一次DMA时发送或接收的字节数。
3.3 官方的例程都是固定字节的发送和接收,根本不用考虑这个寄存器的数值,只能说写得很基础{:4_167:} 完成一次DMA接收后,关闭接收DMA,下次接收的数据重新存放在起始地址位置,否则下次接收数据继续往后面存放。
如设置:DMA_URxR_CR = 0x00;
可参考STC32G实验箱例程包,63-DMA-UART串口与存储器数据自动收发->串口4使用DMA中断模式与电脑收发不定长数据-软件超时
DMA_URxR_DONE是只读寄存器
任何时候将DMA_URxR_CR寄存器的最高位(ENURxR)位写零,
就可以对DMA_URxR_DONE进行清零
参考帖子:
https://www.stcaimcu.com/forum.p ... ptid=4675&pid=31660 _奶咖君_ 发表于 2024-7-22 09:51
2.关于UR2RIF的描述
这里说的是UR2R_DMA接收完成的时候,指的是一次DMA传输完成。
感谢指导 {:4_250:}
页:
[1]