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.

[参考译文] MSP430FR4133:在环路标志检查时避免。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/919651/msp430fr4133-avoid-while-loop-flag-check

器件型号:MSP430FR4133

大家好、我想知道是否有其他方法可以执行下一个任务:

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

虽然这种 while 环路标志检查对于 MSP430 C 编码很常见、但我希望避免这种情况、因为我希望将功耗降低到尽可能低的水平。  

我附上以下代码。 此代码使 您能够 从 https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/590909?MSP430FR2533-Looking-for-any-examples-of-how-to-correctly-set-the-DCO 获取我在这里找到的最佳 DCOFTRIM 值。 谢谢。


静态空 CS_softwareTrim () { 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 故障标志 //__delay_cycles ((unsigned int) 3000 * MCLK_FREQ_MHz);//等待 FLL 锁定状态(FLLUNLOCK)保持稳定 //建议等待24个经过分频的 FLL 参考时钟周期 delay_ms (3); //等待 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_3))|(dcoFreqTrim<4); } } 其他 // DCOTAP >= 256 { newDcoDelta = newDcoTap - 256; // DCPTAP 和256之间的增量值 if (oldDcoTap < 256) // DCOTAP 交叉256 endLoop = 1; //停止 while 循环 其他 { dcoFreqTrim++; CSCTL1 =(csCtl1Read &(~DCOFTRIM_3))|(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 锁定 } //********* void CS_clockConfig() { _bis_SR_register (SCG0); //禁用 FLL CSCTL3 = SELREF__REFOCLK; //将 REFO 设置为 FLL 基准源 CSCTL0 = 0; //清除 DCO 和 MOD 寄存器 CSCTL1 &=~(DCORSEL_7); //首先清除 DCO 频率选择位 CSCTL1 |= DCOFTRIMEN | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_3;// DCOFTRIM=3、DCO 范围= 8MHz CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz _DELAY_CYCLES (3); _BIC_SR_register (SCG0); //启用 FLL CS_softwareTrim (); //软件调整以获得最佳 DCOFTRIM 值 CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK; //将默认 REFO (~32768Hz)设置为 ACLK 源,ACLK = 32768Hz //默认 DCODIV 为 MCLK 和 SMCLK 源*/ }

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

    您好!  

    由于 在检查 FLL 锁定状态之前已清除 CSCTL7.DCOFFG、因此您可以忽略它以进行 FLL 锁定状态检查。  

    • while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));
    • while (CSCTL7 & 0x300);

    谢谢、  

    Lixin  

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

    在打开(启动)代码中、我想说您可以离开锁定环路。 您的 CPU 将以距离目标不远的某个频率运行、并将在接下来的几毫秒内逐步达到目标频率。 如果您在启动期间不需要严格的计时(并非罕见)、您只需继续并让它在后台稳定下来即可。

    Software_Trim 中的环路是不同的、因为它等待锁定、然后读取在锁定序列期间计算得出的 FLL 结果。 您真的需要等待。

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

    感谢您的回答。 我将解决这个问题。

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

    感谢您的回答。 现在我了解了。

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

    我将在这里输入: 用户指南(SLAU445I)第3.2.11.2节建议将由 Software_Trim 计算的 DCOFTRIM 值(3位)保存在 FRAM 中(例如信息 FRAM)、并在后续重新启动时重新使用。

    这告诉我 每次启动时都不需要运行 Software_Trim。 相反、您只需为您拥有的每个物理设备运行一次(永远)。

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

    好的、我会将其考虑在内。 再次感谢。