CCS之代码运行时间

方法一:使用CCS软件的clock功能。

使用步骤:首先打开clock功能,Run->Clock>Enable;

                  左下角有个小图标出现,双击可以清零。

                  在要测试的代码上打两个断点,分别运行到两个断点处,就可以看到运行的周期了。

                  使用公式 time = 1/CLK可以算得程序运行时间。(CLK为时钟主频,28335是                                   150M,28377是200M;或者28335直接周期*6.67ns,28377直接周期*5ns)。

                   例如时钟周期为150MHz,测得数据为1000,则代码运行时间

                   time = 1000 *  (1/150,000,000) = 6.67 μs。

 方法二:在测试程序的开始时和结束时加一个GPIO口,开始让其置位,结束让其复位,用示波器量波形时间。


如何验证定时器中断时间是否准确? 

1、在中断程序中,翻转一个GPIO口的输出电平,用示波器观察波形。
2、还有一种方法就是在中断程序里第一条指令打个断点,使能ccs的clock功能,看每进一次中断用了多少clock。
 

实测数据:28335开发板为例

定时器设置为 ConfigCpuTimer(&CpuTimer0, 150, 1000000);   //1S,在定时器中断打断点,进一次中断周期数为150_000_000,计算可得:150_000_000*(1/150_000_000) = 1s。

PWM中断:TBPRD = 100,f = 375kHz,T = 2.67us,2.67us/6.67ns=400 ,实测394,401,399;

                    TBPRD = 50, f = 750kHz,T =1.33us,1.33us/6.67ns=200,第一次实测194,进第80次中断时,实测为15894,与理论值200*80=16000相差106个系统时钟周期,约707ns,随着程序运行,偏差会越来越大。到第1373862次中断,即1.8秒左右,实测系统周期数274779506,理论274772400,偏差7106个系统时钟周期,约7106*6.67ns=47us。


 

测试:28335的PWM中断TBPRD = 25时 ,75M/2 = 37.5M,37.5M/25=1.5M,即中断频率

f = 1.5M,系统时钟为,与理论值150_000_000不符,每秒比实际慢8992542*6.67ns=0.06s。(不可用,在中断时间内执行不完中断程序,比如中断周期800ns,中断程序所需时间700ns或更长


PWM中断空程序,执行一次需要12个系统时钟周期,约12*6.67ns = 80ns;

TBPRB = 15, f= 2,5M, T =400ns,程序所需时间36*6.67ns = 240ns,正常进中断;

TBPRB = 10, f= 3.75M, T =266ns,程序所需时间36*6.67ns = 240ns,中断实际用时210_000_000*6.67ns = 1.4s;程序执行不完,程序用时和T太接近了,可能还有其他芯片内置程序,需预留时间。

程序运行时间缩短为180ns,还是执行不完,系统周期由210_000_000缩短为176_250_032。

TBPRB = 12, f= 3.125M, T =320ns,程序所需时间27*6.67ns = 180ns,程序正常执行;

TBPRB = 11, f= 3.41M, T =293ns,程序所需时间27*6.67ns = 180ns,中断实际用时160_227_327*6.67ns = 1.069s;程序执行不完,程序用时和T太接近了,可能还有其他芯片内置程序,需预留时间。

PWM配置程序:

void ConfigureEPWM()
{
   EALLOW;
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;         //禁止EPWM时钟
//   SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1;  // ePWM6

//TBPRD=100   f=375k   T=2.67us   2.67us/6.67ns=400
//TBPRD=50    f=750k   T=1.33us   1.33us/6.67ns=200
   EPwm1Regs.TBPRD = 25;                        // 频率为10kHz,周期是100us   1.875M
   EPwm1Regs.TBPHS.half.TBPHS = 0x0000;           // 相位为0
   EPwm1Regs.TBCTR = 0x0000;                      // 清除计数器的值
   EPwm1Regs.TBSTS.all = 0;

   // Setup TBCLK
   EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 增减计数
   EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;       // 高速基准时钟分频
   EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;          // 基准时钟分频      TBCLK=150/2*1=75M

   EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_IMMEDIATE;    //CMPA寄存器采用直接模式
   EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_IMMEDIATE;    //CMPB寄存器采用直接模式

   // Setup compare
   EPwm1Regs.CMPA.half.CMPA = 0;        //初始占空比为50%
   EPwm1Regs.CMPB = 0;

   // Set actions
   EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;       //当CTR=CMPA且增计数时,EPWMA输出高电平
   EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;     //当CTR=CMPA且减计数时,EPWMA输出低电平
   EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;       //当CTR=CMPA且增计数时,EPWMB输出高电平
   EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR;     //当CTR=CMPA且减计数时,EPWMB输出低电平
   EPwm1Regs.AQSFRC.all = 0;                //动作限定软件强制寄存器
   EPwm1Regs.AQCSFRC.all = 0;               //动作限定软件连续强制寄存器

    //Active Low PWMs - Setup Deadband
   EPwm1Regs.DBCTL.bit.OUT_MODE = DBB_ALL;     //使能上升沿和下降沿
   EPwm1Regs.DBCTL.bit.IN_MODE = DBB_ENABLE;   //EPWMA作为上升沿延时,EPWMB作为下降沿延时
   EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;   //EPWMB反转极性
   EPwm1Regs.DBRED = 75;                       //死区时间1us
   EPwm1Regs.DBFED = 75;

   // Interrupt where we will change the Deadband
   EPwm1Regs.ETSEL.bit.INTEN = 1;                // EPWM中断使能
   EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;      // 中断事件:TBCTR=TBPRD
   EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;           // 每发生一次事件,产生一次中断

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
   EDIS;

}

PWM中断程序:

interrupt void EPWM_INT(void)
{
    state_cnt++;
    if(state_cnt == 1500000)   //1S计时
    {
        min_cnt++;
        state_cnt = 0;
    }

    if(min_cnt == 20)   //20S计时
    {
        min_cnt = 0;
    }


    EPwm1Regs.ETCLR.bit.INT = 1;             //清除中断标志位
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;  //响应同组中断

}

PWM中断空程序,需要时间80ns,预留150ns,150ns+80ns = 230ns,用200ns算,

极限:TBCTR = 8,  f = 4.687M,T = 213ns。(实际使用没有意义)

结论:

  • 程序运行时间与T相差最少为150ns,才能保证程序的正常运行。
  • DSP28335空程序极限时钟频率4.687M。

 妙啊!!!

  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CCS(Code Composer Studio)中,你可以使用其自带的Graph功能来实时查看数据的变化。首先,你需要在程序中插入一些代码来将你想要查看的数据输出到Graph中。你可以使用CCS提供的API函数来实现这一功能。例如,你可以使用`printf`函数将数据输出到终端,然后在CCS中启动调试会话并打开终端视图来查看数据的输出。另外,你还可以使用CCS的Graph功能来绘制数据的曲线图或频谱图。你可以使用CCS提供的API函数来配置Graph,并将数据传递给Graph进行绘制。通过这种方式,你可以实时地观察数据的变化。希望这个回答对你有帮助!\[1\] #### 引用[.reference_title] - *1* [关于CCS软件的Graph功能使用详解](https://blog.csdn.net/HJ199404182515/article/details/60467027)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [CCS代码运行时间](https://blog.csdn.net/weixin_67465484/article/details/127975694)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值