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.

[参考译文] MSP430FR2533:查找有关如何正确设置 DCO 的任何示例

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/590909/msp430fr2533-looking-for-any-examples-of-how-to-correctly-set-the-dco

器件型号:MSP430FR2533

大家好、团队、

但愿你一切顺利。 感谢您对以下客户问题的反馈:

客户对我正在使用的 MSP430FR2533芯片中的“时钟系统”没有任何经验。  

查找有关如何正确设置 DCO 的示例,例如1MHz?  

客户无法找到“时钟系统”的任何工作示例

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

    Randhir Kalsi、

    请参阅以下代码示例:

    #include 
    
    void Software_Trim (); //获取最佳 DCOFTRIM 值
    #define MCLK_FREQ_MHz 的软件调整8. // MCLK = 8MHz
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
    
    _bis_SR_register (SCG0); //禁用 FLL
    CSCTL3 |= SELREF_REFOCLK; //将 REFO 设置为 FLL 基准源
    CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_3;// DCOFTRIM = 3、DCO 范围= 8MHz
    CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
    _DELAY_CYCLES (3);
    _BIC_SR_register (SCG0); //启用 FLL
    Software_Trim (); //软件调整以获得最佳 DCOFTRIM 值
    
    
    CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
    //默认 DCODIV 为 MCLK 和 SMCLK 源
    
    P1DIR |= BIT0 | BIT1; //将 ACLK 和 LED 引脚设置为输出
    P1SEL1 |= BIT1; //将 ACLK 引脚设置为第二功能
    
    PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
    //激活先前配置的端口设置
    
    while (1)
    {
    P1OUT ^= BIT0; //使用异或切换 P1.0
    _DELAY_CYCLES (10000000); // 10000000*(1/MCLK)=1.25s
    }的延迟
    }
    
    void 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 故障标志
    
    __DELAY_CYCLLES ((unsigned int) 3000 * MCLK_FREQ_MHz);//等待 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);
    }
    }
    其他 // 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 被锁定
    } 

    BR、