📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

ページの作成:「== 概要 == MSP430マイコンには、様々なクロックソースとクロック信号があり、これらを適切に設定することにより、システムの動作を最適化することができる。<br> <br> * クロックソース ** DCO (Digitally Controlled Oscillator) **: 内部の高速クロックソースである。 ** VLO (Very Low Power Oscillator) **: 内部の低速・低消費電力クロックソースである。 ** XTAL **: 外部の…」
 
文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{…
 
(同じ利用者による、間の8版が非表示)
40行目: 40行目:
<br>
<br>
また、動的なクロックの切り替えにより、状況に応じた最適な動作を実現することができる。<br>
また、動的なクロックの切り替えにより、状況に応じた最適な動作を実現することができる。<br>
<br><br>
== DCO ==
DCO (Digitally Controlled Oscillator) は、デジタル制御発振器のことである。<br>
これは、MSP430マイコンに内蔵されているクロック源の1つである。<br>
<br>
DCOの主な特徴を以下に示す。<br>
* デジタル制御
*: DCOの周波数は、デジタル的に制御および調整が可能である。
*: 周波数は、DCOCTLレジスタとBCSCTLレジスタの設定により決定される。
*: <br>
* 広い周波数範囲
*: DCOは、数十[kHz]から数十[MHz]までの広い周波数範囲で動作できる。
*: MSP430G2553の場合、DCOの周波数は約1[MHz]から16[MHz]まで設定可能である。
*: <br>
* 校正機能
*: DCOは、工場出荷時に校正された値を持つ。
*: これらの校正値 (CALBCxとCALDCOx) を使用することにより、DCOの周波数を高精度に設定できる。
*: <br>
* クロック源としての役割
*: DCOは、MSP430マイコンの主要なクロック源として使用される。
*: 多くの場合、MCLKとSMCLKにDCOからのクロックが供給される。
*: <br>
* 低消費電力
*: DCOは、外部クリスタルと比較して低消費電力である。
*: バッテリー駆動のアプリケーションに適している。
<br>
DCOは、MSP430マイコンの柔軟性と低消費電力性を支える重要な機能の1つである。<br>
アプリケーションの要件に応じて、DCOの周波数を適切に設定することにより、最適なパフォーマンスと消費電力のバランスを達成できる。<br>
<br>
ただし、DCOは温度や電源電圧の変動の影響を受けやすいため、高い周波数安定性が必要な場合は、外部クリスタルを使用することが推奨される。<br>
<br><br>
== FLL ==
FLL (Frequency Locked Loop) は、周波数ロックループの略称で、MSP430マイコンに内蔵されているクロック制御機能の1つである。<br>
FLLは、DCO (デジタル制御発振器) の周波数を安定化して、高速かつ正確なクロックを生成するために使用される。<br>
<br>
FLLの設定は、<u>BCSTCL</u>レジスタと<u>DCOCTL</u>レジスタを通じて行う。<br>
これらのレジスタを適切に設定することにより、目的の周波数とロック状態を実現することができる。<br>
<br>
FLLの主な特徴と動作原理を以下に示す。<br>
* 基準クロックとの比較
*: FLLは、低速の基準クロック (通常は、32.768[kHz]の外部クリスタル) を使用する。
*: DCOの周波数を、この基準クロックの整数倍に安定化させる。
*: <br>
* 分周器と比較器
*: FLLには、基準クロックとDCOの出力をそれぞれ分周するための分周器がある。
*: 分周された信号は、比較器に入力される。
*: 比較器は、両者の位相と周波数を比較する。
*: <br>
* DCOの周波数調整
*: 比較器の出力に基づいて、FLLはDCOの周波数を自動的に調整する。
*: DCOの周波数が基準クロックの整数倍からずれている場合、FLLはDCOの周波数を増減させて、ずれを修正する。
*: <br>
* ロックとアンロック
*: FLLがDCOの周波数を基準クロックの整数倍に安定化させることを「ロック」と呼ぶ。
*: 一旦ロックされると、FLLは継続的にDCOの周波数を監視して、ずれが生じた場合には自動的に調整を行う。
*: ロックが外れることを「アンロック」と呼ぶ。
*: <br>
* 柔軟性と低消費電力
*: FLLを使用することにより、MSP430マイコンは外部クリスタルを使用せずに高速かつ正確なクロックを生成できる。
*: これにより、システムの柔軟性が向上して、部品点数と消費電力を削減できる。
<br><br>
<br><br>


165行目: 227行目:
<br><br>
<br><br>


== クロックの選択 ==
==== デフォルトの設定 ====
MSP430G2553マイコンは、クロックの指定が無い場合は、以下に示すクロック周波数で動作する。<br>
* MCLK (マスタクロック)
*: 1.1 [MHz]
*: MCLKは、CPUとシステムクロックに使用される。
*: デフォルトでは、内蔵のDCO (デジタル制御発振器) が<code>CALBC1_1MHZ</code>と<code>CALDCO_1MHZ</code>の校正値を使用して、1.1[MHz]に設定されている。
*: <br>
* SMCLK (サブマインクロック)
*: 1.1 [MHz]
*: SMCLKは、ペリフェラル (タイマ、UART、SPI、I2C等) のクロックに使用される。
*: デフォルトでは、SMCLKもDCOを使用して、MCLKと同じ1.1[MHz]で動作する。
*: <br>
* ACLK (補助クロック)
*: 12 [kHz]
*: ACLKは、低速のペリフェラル (ウォッチドッグタイマ、リアルタイムクロック等) のクロックに使用される。
*: デフォルトでは、内蔵の低速オシレータ (VLO) が使用されており、約12[kHz]で動作する。
<br>
以下の例は、デフォルト設定でのクロック構成を示している。<br>
<syntaxhighlight lang="c">
#include <msp430.h>
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;  // ウォッチドッグタイマを停止
    // Default clock configuration:
    // MCLK = DCO = 1.1 MHz
    // SMCLK = DCO = 1.1 MHz
    // ACLK = VLO = ~12 kHz
    while(1) {
        // ...略
    }
}
</syntaxhighlight>
<br>
==== MCLK / SMCLKを16[MHz]に設定 ====
32.768[kHz]の外部水晶発振子を使用して、MSP430G2553を16[MHz]で動作させるには、内蔵のFLL (周波数ロックループ) を使用する。<br>
<u>FLLは、低速の外部クロックを基準にして、高速のDCOの周波数を安定化させる機能である。</u><br>
<br>
以下の例では、32.768[kHz]の外部水晶発振子を使用してFLLを設定し、16[MHz]で動作させている。<br>
# 外部クロック用のピンを設定する。
#* P2.6 (XTAL IN)
#* P2.7 (XTAL OUT)
# BCSTCLレジスタを設定して、ACLK (補助クロック) の分周比を1に設定する。
# BCSCTL3レジスタを設定して、LFXT1 (低周波クリスタル) を32.768[kHz]の水晶発振子に設定する。
# 水晶発振子の安定化を待つ。
# BCSCTL2レジスタを設定して、MCLK (マスタクロック) とSMCLK (サブマスタクロック) の供給元をDCOに設定する。
# BCSCTL1レジスタとDCOCTLレジスタを設定して、DCOの周波数レンジと校正値を16[MHz]に設定する。
<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 | SELS;  // MCLK = DCO, SMCLK = DCO
    BCSCTL1 |= CALBC1_16MHZ;    // DCO周波数レンジの設定
    DCOCTL = CALDCO_16MHZ;      // DCO校正値の設定
    while(1) {
      // ...略
    }
}
</syntaxhighlight>
<br>
上記のサンプルコードでは、FLLはDCOの周波数を16[MHz]に安定化させて、MCLKとSMCLKに16[MHz]のクロックを供給している。<br>
* <code>BCSCTL2 |= SELM_0 | SELS;</code>
*: <code>SELM</code>ビットを<code>0</code>に設定して、MCLKの供給元をDCOに設定する。
*: <code>SELS</code>ビットを<code>1</code>に設定して、SMCLKの供給元もDCOに設定する。
*: <br>
* <code>BCSCTL1 |= CALBC1_16MHZ;</code>
*: <code>CALBC1_16MHZ</code>の値をBCSTCL1レジスタに設定して、DCO周波数レンジを16[MHz]に設定する。
*: <br>
* <code>DCOCTL = CALDCO_16MHZ;</code>
*: <code>CALDCO_16MHZ</code>の値をDCOCTLレジスタに設定して、DCO校正値を16[MHz]に設定する。
<br>
==== MCLK 16[MHz] / SMCLK 8[MHz]に設定 ====
MSP430G2553マイコンでは、MCLKとは別に、SMCLKを他の周波数に設定することが可能である。<br>
SMCLKの周波数は、DCOの周波数を分周することで得られる。<br>
<br>
以下の例では、MCLKを16[MHz]、SMCLKを8[MHz]に設定している。<br>
<br>
<code>BCSCTL2 |= SELM_0 | DIVS_1;</code>では、<code>SELM</code>ビットを<code>0</code>に設定することにより、<br>
MCLKの供給元をDCOに設定、<code>DIVS</code>ビットを</code>1</code>に設定して、SMCLKの分周比を2にしている。<br>
これにより、DCOの周波数 (16[MHz]) がそのままMCLKに供給されて、SMCLKにはDCOの周波数を2で割った8[MHz]が供給される。<br>
DCOの周波数レンジと校正値を16[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);      // 水晶発振子が安定するまで待機 : 50[mS]
    // FLLの設定
    BCSCTL2 |= SELM_0 | DIVS_1;  // MCLK = DCO, SMCLK = DCO / 2
    BCSCTL1 |= CALBC1_16MHZ;    // DCO周波数レンジの設定
    DCOCTL  = CALDCO_16MHZ;    // DCO校正値の設定
    while(1) {
        // ...略
    }
}
</syntaxhighlight>
<br>
SMCLKの分周比は、<code>DIVS</code>ビットを変更することにより、調整することができる。<br>
以下に、<code>DIVS</code>ビットの設定とそれに対応するSMCLKの分周比を示す。<br>
* DIVS_0
*: SMCLK = DCO / 1 (分周なし)
* DIVS_1
*: SMCLK = DCO / 2
* DIVS_2
*: SMCLK = DCO / 4
* DIVS_3
*: SMCLK = DCO / 8
<br>
したがって、DCOの周波数を16[MHz]に設定した場合、SMCLKは16[MHz]、8[MHz]、4[MHz]、2[MHz]のいずれかに設定できる。<br>
<br>
これにより、アプリケーションの要件に応じて、MCLKとSMCLKの周波数を個別に最適化することができる。<br>
<br>
==== 他の周波数の設定 / DCOの周波数が16[MHz]の場合 ====
MSP430G2553マイコンでは、DCOの周波数を分周して、SMCLKとMCLKの周波数を設定することができる。<br>
分周比は、BCSTCLレジスタの<code>DIVM</code>ビットおよび<code>DIVS</code>ビットを使用して制御する。<br>
<br>
* MCLKの分周比 (DIVMビット)
** DIVM_0 (分周なし)
**: MCLK = DCO / 1
** DIVM_1
**: MCLK = DCO / 2
** DIVM_2
**: MCLK = DCO / 4
** DIVM_3
**: MCLK = DCO / 8
*: <br>
* SMCLKの分周比(DIVSビット)
** DIVS_0 (分周なし)
**: SMCLK = DCO / 1
** DIVS_1
**: SMCLK = DCO / 2
** DIVS_2
**: SMCLK = DCO / 4
** DIVS_3
**: SMCLK = DCO / 8
<br>
これらの分周比を組み合わせることにより、DCOの周波数から必要なSMCLKとMCLKの周波数を得ることができる。<br>
<br>
例えば、<u>DCOの周波数が16[MHz]の場合</u>、以下に示すような組み合わせが可能である。<br>
* MCLK = 16[MHz] (DIVM_0), SMCLK = 16[MHz] (DIVS_0)
* MCLK = 16[MHz] (DIVM_0), SMCLK = 8[MHz] (DIVS_1)
* MCLK = 16[MHz] (DIVM_0), SMCLK = 4[MHz] (DIVS_2)
* MCLK = 16[MHz] (DIVM_0), SMCLK = 2[MHz] (DIVS_3)
* MCLK = 8[MHz] (DIVM_1), SMCLK = 8[MHz] (DIVS_0)
* MCLK = 8[MHz] (DIVM_1), SMCLK = 4[MHz] (DIVS_1)
* MCLK = 8[MHz] (DIVM_1), SMCLK = 2[MHz] (DIVS_2)
* MCLK = 8[MHz] (DIVM_1), SMCLK = 1[MHz] (DIVS_3)
<br>
以下の例では、DCOの周波数を16[MHz]、MCLKを8[MHz]、SMCLKを4[MHz]に設定している。<br>
<br>
<code>BCSCTL2 |= SELM_0 | DIVM_1 | DIVS_2;</code>により、<code>DIVM</code>ビットを<code>1</code>に設定してMCLKの分周比を2、<code>DIVS</code>ビットを2に設定してSMCLKの分周比を4にしている。<br>
これにより、DCOの周波数 (16[MHz]) がMCLKに2分周されて8[MHz]、SMCLKに4分周されて4[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_2;  // MCLK = DCO / 2, SMCLK = DCO / 4
    BCSCTL1 |= CALBC1_16MHZ;              // DCO周波数レンジの設定
    DCOCTL  = CALDCO_16MHZ;              // DCO校正値の設定
    while(1) {
        // ...略
    }
}
</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>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:MSP430]]
[[カテゴリ:MSP430]]