This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F28335:如何测量每个循环之间经过的时间?

Guru**** 2535750 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/612230/ccs-tms320f28335-how-can-i-measure-the-elapsed-time-between-each-loop

器件型号:TMS320F28335
Thread 中讨论的其他器件:controlSUITEC2000WARE

工具/软件:Code Composer Studio

你好

我正在尝试测量每次运行代码之间经过的时间。 我查看了示例"CpuTimer"、但我不知道我是否可以使用此示例、因为我不想使用中断、而只想测量经过的时间。 我应该如何测量它? 此外、我不想只查看经过的时间。 我希望能够在我的代码中使用它。  例如、在第一个"t=0"时、一个周期之后将为"1微秒"。 我希望能够在我的代码中使用这一次。

在搜索论坛时、我看到一篇文章说我们可以使用 eCAP 执行此操作、但我不知道如何操作。 如果可能的话、您能解释一下还是举一个例子?

最棒的

ATA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 ATA、

    为了测量代码内的已用时间并在程序中使用这些时间、您可以选择使用 CPU 计时器和 ECAP。

    1) 1) CPU 定时器:

    正确、您将不会为此方法使用中断。 如果您不使用 controlSUITE 或 C2000ware 中的 CPU 定时器示例、则可以删除与中断相关的任何内容("InitPieCtrl();"、"InitPieVectTable();"等)。 您将初始化并配置 CPU 计时器、我建议使周期尽可能大(0xFFFFFFFF)。 然后、在您要测量的代码部分的开头重置/启动计时器、将初始 CPU 计时器值保存到一个变量中、然后在程序部分之后将 CPU 计时器值保存到另一个变量中。 这些值的差异将是以时钟周期为单位的经过时间(如果需要秒/分钟、则必须进行转换)。 我将在下面提供一个示例...

    void StartTimer (void)
    {
    cpuTime1 = 0;
    
    EALLOW;
    CpuTimer2Regs.TCR.bit.TRB = 1; //将 CPU 定时器重置为周期值
    CpuTimer2Regs.TCR.bit.TSS = 0; //启动或复位 CPU 定时器2.
    cpuTime1 = CpuTimer2Regs.TIM.all; //在代码前获取 CPU 定时器2的值
    EDIS;
    }
    
    void StopTimer (void)
    {
    EALLOW;
    cpuTime2 = CpuTimer2Regs.TIM.all;//获取代码后 CPU 定时器2的值
    cpuTime = cpuTime1 - cpuTime2; //使用 cpuTimer2计算时间
    CpuTimer2Regs.TCR.bit.TSS = 1; //启动或复位 CPU 定时器2.
    EDIS;
    } 

    2) 2) ECAP:

    ECAP 方法的工作原理类似于使用示波器测量脉宽。 因此、对于您的情况、就像在代码部分启动时将 GPIO 引脚设置为高电平、在代码完成后将其恢复为低电平、然后测量所用时间的脉宽。 您可以将设置为高电平的输出引脚发送到板上的 ECAP 输入引脚、以完成此操作。 如果您想使用此方法、我相信 controlSUITE 中的 ECAP_CAPTURE_PWM 示例将是一个很好的起点。

    下面是示例...

    GpioDataRegs.GPADD.bit.GPIO1 = 1;//开始计时、ECAP
    //此处要定时的代码...
    GpioDataRegs.GPADAT.bit.GPIO1 = 0;//停止计时、ECAP
    ECAP_TIME = ECap1Regs.CAP2; //使用 ECap2计算时间(将以时钟周期为单位) 

    您可以将这些寄存器中的任何一个保存到变量中、我建议它们是 uint32。 这两种方法将为您提供几乎相同的计时。

    希望这对您有所帮助、如果您有任何疑问、请告诉我。

    最棒的

    Kevin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kevin:

    非常感谢您的帮助。

    我修改了"CpuTimer"的示例代码、只是为了根据您的建议测量经过的时间。 您能否查看此代码是否正确?

    #include "DSP28x_Project.h" //器件头文件和示例包括文件
    
    //
    //函数原型语句
    //
    
    
    void StartTimer (void);
    void StopTimer (void);
    double mytime.seconds;
    
    //
    // Main
    //
    void main (void)
    {
    
    InitSysCtrl();
    
    
    Dint;
    
    
    
    IER = 0x0000;
    IFR = 0x0000;
    
    
    InitCpuTimer();//对于此示例,只初始化 CPU 计时器
    
    
    StartTimer();
    //我的代码;
    StopTimer();
    mytime.seconds=cpuTime*(1/150000000);
    
    }
    
    空 StartTimer (空)
    {
    uint32 cpuTime1 = 0;
    
    EALLOW;
    CpuTimer2Regs.TCR.bit.TRB = 1; //将 CPU 定时器重置为周期值
    CpuTimer2Regs.TCR.bit.TSS = 0; //启动或复位 CPU 定时器2.
    cpuTime1 = CpuTimer2Regs.TIM.all; //在代码前获取 CPU 定时器2的值
    EDIS;
    }
    
    空 StopTimer (空)
    {
    uint32 cpuTime2=0;
    EALLOW;
    cpuTime2 = CpuTimer2Regs.TIM.all;//获取代码后 CPU 定时器2的值
    cpuTime = cpuTime2 - cpuTime1; //使用 cpuTimer2计算时间
    CpuTimer2Regs.TCR.bit.TSS = 1; //启动或复位 CPU 定时器2.
    EDIS;
    }
    

    最棒的

    ATA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ATA、

    看起来非常接近。 我认为您唯一需要做的就是使 cpuTime1、cpuTime2和 cpuTime 全局变量。

    您只需运行一个 for 循环来代替"/my code"、即可测试您的代码。

    int i = 0;

    for (i=0;i < 90000;i++){}

    希望它对您有所帮助、
    Kevin