「MSP430G2553 - クロック」の版間の差分

365行目: 365行目:
これにより、アプリケーションの要件に応じて、MCLKとSMCLKの周波数を個別に最適化することができる。<br>
これにより、アプリケーションの要件に応じて、MCLKとSMCLKの周波数を個別に最適化することができる。<br>
<br>
<br>
==== 他の周波数の設定 ====
==== 他の周波数の設定 / DCOの周波数が16[MHz]の場合 ====
MSP430G2553マイコンでは、DCOの周波数を分周して、SMCLKとMCLKの周波数を設定することができる。<br>
MSP430G2553マイコンでは、DCOの周波数を分周して、SMCLKとMCLKの周波数を設定することができる。<br>
分周比は、BCSTCLレジスタの<code>DIVM</code>ビットおよび<code>DIVS</code>ビットを使用して制御する。<br>
分周比は、BCSTCLレジスタの<code>DIVM</code>ビットおよび<code>DIVS</code>ビットを使用して制御する。<br>
430行目: 430行目:
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br>
==== 他の周波数の設定 / DCOの周波数が16[MHz]以外の場合 ====
MSP430G2553マイコンのDCOは、BCSCTL1レジスタ、および、DCOCTLレジスタに特定のビットを立てることにより、以下に示す周波数レンジで動作させることができる。<br>
* <code>CALBC1_1MHZ</code>と<code>CALDCO_1MHZ</code>
*: DCOの周波数を1[MHz]に設定
* <code>CALBC1_8MHZ</code> / <code>CALDCO_8MHZ</code>
*: DCOの周波数を8[MHz]に設定
* <code>CALBC1_12MHZ</code> / <code>CALDCO_12MHZ</code>
*: DCOの周波数を12[MHz]に設定
* <code>CALBC1_16MHZ</code> / <code>CALDCO_16MHZ</code>
*: DCOの周波数を16[MHz]に設定
<br>
DCOの周波数を変更すると、MCLKとSMCLKの分周比に応じて、それぞれの周波数が変化する。<br>
<br>
例えば、DCOの周波数を8[MHz]に設定した場合、以下に示すような組み合わせが可能となる。<br>
* MCLK = 8[MHz] (DIVM_0), SMCLK = 8[MHz] (DIVS_0)
* MCLK = 8[MHz] (DIVM_0), SMCLK = 4[MHz] (DIVS_1)
* MCLK = 8[MHz] (DIVM_0), SMCLK = 2[MHz] (DIVS_2)
* MCLK = 8[MHz] (DIVM_0), SMCLK = 1[MHz] (DIVS_3)
* MCLK = 4[MHz] (DIVM_1), SMCLK = 4[MHz] (DIVS_0)
* MCLK = 4[MHz] (DIVM_1), SMCLK = 2[MHz] (DIVS_1)
* MCLK = 4[MHz] (DIVM_1), SMCLK = 1[MHz] (DIVS_2)
* MCLK = 4[MHz] (DIVM_1), SMCLK = 0.5[MHz] (DIVS_3)
<br>
以下の例では、DCOの周波数を8[MHz]、MCLKを4[MHz]、SMCLKを2[MHz]に設定している。<br>
<br>
DCOの周波数を8[MHz]に設定して、MCLKとSMCLKの分周比をそれぞれ2に設定している。<br>
その結果、MCLKは4[MHz]、SMCLKは2[MHz]で動作する。<br>
<syntaxhighlight lang="c">
#include <msp430.h>
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;  // ウォッチドッグタイマの停止
    // 外部の水晶発振子のピン設定
    P2SEL |= BIT6 + BIT7;      // P2.6 - P2.7 : 水晶発振子のピン
    // クロックの設定
    BCSCTL1 |= DIVA_0;          // ACLK = LFXT1 / 1
    BCSCTL3 |= LFXT1S_0;        // LFXT1 = 32.768[kHz]
    __delay_cycles(50000);      // 水晶発振子が安定するまで待機
    // FLLの設定
    BCSCTL2 |= SELM_0 | DIVM_1 | DIVS_1;  // MCLK = DCO / 2, SMCLK = DCO / 2
    BCSCTL1 |= CALBC1_8MHZ;              // DCO周波数レンジを設定
    DCOCTL = CALDCO_8MHZ;                // DCO校正値を設定
    while(1) {
        // ...略
    }
}
</syntaxhighlight>
<br>
このように、DCOの周波数を変更すると、MCLKとSMCLKの周波数も変化する。<br>
アプリケーションの要件に応じて、適切なDCOの周波数と分周比を選択することが重要である。<br>
<br><br>
<br><br>