找回密码
 立即注册
查看: 69|回复: 3

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2026-03-20 16:42:01

7

主题

13

回帖

413

积分

中级会员

积分
413
发表于 2026-3-20 16:42:01 | 显示全部楼层 |阅读模式
发现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个系统周期。
改变主频,上面论结论依然成立。

截图202603201613333695.jpg
截图202603201616239046.jpg
截图202603201617064094.jpg
测试代码如下


#include "stc32g144k.h"
typedef unsigned short u16;
typedef unsigned char u8;
u16 xdata buf[200] = {
        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();
        }
}


dma-dac-test.rar (61.19 KB, 下载次数: 0)







回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:652
  • 最近打卡:2026-04-03 16:45:15

33

主题

2928

回帖

6601

积分

论坛元老

积分
6601
发表于 2026-3-20 17:16:47 | 显示全部楼层
截图202603201714345129.jpg
DMA SPI 发送的时候也会有一样问题。。。据梁工说 会有大概18个时钟周期。。可能是和DMA某些运行逻辑有关。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:209
  • 最近打卡:2026-04-04 14:50:05
已绑定手机

15

主题

287

回帖

1498

积分

金牌会员

DIY玩家

积分
1498
发表于 2026-3-20 23:27:10 | 显示全部楼层
数据处理和搬运需要时间
比如方波90°也只在理论上
真正的学徒往往怀着大师的心
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:683
  • 最近打卡:2026-04-04 02:12:33

9

主题

622

回帖

4340

积分

论坛元老

积分
4340
发表于 2026-3-21 10:54:34 | 显示全部楼层
早期的DMA控制器,总线共享,DMA控制器是等总线空闲时候再进行数据传输,传输过程中CPU又使用总线时DMA暂停运行,等总线空闲再继续传输,所以DMA的传输时间不是固定的.
现在的处理器可能有多套总线,如果DMA控制器传输数据使用专用的总线,数据传输时间就是固定的.但DMA参数修改后需要参数装载时间.所以也不能仅仅按照数据长度计算传输时间.
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-4 16:05 , Processed in 0.106713 second(s), 54 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表