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.

[参考译文] MSP430FR2475:DCO 校准

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1449703/msp430fr2475-dco-calibration

器件型号:MSP430FR2475

工具与软件:

我将尝试整理 DCO-FLL 配置/校准。  我通读 UG、数据表和 MSP430FR2xx/FR4xx DCO+FLL 应用指南。  

我仍然没有完全清楚。  请在下方指出我的错地方。  这将帮助我完成它!

在用户指南中:

我假设下面的值(来自数据表)映射到 CSCTL0寄存器中。  16位表示16位、很适合。  对吧?

然而、根据 DCOFTRIM 位描述、它们也在总体 DCO 校准中发挥着作用。  对吧?

"特定于芯片的修整"、这是否意味着"每个独立芯片"?  如果是、我希望将这些位记录在器件描述符中。  它们是0x1A2E-0x1A30的一部分还是其他地方或不可访问并在 DCOFTRIMEN=0时自动应用?

无论哪种方式、我都假设 Dev Desc 中的 TAP 设置仅在默认 DCOFTRIM 值或 DCOFTRIMEN=0时有效。  

此致

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

    您好、Fred:

    是的、特定于芯片的意味着每个芯片都会获得这些指定温度的自有校准值。  让我澄清一下这些问题。

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

    有新消息吗?

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

    您好、Fred:

    我很抱歉我的答复出现延误。  好的、"特定于芯片的修整"是指在软件中调整或调整 DCOTRIM 值的过程、顺便说一下、用户指南第3.2.11.2节中提到了该过程。  它不是指存储在 TLV 存储器中的值。  在引导过程中、这些值在 POR 时加载到 DCO 中。  然后、稍后、在应用程序代码中、您可以使用 DCOTRIM 位执行特定于频率的调优。

    为了方便起见、我复制了下面 UG 中提到的示例代码。

    //******************************************************************************
    //  MSP430FR267x Demo - Configure MCLK for 1MHz operation, and REFO sourcing
    //                      FLLREF and ACLK. Use DCOFTRIM register to lock FLL.
    //
    //  Description: Configure MCLK for 1MHz. FLL reference clock is REFO.
    //               ACLK = default REFO ~32768Hz, SMCLK = MCLK = 1MHz.
    //               Use DCOFTRIM register to lock FLL. If FLL is locked and
    //               DCO tap is closest to 256, the DCOFTRIM value is the best one.
    //
    //                MSP430FR2676
    //         ---------------
    //     /|\|               |
    //      | |               |
    //      --|RST            |
    //        |          P1.0 |---> LED
    //        |               |
    //        |          P1.7 |---> SMCLK = 1MHz
    //        |               |
    //
    //   Longyu Fang
    //   Texas Instruments Inc.
    //   August 2018
    //   Built with IAR Embedded Workbench v7.12.1 & Code Composer Studio v8.1.0
    //******************************************************************************
    #include <msp430.h>
    
    void Software_Trim();                       // Software Trim to get the best DCOFTRIM value
    #define MCLK_FREQ_MHZ 1                     // MCLK = 1MHz
    
    int main(void) {
        WDTCTL = WDTPW | WDTHOLD;               // Stop watchdog timer
    
        __bis_SR_register(SCG0);                // Disable FLL
        CSCTL3 = SELREF__REFOCLK;               // Set REFO as FLL reference source
        CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_0;// DCOFTRIM=3, DCO Range = 1MHz
        CSCTL2 = FLLD_0 + 30;                   // DCODIV = 1MHz
        __delay_cycles(3);
        __bic_SR_register(SCG0);                // Enable FLL
        Software_Trim();                        // Software Trim to get the best DCOFTRIM value
        CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK; // set default REFO(~32768Hz) as ACLK source, ACLK = 32768Hz
                                                   // default DCODIV as MCLK and SMCLK source
    
        P1DIR |= BIT0 | BIT7;                   // set SMCLK and LED pin as output
        P1SEL1 |= BIT7;                         // set SMCLK P1.7 pin as second function
    
        PM5CTL0 &= ~LOCKLPM5;                   // Disable the GPIO power-on default high-impedance mode
                                                // to activate previously configured port settings
    
        while(1)                                // Toggle P1.0
        {
            P1OUT ^= BIT0;
            __delay_cycles(50000);
        }
    }
    
    void Software_Trim()
    {
        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 * MCLK_FREQ_MHZ);// 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
    }
    

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

    Dennis、

    您的代码非常全面、   有了这一点,我再次阅读文档,并把它全部整理出来。

    如果我们要使用它、我将假设 DCSTL0.DCO 接受两个8位 TLV 寄存器中的9 LSB。

    非常感谢您的支持。