xpz127 发表于 2026-3-20 16:42:01

发现DMA-DAC输出间隔有一个固有延时

发现stc32g144k-256的DMA-DAC输出间隔有一个固有延时,不知道是什么原因。
以40M主频,用MDA-DAC交替输出0和4095, 用逻辑分析仪捕捉其输出间隔

按理论计算当ITV设置50,100,200时,其输出间隔应该是1.25us, 2.5us, 5us.
但实际输出间隔约为1.55us, 2.8us, 5.3us,都比理论计算要高约0.3us。

忽略各种误差的情况下,可以得出结论:输出间隔比理论计算要高出约12个系统周期。
改变主频,上面论结论依然成立。




测试代码如下


#include "stc32g144k.h"
typedef unsigned short u16;
typedef unsigned char u8;
u16 xdata buf = {
        0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f,
        0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f,
        0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f,
        0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f,
        0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f,
       
        0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f,
        0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f,
        0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f,
        0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f,
        0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f, 0x0000, 0xff0f,
};

//40M主频
void main()
{
        EAXFR = 1; //扩展寄存器(XFR)访问使能
        WTST = 1;
      CKCON = 0; //提高访问XRAM速度
       
        P0M0 = 0;
        P0M1 = 0X21;        // P00 P05设置高阻
        PGA1_CR1 = 0X53;// 缓冲模式 PGA1正极端口选择DAC1O PGA1 负极端口选择P05 PGA1输出端口选择P00、
        PGA1_CR2 = 0X04;
       
        DMA_ARB_CFG = 0x00;//切换到xdata部分
        DMA_DAC1_TXAH = (u8)((u16)buf >> 8);   //地坛
        DMA_DAC1_TXAL = (u8)((u16)buf);
        DMA_DAC1_ITVH = 0;                                                //间隔
        DMA_DAC1_ITVL = 50;                                                //25ns * 50 = 1.25us
        //DMA_DAC1_ITVL = 100;                                        //25ns * 100 = 2.5us
        //DMA_DAC1_ITVL = 200;                                        //25ns * 200 = 5.0us
        DMA_DAC1_AMTH = 0;                                                //传输数量
        DMA_DAC1_AMT= 99;
        DMA_DAC1_CFG = 0X03;                                        //数量总线最优先级。
       
        DAC1_DIV = 0;
        DAC1_CR = 0XB1;
        DMA_DAC1_CR = 0XC0;                                                //使能并触发               
        while(1)
        {
                if (DMA_DAC1_STA & 0X01)
                {
                        DMA_DAC1_CR = 0XC0;                                                //使能并触发       
                        DMA_DAC1_STA = 0;                       
                }               
                NOP4();
        }
}










_奶咖君_ 发表于 2026-3-20 17:16:47


DMA SPI 发送的时候也会有一样问题。。。据梁工说 会有大概18个时钟周期。。可能是和DMA某些运行逻辑有关。

狂热主宰 发表于 2026-3-20 23:27:10

数据处理和搬运需要时间
比如方波90°也只在理论上

网老四 发表于 2026-3-21 10:54:34

早期的DMA控制器,总线共享,DMA控制器是等总线空闲时候再进行数据传输,传输过程中CPU又使用总线时DMA暂停运行,等总线空闲再继续传输,所以DMA的传输时间不是固定的.
现在的处理器可能有多套总线,如果DMA控制器传输数据使用专用的总线,数据传输时间就是固定的.但DMA参数修改后需要参数装载时间.所以也不能仅仅按照数据长度计算传输时间.
页: [1]
查看完整版本: 发现DMA-DAC输出间隔有一个固有延时