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/MSP432P401R:使用CCS调试断点计数测量MSP432机器周期的问题

Guru**** 2604225 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/640291/ccs-msp432p401r-the-problem-of-measuring-msp432-machine-cycles-using-ccs-debug-breakpoint-count

部件号:MSP432P401R

工具/软件:Code Composer Studio

大家好:

我需要我来获取程序的确切时间。所以在CCS调试中使用计数时钟周期的方法。  我对1000个时钟周期使用__DELAY周期()精确延迟程序。

然后读取count的值以查看其是否匹配。程序的断点和CCS调试断点计数的设置如下图所示。

运行程序后,程序的两个测量断点之间的时钟周期不是1000,而是2987。如下图所示

这是我的疑问,我准确延迟了1000个时钟周期,为什么CCS断点计数计算时钟周期是2987?

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

    Alex824,

    您可以尝试以下代码吗?

    /* DriverLib包括*/
    #include <ti/devices/msp432p4xx/driverlib/driverlib.h>/*
    
    Standard包括*/
    #include <stdint.h>
    #include <stdbool.h>
    
    int main(void){
    
    /*停止监视*/
    MAP_WDT_A_HoldTimer();
    
    Int MCLK;
    
    同时(1)
    {
    __DELAY周期(1000);
    MCLK = CS_getMCLK();
    }
    }
    

    我在__delay_cycles(1000)处设置了断点;在MCLK = CS_getMCLK()处设置了断点;执行了计数事件,在运行时设置重置计数。 已运行至__delay_cycles(1000);再次运行,并收到以下计数。

    如果这确实有效,请告诉我。

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

    非常感谢您的回复。

    1.我尝试了三个程序,第一个程序与您的程序完全相同。 结果与您相同,延迟1000个时钟周期,计数也为999。

    2. 在第二个项目中,我使用DCO,将MCLK提高到48M。 1000个时钟周期后,计数为1996。程序和结果如下所示。

     

    /* DriverLib包括*/
    
    #include <ti/devices/msp432p4xx/driverlib/driverlib.h>/*
    
    Standard包括*/
    #include <stdint.h>
    #include <stdbool.h>
    
    int main(void){
    
    Int MCLK;
    
    /*停止监视*/
    MAP_WDT_A_HoldTimer();
    MAP_Interrupt_DisableMaster();
    //![简单FPU配置]
    //为DCO频率计算启用FPU
    MAP_FPU_enableModule();
    
    MAP_PCM_setCoreVoltageLevel (PCM_VCORE1);
    MAP_FlashCTL_setWaitState(FLASH_BANK0, 2);
    MAP_FlashCTL_setWaitState(FLASH_Bank1,2);
    
    //将DCO频率设置为标准48MHz
    //初始化时钟系统
    MAP_CS_setDCOCenteredFrequency (CS_DCO_Frequency_48);
    
    MAP_CS_INITClockSignal (CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK分隔符_1);
    
    
    同时(1)
    {
    __DELAY周期(1000);
    MCLK = CS_getMCLK();
    }
    }
    

    3.在第三个程序中,我添加了SMCLK,1000个时钟周期后的计数是2987。程序和结果如下

    /* DriverLib包括*/
    
    #include <ti/devices/msp432p4xx/driverlib/driverlib.h>/*
    
    Standard包括*/
    #include <stdint.h>
    #include <stdbool.h>
    
    int main(void){
    
    Int MCLK;
    
    /*停止监视*/
    MAP_WDT_A_HoldTimer();
    MAP_Interrupt_DisableMaster();
    //![简单FPU配置]
    //为DCO频率计算启用FPU
    MAP_FPU_enableModule();
    
    MAP_PCM_setCoreVoltageLevel (PCM_VCORE1);
    MAP_FlashCTL_setWaitState(FLASH_BANK0, 2);
    MAP_FlashCTL_setWaitState(FLASH_Bank1,2);
    
    //将DCO频率设置为标准48MHz
    //初始化时钟系统
    MAP_CS_setDCOCenteredFrequency (CS_DCO_Frequency_48);
    
    MAP_CS_INITClockSignal (CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK分隔符_1);
    MAP_CS_INITClockSignal (CS_SMCLK,CS_DCOCLK_SELECT,CS_CLock_DICROLOR_2);
    
    同时(1)
    {
    __DELAY周期(1000);
    MCLK = CS_getMCLK();
    }
    } 


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

    我可以确认我也看到了这种行为。 我将对此展开调查,看看我们能做些什么。 同时,正如我一直在使用它一样,在许多情况下,它似乎是精确到24MHz时钟操作的。 我的建议是使用最高24 MHz的计时器或设置MCLK提供的计时器来计算时钟周期,在需要时启动计数器,在需要时停止计数器,同时考虑溢出。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Evan您好:
    非常感谢您验证我的实验,如果您稍后找到原因或解决方案,请告诉我。 我将非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Evan您好:
    我找到了偏差的原因。 原因是我把闪存等待时间设置为2

    MAP_PCM_setCoreVoltageLevel (PCM_VCORE1);
    MAP_FlashCTL_setWaitState(FLASH_BANK0, 2);
    MAP_FlashCTL_setWaitState(FLASH_Bank1,2);

    我将闪存等待时间更改为1,然后用计数,计算机器循环偏差已大大减少。
    __DELAY周期(1000);-->计数=1333

    MAP_FlashCTL_setWaitState(FLASH_BANK0, 1);
    MAP_FlashCTL_setWaitState(FLASH_Bank1, 1);