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.

[参考译文] MSP430FR2355:代码似乎仅在我运行 CCS 和调试时运行??

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1167975/msp430fr2355-code-only-seems-to-run-when-i-run-ccs-and-debug

器件型号:MSP430FR2355

您好...

我有一个 MSP430FR2355开发板....

如果我从 Resource Explorer 导入 msp430fr235x_CS_03.c、并运行代码并在 P1.0上监控 SMCLK、我会看到16MHz 的频率符合预期。  当我停止调试器时,时钟会继续...如果我给板加电,时钟会返回...一切都很好!

现在、如果我将以下内容加载到电路板上

SysClk_Handle_t sysClk;

#ifdef CLK_TEST
GPIO_RegDef_t *sm_a_clk_test = PORT1, *mclk_test = PORT3;
#endif

int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	
    /*
     * System Clock / ACLK Configuration
     */
    sysClk.pSysClk = CLOCK;
    sysClk.SysClk_Config.Clock_MCLK = MCLK_16MHZ;
    sysClk.SysClk_Config.FLL_Source = FLL_EXT_XTL;
    sysClk.SysClk_Config.Clock_SMCLKDiv = SMCLK_DIVIDE1;
    init_Clock(&sysClk);

#ifdef CLK_TEST
    sm_a_clk_test->DIR |= BIT1 | BIT0;
    sm_a_clk_test->SEL[1] |= BIT1 | BIT0;
    mclk_test->DIR |= BIT0;
    mclk_test->SEL[0] |= BIT0;
#endif

    while(1);
}

然后点击 Play 时钟会按预期上升到16MHz,但是当我停止调试器时,时钟会平稳下来并停止...如果我重新为电路板供电,时钟就永远不会再次上升。

现在有趣的部分...如果我用不起作用的代码重新刷新它、时钟永远不会出现...我首先必须用  msp430fr235x_CS_03.c 重新刷新它并运行它。  如果我执行此操作、则重新加载代码并运行、我会看到时钟。

这告诉我什么?????  是否在我的项目上设置属性?????  似乎不是代码、因为重新刷写所谓的坏代码时、我运行时钟时应允许时钟显示、而无需重新刷写演示代码???

这里的所有帮助都很好、因为我不知道该怎么想

谢谢

Steve

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

    ...更多信息

    我已经开始比较  msp430fr235x_CS_05.c,它使用 XT1CLK 和更多符合我的需求的东西。。。。。

    .._05代码时钟寄存器:

    我的非工作代码时钟寄存器(CSCTL0除外(暂停时需要使用)它们看起来都是一样的):

    此处是用于设置时钟的驱动程序代码、供参考:

    void init_Clock(SysClk_Handle_t *clkConfig)
    {
        GPIO_RegDef_t *p_clkXtal = PORT2;
    
        /*
         * depending on frequency
         * select wait states
         */
        if (clkConfig->SysClk_Config.Clock_MCLK > MCLK_8MHZ)
        {
            if (clkConfig->SysClk_Config.Clock_MCLK > MCLK_16MHZ)
                FRCTL0 = FRCTLPW | NWAITS_2;
            else
                FRCTL0 = FRCTLPW | NWAITS_1;
        }
        else
        {
            FRCTL0 = FRCTLPW;
        }
        p_clkXtal->SEL[1] = (uint16_t)((BIT6 | BIT7) << 8);
    
        if (clkConfig->SysClk_Config.FLL_Source == FLL_EXT_XTL)
        {
            do
            {
                clkConfig->pSysClk->CSCTL[7] &= ~(XT1OFFG | DCOFFG);  //Clear XT1 and DCO fault flag
                SFRIFG1 &= ~OFIFG;
            } while (SFRIFG1 & OFIFG);                   // Test oscillator fault flag
        }
    
        __bis_SR_register(SCG0);  // disable FLL
        if  (clkConfig->SysClk_Config.FLL_Source == FLL_EXT_XTL)
            //set external low freq crystal
            clkConfig->pSysClk->CSCTL[3] =  SELREF__XT1CLK;
        else
        {
            //set REFO high power > 8Mhz
            if (clkConfig->SysClk_Config.Clock_MCLK > MCLK_8MHZ)
                clkConfig->pSysClk->CSCTL[3] = SELREF__REFOCLK;
            else
            {
                //set REFO low power < 8Mhz
                clkConfig->pSysClk->CSCTL[3] = SELREF__REFOCLK | REFOLP;
                while(clkConfig->pSysClk->CSCTL[7] & REFOREADY == 0);
            }
        }
    
        switch (clkConfig->SysClk_Config.Clock_MCLK)
        {
        case MCLK_2MHZ:
            clkConfig->pSysClk->CSCTL[1] = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_1;
            clkConfig->pSysClk->CSCTL[2] = FLLD_0 + 60;
            break;
        case MCLK_4MHZ:
            clkConfig->pSysClk->CSCTL[1] = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_2;
            clkConfig->pSysClk->CSCTL[2] = FLLD_0 + 121;
            break;
        case MCLK_8MHZ:
            clkConfig->pSysClk->CSCTL[1] = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_3;
            clkConfig->pSysClk->CSCTL[2] = FLLD_0 + 243;
            break;
        case MCLK_12MHZ:
            clkConfig->pSysClk->CSCTL[1] = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_4;
            clkConfig->pSysClk->CSCTL[2] = FLLD_0 + 365;
            break;
        case MCLK_16MHZ:
            clkConfig->pSysClk->CSCTL[1] = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_5;
            clkConfig->pSysClk->CSCTL[2] = FLLD_0 + 487;
            break;
        case MCLK_20MHZ:
            clkConfig->pSysClk->CSCTL[1] = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_6;
            clkConfig->pSysClk->CSCTL[2] = FLLD_0 + 609;
            break;
        case MCLK_24MHZ:
            clkConfig->pSysClk->CSCTL[1] = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_7;
            clkConfig->pSysClk->CSCTL[2] = FLLD_0 + 731;
            break;
        default:
            break;
        }
        __delay_cycles(3);
        __bic_SR_register(SCG0);                     // enable FLL
    
        Software_Trim();
        while(clkConfig->pSysClk->CSCTL[7] & (FLLUNLOCK0 | FLLUNLOCK1));
    
        clkConfig->pSysClk->CSCTL[4] = SELMS__DCOCLKDIV;
        if (clkConfig->SysClk_Config.FLL_Source == FLL_INT_REF)
            clkConfig->pSysClk->CSCTL[4] |= SELA__REFOCLK;
        else
            clkConfig->pSysClk->CSCTL[4] &= ~(BIT9 | BIT8);
    
        switch (clkConfig->SysClk_Config.Clock_SMCLKDiv)
        {
        case SMCLK_DIVIDE1:
            break;
        case SMCLK_DIVIDE2:
            clkConfig->pSysClk->CSCTL[5] |= DIVS__2;
            break;
        case SMCLK_DIVIDE4:
            clkConfig->pSysClk->CSCTL[5] |= DIVS__4;
            break;
        case SMCLK_DIVIDE8:
            clkConfig->pSysClk->CSCTL[5] |= DIVS__8;
            break;
        default :
            break;
        }
    }
    
    
    static void Software_Trim(void)
    {
        unsigned int oldDcoTap = 0xffff;
        unsigned int newDcoTap = 0xffff;
        unsigned int newDcoDelta = 0xffff;
        unsigned int bestDcoDelta = 0xffff;
        unsigned int csCtl0Copy = 0;
        unsigned int csCtl1Copy = 0;
        unsigned int csCtl0Read = 0;
        unsigned int csCtl1Read = 0;
        unsigned int dcoFreqTrim = 3;
        unsigned char endLoop = 0;
    
        do
        {
            CSCTL0 = 0x100;                         // DCO Tap = 256
            do
            {
                CSCTL7 &= ~DCOFFG;                  // Clear DCO fault flag
            }while (CSCTL7 & DCOFFG);               // Test DCO fault flag
    
            __delay_cycles((unsigned int)3000 * 16);// Wait FLL lock status (FLLUNLOCK) to be stable
                                                               // Suggest to wait 24 cycles of divided FLL reference clock
            while((CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)) && ((CSCTL7 & DCOFFG) == 0));
    
            csCtl0Read = CSCTL0;                   // Read CSCTL0
            csCtl1Read = CSCTL1;                   // Read CSCTL1
    
            oldDcoTap = newDcoTap;                 // Record DCOTAP value of last time
            newDcoTap = csCtl0Read & 0x01ff;       // Get DCOTAP value of this time
            dcoFreqTrim = (csCtl1Read & 0x0070)>>4;// Get DCOFTRIM value
    
            if(newDcoTap < 256)                    // DCOTAP < 256
            {
                newDcoDelta = 256 - newDcoTap;     // Delta value between DCPTAP and 256
                if((oldDcoTap != 0xffff) && (oldDcoTap >= 256)) // DCOTAP cross 256
                    endLoop = 1;                   // Stop while loop
                else
                {
                    dcoFreqTrim--;
                    CSCTL1 = (csCtl1Read & (~DCOFTRIM)) | (dcoFreqTrim<<4);
                }
            }
            else                                   // DCOTAP >= 256
            {
                newDcoDelta = newDcoTap - 256;     // Delta value between DCPTAP and 256
                if(oldDcoTap < 256)                // DCOTAP cross 256
                    endLoop = 1;                   // Stop while loop
                else
                {
                    dcoFreqTrim++;
                    CSCTL1 = (csCtl1Read & (~DCOFTRIM)) | (dcoFreqTrim<<4);
                }
            }
    
            if(newDcoDelta < bestDcoDelta)         // Record DCOTAP closest to 256
            {
                csCtl0Copy = csCtl0Read;
                csCtl1Copy = csCtl1Read;
                bestDcoDelta = newDcoDelta;
            }
    
        }while(endLoop == 0);                      // Poll until endLoop == 1
    
        CSCTL0 = csCtl0Copy;                       // Reload locked DCOTAP
        CSCTL1 = csCtl1Copy;                       // Reload locked DCOFTRIM
        while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // Poll until FLL is locked
    }
    

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

    您好、Steve、

    首先、我想澄清一些有关代码刷写的问题、当您刷写  msp430fr235x_CS_03.c 时、代码正常工作、但当您刷写代码时、代码不工作、唯一的区别是时钟源?

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

    你好,Amruta

    没有,我在这里实验时,图片会有一些变化。。。

    首先 、我将与  msp430fr235x_CS_05.c 进行比较 (这符合我使用 XT1晶振所需的内容)

    我在上面发布是为了显示运行这两个应用程序(我的和..._05.c)之后的时钟寄存器。。

    我的代码将在我运行..._05应用程序后起作用。  我现在可以运行、暂停并停止它、它继续在输出端显示时钟、但是当我关闭代码并重新启动代码时、它将不会运行。  如果我用我的代码重新刷写、我很幸运、但是如果我刷写并运行..._05代码(这里的关键是我必须运行..._05代码、只是刷写不会执行它)、那么我可以用我的代码重新刷写、我将再次运行

    有道理?

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

    问题已解决.....

    愚蠢的缺火…

    我从未解锁 GPIO

    PM5CTL0 &=~LOCKLPM5