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.

[参考译文] MSP430FR2110:启动时间快一些

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/847606/msp430fr2110-about-faster-startup-time

器件型号:MSP430FR2110
主题中讨论的其他器件: MSP430FR2311MSP-TS430PW20MSP-FET430UIF

大家好、

使用 MSP430FR2110
我希望将从上电到 P1.0的时间设置为"高电平" 40ms 或更短。 MCLK 必须为16MHz。
当前软件需要138ms 的处理时间。
有关 DCO 软件调整的更多信息
我参考了 MSP430硬件工具用户指南.pdf。
在 Software_Trim ()处理上花费了47ms 的时间。
-如果您在不等待 FLL 锁定的情况下执行处理、您会有什么顾虑?
-请就如何增加启动时间向我提供建议。

int main (空)

   /* 端口1初始化*/
 P1DIR = 0x31;
 P1REN = 0x08;
 P1OUT = 0x00;
 P1SEL0 = 0x02;
 P1SEL1 = 0xC2;
 P1IES = 0x08;// P1.3中断低边沿*/
 P1IE  = 0x08;/* P1.3中断使能*/

 WDTCTL = WDTPW + WDTHOLD; //停止看门狗计时器*/

   PM5CTL0 &=~LOCKLPM5;      //禁用 GPIO 上电默认高阻抗模式
                               //激活先前配置的端口设置

 FRCTL0 = FRCTLPW | NWAITS_1;   //将 FRAM 等待状态设置为1 */
 
 Clock_setting();

 __bis_SR_register ( GIE );  //启用中断*/

 P1OUT |= 0x01;

 while (1){}

空 Clock_setting()

   _bis_SR_register (SCG0);               //禁用 FLL
   CSCTL3 |= SELREF_REFOCLK;             //将 REFO 设置为 FLL 基准源

   CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_5;// DCOFTRIM = 3、DCO 范围= 16MHz
   CSCTL2 = FLLD_0 + 488;                 // DCODIV = 16.023552MHz

   _DELAY_CYCLES (3);
   _BIC_SR_register (SCG0);               //启用 FLL

   Software_Trim ();                       //软件调整可获得最佳 DCOFTRIM 值

   CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
                                           //默认 DCODIV 为 MCLK 和 SMCLK 源

空 Software_Trim ()

   unsigned int oldDcotTap = 0xFFFF;
   unsigned int newDcoTap = 0xFFFF;
   unsigned int newDcoDelta = 0xFFFF;
   unsigned int bestDcoDelta = 0xFFFF;
   unsigned int csCtl0Copy = 0;
   unsigned int csCtl1Copy = 0;
   无符号 int csCtl0Read = 0;
   无符号 int csCtl1Read = 0;
   unsigned int dcoFreqTrim = 3;
   unsigned char endLoop = 0;

   操作
   {
       CSCTL0 = 0x100;                        // DCO 抽头= 256
       操作
       {
           CSCTL7 &=~DCOFFG;                 //清除 DCO 故障标志
       } while (CSCTL7 & DCOFFG);              //测试 DCO 故障标志

       if (MCLK =MCLK16MHz)__DELAY_CYCLLES ((unsigned int) 3000 * 16);//等待 FLL 锁定状态(FLLUNLOCK)保持稳定
                                                          //建议等待24个经过分频的 FLL 参考时钟周期

       while (((CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1))和&((CSCTL7 & DCOFFG)= 0));

       CSCCtl0Read = CSCTL0;                  //读取 CSCTL0
       CSCCtl1Read = CSCTL1;                  //读取 CSCTL1

       oldDcoTap = newDcoTap;                //记录上次的 DCOTAP 值
       newDcoTap = csCtl0Read & 0x01ff;      //这次获得 DCOTAP 值
       dcoFreqTrim =(csCtl1Read & 0x0070)>>4;//获取 DCOFTRIM 值

       if (newDcoTap < 256)                   // DCOTAP < 256
       {
           newDcoDelta = 256 - newDcoTap;    // DCPTAP 和256之间的增量值
           if ((oldDcotap!= 0xFFFF)&&(oldDcotap >= 256)// DCOTAP 交叉256
               endLoop = 1;                  //停止 while 循环
           其他
           {
               dcoFreqTrim --;
               CSCTL1 =(csCtl1Read &(~DCOFTRIM))|(dcoFreqTrim <4);
           }
       }
       else                                  // DCOTAP >= 256
       {
           newDcoDelta = newDcoTap - 256;    // DCPTAP 和256之间的增量值
           if (oldDcoTap < 256)               // DCOTAP 交叉256
               endLoop = 1;                  //停止 while 循环
           其他
           {
               dcoFreqTrim++;
               CSCTL1 =(csCtl1Read &(~DCOFTRIM))|(dcoFreqTrim <4);
           }
       }

       if (newDcoDelta < bestDcoDelta)        //记录最接近256的 DCOTAP
       {
           csCtl0Copy = csCtl0Read;
           csCtl1Copy = csCtl1Read;
           bestDcoDelta = newDcoDelta;
       }

   }while (endLoop =0);                     //轮询直至 endLoop =1

   CSCTL0 = csCtl0Copy;                      //重新加载锁定的 DCOTAP
   CSCTL1 = csCtl1Copy;                      //重新加载锁定的 DCOFTRIM
   while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));//轮询直到 FLL 被锁定

提前做好准备。
此致、

K.Saito

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

    您好!

    如果在 FLL 模块配置后没有等待 FLL 锁定、,可能会出现崩溃的风险。

    为什么需要小于40ms 的启动时间? 您能否提供有关您的应用的详细信息?

    一些可能会缩短启动时间的建议:

    • 使用汇编语言、这可以跳过 boot.c 文件的执行、效率会更高。
    • 如果您想在快速启动后执行一些必要的代码、可以在执行这些代码后执行 FLL 初始化吗?
    • 如果 MSP430从低功耗模式启动、则可以节省 FLL 初始化时间、例如 LPM3.5/LPM4.5模式、但首次上电时仍需要 FLL 初始化。

    此致

    Johnson

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢你的答复。
    >如果在 FLL 模块配置后没有等待 FLL 锁定,,可能会出现崩溃的风险。
    我知道。
    >为什么需要小于40ms 的启动时间? 您能否提供有关您的应用的详细信息?
    MSP430用作从系统。 主器件侧是一个现有系统、启动从器件后40ms 内输出一个信号。 因此、从器件必须在40ms 内启动、并且处于能够接收主器件信号的状态。
    为了检查启动时间、我们测量了从打开电源到 P1.0变为高电平的时间。
    >•使用汇编语言可以跳过 boot.c 文件的执行、效率会更高。
    我不知道该怎么办,您能否提供样片来源?
    >•如果要在快速启动后执行一些必要的代码,是否可以在执行这些代码后执行 FLL 初始化?
    主器件在启动从器件后输出一个周期为212KHz 40ms 的中断。
    因此、启动后没有时间初始化 FLL。
     if (MCLK =MCLK16MHz)__DELAY_CYCLLES ((unsigned int) 3000 * 16);   //等待 FLL 锁定状态(FLLUNLOCK)保持稳定
                                                                                                                   //建议等待24个经过分频的 FLL 参考时钟周期
    我可以缩短采样中等待3000ms 的时间吗?
    例如1000ms。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我犯了以下错误:
    周期错误地设置了 ms。

    if (MCLK =MCLK16MHz)__DELAY_CYCLLES ((unsigned int) 3000 * 16);   //等待 FLL 锁定状态(FLLUNLOCK)保持稳定
                                                                                                                   //建议等待24个经过分频的 FLL 参考时钟周期

    我可以缩短采样中等待3000个周期的时间吗?
    例如1000个周期。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    对于汇编语言、我们为客户提供了一些代码示例、您可以参阅以下链接:

      http://dev.ti.com/tirex/explore/node?node=AMxpbVoxQwHnVaf2jw1Mrg__IOGqZri__LATEST

      但是、我在 FR2311上测试了使用汇编语言的方法、但结果不好、时间基本上也不会缩短。

    2、您描述3000周期到1000周期的方式、结果不一定会缩短启动时间、因为启动时间主要是在等待 FLL 锁定时占用、而不是在此处占用、因此此操作可能会导致相反的结果、从而导致启动时间更长。 我在 FR2311上进行了测试、如果我将3000周期更改为1000周期、启动时间将更长。

    3、 为什么通信或其他目的需要 MCLK 为16MHz? 无法完成默认频率?

    4. 针对这种情况,提出以下分析和建议:

    启动时间的主要消耗是从低频乘法到高频、例如 REFCLK (32768Hz)到 MCLK (16MHz)、因此此过程需要等待时间。


    您是否愿意替代类似的 MCU 产品? 对于 MSP430FR2311或其他类似产品、内部时钟模块为 HFXT (FR2110为 LFXT)、因此它可以直接连接到外部16MHz 晶体振荡器。 这种方法可以大大缩短启动时间。 在我们的数据表中、启动时间大约为1ms、如下所示:

    或其他系列 MSP430 MCU、例如 MSP430G2xx F2xx、可通过设置数字 DCO 时钟直接设置为16MHz。 它可能会节省很多启动时间、因为它 不需要 FLL 模块。  

    此致

    Johnson

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的建议。
    > 1. 对于汇编语言、我们为客户提供了一些代码示例、您可以参阅以下链接:
    好的。 我将会参考它。
    > 2. 您描述3000周期到1000周期的方式、结果不一定会缩短启动时间、因为启动时间是
    > 主要用于等待 FLL 锁定、而不是在此处、因此此操作可能会导致相反的结果、从而导致更长的启动时间。 一
    >在> FR2311上进行了测试、如果我将3000周期更改为1000周期、启动时间将更长。
    我知道。
    等待的最小周期数是多少?
    它是否仍然是3000周期?
    > 3.  出于通信或其他目的、您为什么需要将 MCLK 设置为16MHz? 无法完成默认频率?
    由于主器件侧以212KHz 的间隔向从器件输出中断信号、因此有必要在4.7us 内完成中断处理。 因此、如果不以16MHz 的频率进行处理、它就不会及时。
    > 4.  针对这种情况,提出以下分析和建议:
    感谢您介绍 MSP430FR2311。
    我将检查安装区域的限制条件下的详细信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回答。

    请告诉我们以下崩溃情况。

    >如果在 FLL 模块配置后没有等待 FLL 锁定,,可能会出现崩溃的风险。

    什么是硬碰撞或软碰撞?
    当不等待 FLL 锁定时、
    我认为程序计数器在软件方面是无限时钟的。
    请告诉我它是如何崩溃的。

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

    您好!

     如果在初始化 FLL 后运行其他代码而没有等待稳定性、并且之前发生了崩溃、则可能会出现一些不可预测的问题。

    针对您的快速启动请求(少于40ms)、我们找到了一个解决方案。 下面是一些详细信息:

    您可以关闭 FLL 模块、只需使用 DCO 模块创建16MHz 时钟即可。

    由于 FLL 模块被禁用、频率可能会出现错误。 但是、每个芯片在 TLV 结构中都有 DCO 时钟的校准值。 可以读取该值来设置 DCO 时钟以获得精确的16MHz。


    此解决方案仅用于操作寄存器、无需等待回廊稳定、因此启动时间更快、应满足您的要求。

    附加我的测试代码:

    #include 
    #define DCO_CALIBRATY_ADDR 0x1A22
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
    
    //根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
    //在配置时钟系统之前在8MHz 以上运行。
    FRCTL0 = FRCTLPW | NWAITS_1;
    
    P2DIR |= BIT6;
    P2OUT |= BIT6;
    
    _delay_cycles (8000); //延迟
    
    P2OUT &=~BIT6;
    
    _bis_SR_register (SCG0); //禁用 FLL
    CSCTL0 = 0; //清除 DCO 和 MOD 寄存器
    CSCTL0 |=*(unsigned int *) DCO_CALIBRATE_ADDR;//通过 TLV 校准设置 DCO
    CSCTL1 &=~DCORSEL_7; //首先清除 DCORSEL 位
    CSCTL1 |= DCORSEL_5; //设置 DCO = 16MHz
    CSCTL2 &=~FLLD_7; //清除 FLLD 寄存器
    CSCTL2 |= FLLD_0; //设置 FLLD = 0、不对 DCOCLK 时钟进行分频
    _DELAY_CYCLES (3);
    
    CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK; //将默认 REFO (~32768Hz)设置为 ACLK 源,ACLK = 32768Hz
    //默认 DCOCLKDIV 为 MCLK 和 SMCLK 源
    
    CSCTL5 |= DIVS_2 + DIVM_0; // MCLK = DCOCLK = 16MHz
    // SMCLK = MCLK/4 = 4MHz
    P1DIR |= BIT0 | BIT1; //将 ACLK SMCLK 设置为输出
    P1SEL1 |= BIT0 | BIT1; //将 ACLK 和 SMCLK 引脚设置为第二功能
    
    P2OUT |= BIT6;
    PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
    //激活先前配置的端口设置
    
    while (1)
    {
    __delay_cycles (8000);
    }
    }
    

    此致

    Johnson

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的建议。
    我们通过引用示例代码进行编程和确认。
    请告诉 我们以下内容:
    问题1. 对于 DCO Direct、即使开关频率也存在崩溃风险吗?
    问题2. 请告诉我12MHz 设置时的校准值。 (可以切换校准值吗?)
    问题3.请告诉我 DCO 的频率精度和温度特性。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    解决方案。  对于 DCO Direct、即使开关频率也存在崩溃风险吗?

     DCO 的这种使用方式是正常模式、在用户指南中有相应的章节说明、因此没有崩溃的风险。

    电容。  请告诉我12MHz 设置时的校准值。 (可以切换校准值吗?)

    我们在 TLV 结构中只有16MHz 的校准值、如果您想将系统时钟设置为12MHz、则需要自行校准。 可以修改此校准值、但它将覆盖原始16MHz 校准值、建议将校准数据(12MHz)存储到 FRAM 中。

    问题。  请告诉我 DCO 的频率精度和温度特性。

    很抱歉、我们没有这些测试数据来回答您的问题、 您为什么需要高精度时钟?

    此致

    Johnson

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

    感谢您的回答。

    >Q1。  对于 DCO Direct、即使开关频率也存在崩溃风险吗?

     DCO 的这种使用方式是正常模式、在用户指南中有相应的章节说明、因此没有崩溃的风险。

    我知道。

    >对于 Q2。  请告诉我12MHz 设置时的校准值。 (可以切换校准值吗?)

    我们在 TLV 结构中只有16MHz 的校准值、如果您想将系统时钟设置为12MHz、则需要自行校准。 可以修改此校准值、但它将覆盖原始16MHz 校准值、建议将校准数据(12MHz)存储到 FRAM 中。

    这是否意味着为每个器件校准 DCO 抽头值并将其存储在 FRAM 中?
    当使用 TLV 结构中的16MHz 校准值将 DCORSEL 设置为12MHz 时、有哪些风险?
    请告诉我校准程序。

    >用于 Q3。  请告诉我 DCO 的频率精度和温度特性。

    很抱歉、我们没有这些测试数据来回答您的问题、 您为什么需要高精度时钟?

    作为所需的规范、中断处理必须在4.7us 内完成、因此我们希望确认 DCO 的温度特性作为证据。
    由于执行时间至关重要、因此需要5%或更低的精度。
    我知道没有数据。 请告诉我设计值。

    此致

    K.Saito

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

    您好、K.Saito、

    数据表中有一些可能对您有用的测试数据:

    这些测试条件是启用 FLL,为了满足您的要求:快速启动和 高精度时钟,您可以使用 DCO 校准值并同时启用 FLL,这将 大幅减少 FLL 锁定时间。

    以这种方式附加一些代码:

    #include 
    #define DCO_CALIBRATY_ADDR 0x1A22
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
    
    //根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
    //在配置时钟系统之前在8MHz 以上运行。
    FRCTL0 = FRCTLPW | NWAITS_1;
    
    P2DIR |= BIT6;
    P2OUT |= BIT6;
    
    _delay_cycles (8000); //延迟
    
    P2OUT &=~BIT6;
    
    _bis_SR_register (SCG0); //禁用 FLL
    CSCTL3 |= SELREF_REFOCLK; //将 REFO 设置为 FLL 基准源
    CSCTL0 = 0; //清除 DCO 和 MOD 寄存器
    CSCTL0 |=*(unsigned int *) DCO_CALIBRAT_ADDR;//清除 DCO 和 MOD 寄存器
    CSCTL1 &=~(DCORSEL_7); //首先清除 DCO 频率选择位
    CSCTL1 |= DCORSEL_5; //设置 DCO = 16MHz
    CSCTL2 = FLLD_0 + 487; // DCOCLKDIV = 16MHz
    _DELAY_CYCLES (3);
    _BIC_SR_register (SCG0); //启用 FLL
    while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1)); // FLL 锁定
    
    
    CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK; //将默认 REFO (~32768Hz)设置为 ACLK 源,ACLK = 32768Hz
    //默认 DCOCLKDIV 为 MCLK 和 SMCLK 源
    
    CSCTL5 |= DIVS_2 + DIVM_0; // MCLK = DCOCLK = 16MHz
    // SMCLK = MCLK/4 = 4MHz
    P1DIR |= BIT0 | BIT1; //将 ACLK SMCLK 设置为输出
    P1SEL1 |= BIT0 | BIT1; //将 ACLK 和 SMCLK 引脚设置为第二功能
    
    P2OUT |= BIT6;
    PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
    //激活先前配置的端口设置
    
    while (1)
    {
    __delay_cycles (8000);
    }
    }
    

    此致

    Johnson

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

    你(们)好

    感谢您提出的宝贵建议。
    我们根据建议评估了以下两种情况。
    在这两种情况下、P1.0变为高电平之前的时间约为50us。
    然而、当 P1.0变为高电平时、MCLK 的频率在时序上被确认、在这两种情况下、它都是16.6MHz。
    我对上述问题有疑问。
    问题1.为什么 case2和 case1之间的 MCLK 频率没有差异?
    问题2.当 MCLK 超过16M 时是否存在风险?

    -------- 情况1 ------
    #include
    #define DCO_CALIBRAY_ADDR 0x1A22

    int main (空)

       WDTCTL = WDTPW | WDTHOLD;                         //停止看门狗计时器

       //根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
       //在配置时钟系统之前在8MHz 以上运行。
       FRCTL0 = FRCTLPW | NWAITS_1;

     P1DIR = 0x01;
     P1OUT = 0x00;
     P2DIR = 0x40;
     P2OUT = 0x40;//P2.6 MCLK 输出
     P2SEL0 = 0x40;//P2.6 MCLK 输出

       _bis_SR_register (SCG0);                        //禁用 FLL
       CSCTL0 = 0;                                     //清除 DCO 和 MOD 寄存器
       CSCTL0 |=*(unsigned int *) DCO_CALIBRATE_ADDR;//通过 TLV 校准设置 DCO
       CSCTL1 &=~DCORSEL_7;                           //首先清除 DCORSEL 位

       CSCTL1 |= DCORSEL_5;                            //设置 DCO = 16MHz
       CSCTL2 &=~FLLD_7;                              //清除 FLLD 寄存器
       CSCTL2 |= FLLD_0;                               //设置 FLLD = 0,不对 DCOCLK 时钟进行分频
       _DELAY_CYCLES (3);

       CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;      //将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
                                                        //默认 DCOCLKDIV 为 MCLK 和 SMCLK 源

       CSCTL5 |= DIVS_2 + DIVM_0;                      // MCLK = DCOCLK = 16MHz
                                                        // SMCLK = MCLK/4 = 4MHz

       PM5CTL0 &=~LOCKLPM5;                           //禁用 GPIO 上电默认高阻抗模式
                                                        //激活先前配置的端口设置
       P1OUT |= 0x01;

       while (1)
       {
           _delay_cycles (8000);
       }

    -------- CASE2----
    #include
    #define DCO_CALIBRAY_ADDR 0x1A22

    int main (空)

       WDTCTL = WDTPW | WDTHOLD;                         //停止看门狗计时器

       //根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
       //在配置时钟系统之前在8MHz 以上运行。
       FRCTL0 = FRCTLPW | NWAITS_1;

       P1DIR = 0x01;
     P1OUT = 0x00;
     P2DIR = 0x40;
     P2OUT = 0x40;//P2.6 MCLK 输出
     P2SEL0 = 0x40;//P2.6 MCLK 输出

       _bis_SR_register (SCG0);                          //禁用 FLL
       CSCTL3 |= SELREF_REFOCLK;                        //将 REFO 设置为 FLL 基准源
       CSCTL0 = 0;                                       //清除 DCO 和 MOD 寄存器
       CSCTL0 |=*(unsigned int *) DCO_CALIBRAT_ADDR;  //清除 DCO 和 MOD 寄存器
       CSCTL1 &=~(DCORSEL_7);                           //首先清除 DCO 频率选择位
       CSCTL1 |= DCORSEL_5;                              //设置 DCO = 16MHz
       CSCTL2 = FLLD_0 + 487;                            // DCOCLKDIV = 16MHz
       _DELAY_CYCLES (3);
       _BIC_SR_register (SCG0);                          //启用 FLL
       while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));        // FLL 锁定


       CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;      //将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
                                                        //默认 DCOCLKDIV 为 MCLK 和 SMCLK 源

       CSCTL5 |= DIVS_2 + DIVM_0;                      // MCLK = DCOCLK = 16MHz
                                                        // SMCLK = MCLK/4 = 4MHz

       PM5CTL0 &=~LOCKLPM5;                           //禁用 GPIO 上电默认高阻抗模式
                                                        //激活先前配置的端口设置
       P1OUT |= 0x01;

       while (1)
       {
           _delay_cycles (8000);
       }

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

    您好、K.Saito、

    这看起来像是示波器的测量误差。 我们的校准值为16MHz。 您能否尝试更改示波器的 SACLE 值以重新测量它? MCLK 时钟的波形并不完美、因此可能会发生频率测量误差。

    将我在 FR2311 MCU 中的程序中使用的测试结果附加到:

    案例1:

    案例2:

    此致

    Johnson

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

    你(们)好

    感谢您的建议。
    我更改了示波器的标度、然后再次取它。
    DCO 输出和 FLL 锁定输出的频率均为16.6MHz。
    我逻辑上认为 FLL 锁定输出接近16.0MHz。
    为什么 FLL 锁定输出不是16.0MHz?
    这是特定于器件的问题吗?
    案例1:仅 DCO 输出
    CASE2:DCO&FLL 锁定输出
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、K.Saito、

    您的测试环境是什么?  校准值是在30°C 环境中获得的。 您可以参考图片中的信息:

    您是否尝试更改 FR2110芯片进行测试?

    我使用 FR2110芯片进行测试。  结果表明两个程序(案例1和案例2)的 MCLK 频率均为16MHz。

    此致

    Johnson

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

    你(们)好

    我使用 MSP-TS430PW20评估板和 MSP-FET430UIF 作为调试器。
    室温下的环境温度为25°C。
    我用另一个器件进行了检查、结果是16.03MHz。
    器件 MCLK 特性存在差异。
    这是否意味着由于存在差异、可能会有16.6MHz 的 MCLK 器件?
    16.6MHz 器件是否在变化范围内?
    案例1:仅 DCO 输出(另一个器件)
    CASE2:DCO&FLL 锁定输出(另一个器件)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、K.Saito、

    这个芯片的 MCLK 频率似乎已经超过了误差范围、并且连接了时钟的精度数据。

    是否可以测试更多的芯片来确定只有天气这种芯片是异常的?

    此致

    Johnson

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

    你(们)好

    感谢您的建议。

    对于三个器件、MCLK 从 P2.6输出、频率得到确认。
    NO1.16.6MHz
    No2.16.03MHz
    No3.16.08MHz
    Q1是第一个器件损坏了吗?
      然而、当 FLL 锁定确认后1ms 后频率通过时、第一个器件为16.06MHz。
      你知道发生什么事了吗?
    问题2.如果我不等待 FLL 锁定、是否有崩溃的风险?
    注释掉"while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));"
     
    #include
    #define DCO_CALIBRAY_ADDR 0x1A22

    int main (空)

       WDTCTL = WDTPW | WDTHOLD;                         //停止看门狗计时器

       //根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
       //在配置时钟系统之前在8MHz 以上运行。
       FRCTL0 = FRCTLPW | NWAITS_1;

       P1DIR = 0x01;
     P1OUT = 0x00;
     P2DIR = 0x40;
     P2OUT = 0x40;//P2.6 MCLK 输出
     P2SEL0 = 0x40;//P2.6 MCLK 输出

       _bis_SR_register (SCG0);                          //禁用 FLL
       CSCTL3 |= SELREF_REFOCLK;                        //将 REFO 设置为 FLL 基准源
       CSCTL0 = 0;                                       //清除 DCO 和 MOD 寄存器
       CSCTL0 |=*(unsigned int *) DCO_CALIBRAT_ADDR;  //清除 DCO 和 MOD 寄存器
       CSCTL1 &=~(DCORSEL_7);                           //首先清除 DCO 频率选择位
       CSCTL1 |= DCORSEL_5;                              //设置 DCO = 16MHz
       CSCTL2 = FLLD_0 + 487;                            // DCOCLKDIV = 16MHz
       _DELAY_CYCLES (3);
       _BIC_SR_register (SCG0);                          //启用 FLL
     //  while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));        // FLL 锁定


       CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;      //将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
                                                        //默认 DCOCLKDIV 为 MCLK 和 SMCLK 源

       CSCTL5 |= DIVS_2 + DIVM_0;                      // MCLK = DCOCLK = 16MHz
                                                        // SMCLK = MCLK/4 = 4MHz

       PM5CTL0 &=~LOCKLPM5;                           //禁用 GPIO 上电默认高阻抗模式
                                                        //激活先前配置的端口设置
       P1OUT |= 0x01;

       while (1)
       {
           _delay_cycles (8000);
       }

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

    您好、K.Saito、

    根据您的描述,在 TLV 中将16MHz 的校准写入 CSCTL0寄存器,然后启用 FLL 模块等待 FLL 锁定,此方法应满足您关于快速启动的要求,为什么要 注释“while (CSCTL7 &(FLLUNLOCK0|FLLOCK1);”?

    "当 FLL 锁定确认后1ms 后频率通过时、第一个器件的频率为16.06MHz、这意味着什么?"

    该测试条件是什么? 将校准值写入 CSCTL0寄存器并启用 FLL?  在执行此代码1ms 后 MCLK 的频率将变为16.06MHz (while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));)?

    此致

    Johnson

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

    你(们)好

    由于每个器件具有不同的锁定等待时间、因此在最坏的情况下可能无法启动。
    因此、我想看看如果我不等待锁定会发生什么情况。

    最差的样本1显示以下趋势。

    在以下源代码中、时序1为16.6Mhz。 另一方面、时序2为16.03MHz。
    为什么它不会随着时间1而变为16MHz?
    你认为正在发生什么事?

     

    ℃条件:室内25 ̊ C

    -Timing1.

    -Timing2.

    #define DCO_CALIBRAY_ADDR 0x1A22

    int main (空)

       WDTCTL = WDTPW | WDTHOLD;                         //停止看门狗计时器

       //根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
       //在配置时钟系统之前在8MHz 以上运行。
       FRCTL0 = FRCTLPW | NWAITS_1;

       P1DIR = 0x01;
     P1OUT = 0x00;
     P2DIR = 0x40;
     P2OUT = 0x40;//P2.6 MCLK 输出
     P2SEL0 = 0x40;//P2.6 MCLK 输出

       _bis_SR_register (SCG0);                          //禁用 FLL
       CSCTL3 |= SELREF_REFOCLK;                        //将 REFO 设置为 FLL 基准源
       CSCTL0 = 0;                                       //清除 DCO 和 MOD 寄存器
       CSCTL0 |=*(unsigned int *) DCO_CALIBRAT_ADDR;  //清除 DCO 和 MOD 寄存器
       CSCTL1 &=~(DCORSEL_7);                           //首先清除 DCO 频率选择位
       CSCTL1 |= DCORSEL_5;                              //设置 DCO = 16MHz
       CSCTL2 = FLLD_0 + 487;                            // DCOCLKDIV = 16MHz
       _DELAY_CYCLES (3);
       _BIC_SR_register (SCG0);                          //启用 FLL
       while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));        // FLL 锁定


       CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;      //将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
                                                        //默认 DCOCLKDIV 为 MCLK 和 SMCLK 源

       CSCTL5 |= DIVS_2 + DIVM_0;                      // MCLK = DCOCLK = 16MHz
                                                        // SMCLK = MCLK/4 = 4MHz

       PM5CTL0 &=~LOCKLPM5;                           //禁用 GPIO 上电默认高阻抗模式
                                                        //激活先前配置的端口设置
       
       P1OUT |= 0x01; //Timing1波形
       
       McuDelayMillisecond (10);//10ms 等待
       
       P1OUT &=~0x01;//Timing2波形

       while (1)
       {
           _delay_cycles (8000);
       }

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

    您好、K.Saito、

    根据您的描述、这可能只是此芯片的问题。 您可以测试多个芯片以查看是否有多个芯片。
    对于频率最高为16MHz 的 FR2110芯 片、我们不能保证当 MCU 以16.6MHz 运行时不会出现不可预测的问题。 另一种解决此问题的方法是、如果您有一些启动时间空间、您是否可以考虑在 FLL 锁定后添加一些延迟?

    此致

    Johnson

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

    你(们)好

    感谢你的答复。

    我还检查了 另外四 个器件的 Timing1和 Timin2的 MCLK 频率。

    经确认添加的器件为 NO2至 NO5。

    我们需要假设 No1等器件将在大规模生产中混合使用。
    在这种情况下、最好仅使用 DCO 的输出。

    第1个

    NO2.

    第3号

    第4项

    第5号

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

    您好、K.Saito、

    我在我们的实验室中测试了14个 PICS 使用您的代码、没有发现任何问题。

    根据我们的测试结果、我有以下想法:

    • 您在测试期间使用的是目标板还是您自己的硬件电路? 硬件电路(或晶体振荡器)上是否出现问题?
    • 您能否在测试此芯片期间使用更高的示波器? 我发现在测试过程中光标的位置不是很准确。
    • 由于 MCLK 时钟稍微波动且测量中存在误差、因此可以对一个芯片进行多次测试。
    • 当 MCLK 频率变高时、您是否可以使功率波形变灰? 因为 MCLK 频率可能会受到功耗的影响。

    附加我的测试图像:  

    有关测试的更多数据:

     e2e.ti.com/.../2766.FR2110_5F00_1.zip 

    此致

    Johnson

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

    您好、K.Saito、

    由于 E2E 上传最大附件的限制、我将测试结果分为三次上传

    第2部分:

    e2e.ti.com/.../FR2110_5F00_2.zip

    此致

    Johnson

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

    您好、K.Saito、

    第3部分:

    e2e.ti.com/.../FR2110_5F00_3.zip

    此致

    Johnson

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

    你(们)好

    感谢您的回复。
    我们使用 MSP-TS430PW20作为开发环境。
    我们不会连接我们自己的电路。 单独的评估板。
    不使用晶体振荡器。

    使用高精度示波器重新唤醒波形。

    Timing1:蓝色时钟、粉色 P1.0、绿色电源(VCC)

    时间2.

    最差的样本被确认了大约10次、但测量结果没有改变。

    目标板由 MSP-FET430UIF 供电。
    程序从调试器运行。

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

    您好、K.Saito、

    我通过 E2E 私人消息与您联系、以进一步讨论此问题。 我关闭此帖子、我们可以通过电子邮件讨论此问题。

    此致

    Johnson