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.

[参考译文] MSP430F5418A:将代码从 IAR 迁移到 CCS -时序问题...

Guru**** 2510095 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/978724/msp430f5418a-migrated-code-from-iar-to-ccs---timing-issues

器件型号:MSP430F5418A

有人遇到过这种情况吗?  

我将代码从 IAR (MSP430工作平台7.12)迁移到 CCS (10.1.1 + MSP430 driverlib 2.91)-并且计时器速度要慢得多、减慢20倍。

这是否有任何已知原因? 这一点是否已记录在案?

谢谢、

梅希

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

    您好、Mechi、

    感谢您在论坛上发帖。 众所周知、CCS 比 IAR 更快、这只是因为 CCS 基于 Eclipse、比 IAR 的 IDE 慢。  

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

    我仍然不明白。

    MSP430是相同的、因此差异必须是基础库函数或其他内容、因为在 CCS 中编译相同的精确源文件并使用范围后、计时器中断(每毫秒一次)会有所不同。

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

    您好、Mechi、

    很抱歉、您提到计时器实际上慢了20倍、因此与 IDE 无关。  

    您能否发送代码实现以及要开始使用的时钟系统和计时器寄存器的屏幕截图?

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

    谢谢 Aaron。

    我返回到一些使用 UCS 的示例程序、特别是  msp430x54x_UCS_9.c 、我意识到缺少一些设置。 (可能在 IAR 中不需要它们? 默认?)

    现在代码运行得非常完美-在这里它低于(更改为 TIMERB0):

    #define TIMEDIVISION 16128 //*用于时间中断设置:1毫秒周期- 16.128 MHz 时钟。*/
    
    /注释 \
    timehandler():时间中断处理程序。 1msec 中断模块
    \********* /
    #pragma vector=TIMER0_B0_vector
    __interrupt void timehandler (void)
    {
    isRAM_TestInterruptRedrived = 1;//向 RAM 测试指示调用了中断。
    
    //更新时间
    TIK += 1;
    msec++;//
    
    如果(TIK >= 1000)则更新毫秒计数器//秒计数器是否需要更新?
    {
    sec++;//更新秒计数器。
    TIK -= 1000;
    }
    
    if (msec & 0x01)//对于范围
    {
    P2OUT |= 0x01;//切换每个 TIK
    }
    否则
    {
    P2OUT &=~0x01;//切换每个 TIK
    }
    
    TB0CCR0 += TIIMEDIVISION;//将偏移添加到 CCR0 (比较寄存器)
    }//时间处理程序的*//
    
    
    
    
    ******* \
    * InitTimer:初始化计时器。*
    \******** /
    void InitTimer()
    {
    
    P7SEL |= 0x03; //端口选择 XT1
    UCSCTL3 |= SELREF_2; // FLL Ref = REFO
    UCSCTL6 &&~XT1OFF; //在
    UCSCTL6上设置 XT1 |= XT1DRIVE_3 + XTS; //开始时的最大驱动强度。 在高频率模式中启用 XT1。
    
    
    //循环直到 XT1、XT2和 DCO 稳定
    执行
    {
    UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
    //清除 XT2、XT1、DCO 故障标志
    SFRIFG1 &=~OFIFG; //清除故障标志
    } while (SFRIFG1&OFIFG); //测试振荡器故障标志
    
    //UCSCTL6 &=~XT1DRIVE_2; //驱动强度减小。
    
    UCSCTL4 = SELA_XT1CLK + SELESS_XT1CLK + SELM_XT1CLK;//从 xt1中选择 Aclkm MCLK 和 Smclk。
    
    UCSCTL5 = DIVS_5;//将 SMCLK 除以32,SMCLK 用于看门狗。- 65ms 间隔。
    
    
    //初始化定时器 B0
    TB0CTL = tassel_1 + MC_2;// 0x120 ACLK、连续运行
    TB0CCTL0 = CCIE; // CCR0 (比较控制寄存器)中断使能
    TB0CCR0 = TIMEDIVISION;//设置第一次调用计时器中断的时间
    
    SEC = 0;
    msec = 0;
    TIK = 0;
    InitTimer 的}/*