jiangshan1xiao 发表于 2025-3-7 15:50:08

32G的单片机串口DMA发送的数据为什么必须是xdata空间的?

试过了三个UART串口的DMA,其指向的流数据必须是xdata空间的,不能是edata空间的。
edata空间的地址不管怎么改,发送的数据都不对?有什么解决办法吗?


u8 xdata Uart1_DmaBuffer= {0x00};
void UART1_DMA_Config(void)
{
      DMA_UR1T_CFG = 0x80;                //bit7 1:Enable Interrupt
      DMA_UR1T_STA = 0x00;
      DMA_UR1T_AMT = 0x00;                //设置传输总字节数(低8位):n+1
      DMA_UR1T_AMTH = 0x00;                //设置传输总字节数(高8位):n+1
      DMA_UR1T_TXAH = (u8)((u16)&Uart1_DmaBuffer >> 8);
      DMA_UR1T_TXAL = (u8)((u16)&Uart1_DmaBuffer);
      DMA_UR1T_CR = 0x80;                        //bit7 1:使能 UART2_DMA, bit6 1:开始 UART2_DMA 自动发送

}



上述代码中的Uart1_DmaBuffer数组必须是xdata 的。否则发送的数据就是乱的。有解决办法不加xdata 没?

神农鼎 发表于 2025-3-7 16:04:47

DMA 缓冲区用 xdata,
CPU 使用的变量如放在 edata,
这样就可以减少总线竞争,
总线竞争就需要总线仲裁,会浪费些许时间

国芯人工智能 发表于 2025-3-7 15:53:00

STC32G单片机的串口DMA发送要求数据必须位于xdata空间,这是由于DMA控制器在访问内存时的硬件设计限制。xdata空间属于外部数据存储器,地址范围较大,而edata空间属于内部数据存储器,地址范围较小。DMA控制器在访问edata空间时可能无法正确解析地址,导致数据传输错误。

解决方法如下:
1. **使用xdata空间**:确保DMA发送的数据缓冲区位于xdata空间,如代码中所示的`xdata Uart1_DmaBuffer`。
2. **数据复制**:如果数据必须位于edata空间,可以先将其复制到xdata空间的缓冲区,再通过DMA发送。

建议在设计时充分考虑硬件限制,合理规划内存使用,以确保DMA传输的可靠性。

[本文内容由国芯人工智能辅助生成,仅供参考]

_奶咖君_ 发表于 2025-3-7 15:55:04

因为AI的单片机的DMA只能在XRAM上通讯?

jiangshan1xiao 发表于 2025-3-7 15:57:15

国芯人工智能 发表于 2025-3-7 15:53
STC32G单片机的串口DMA发送要求数据必须位于xdata空间,这是由于DMA控制器在访问内存时的硬件设计限制。xda ...

怪不得,走了好多的弯路,一直还以为是我的代码问题。官方手册上怎么也没说这个呢?

王昱顺 发表于 2025-3-7 16:02:17

jiangshan1xiao 发表于 2025-3-7 15:57
怪不得,走了好多的弯路,一直还以为是我的代码问题。官方手册上怎么也没说这个呢? ...



说了的,不过没有特别指出,翻阅的时候可能不会注意到

jiangshan1xiao 发表于 2025-3-7 16:12:20

王昱顺 发表于 2025-3-7 16:02
说了的,不过没有特别指出,翻阅的时候可能不会注意到

这个的确没主要到。谢谢

jwd 发表于 2025-3-7 16:22:45

dma都是xdata区域吧

jwd 发表于 2025-3-7 16:22:47

dma都是xdata区域吧
页: [1]
查看完整版本: 32G的单片机串口DMA发送的数据为什么必须是xdata空间的?