MSP430G2553 - クロック
概要
MSP430マイコンには、様々なクロックソースとクロック信号があり、これらを適切に設定することにより、システムの動作を最適化することができる。
- クロックソース
- DCO (Digitally Controlled Oscillator)
- 内部の高速クロックソースである。
- VLO (Very Low Power Oscillator)
- 内部の低速・低消費電力クロックソースである。
- XTAL
- 外部の水晶発振器を接続するためのクロックソースである。
- LFXT1
- 外部の低周波数水晶発振器を接続するためのクロックソースである。
- DCO (Digitally Controlled Oscillator)
- クロック信号
- MCLK (Master Clock)
- CPUとデジタル回路のタイミングを制御するクロック信号である。
- SMCLK (Subsystem Master Clock)
- 周辺モジュールに供給されるクロック信号である。
- ACLK (Auxiliary Clock)
- 低速の周辺モジュールに供給されるクロック信号である。
- MCLK (Master Clock)
- クロック制御
- UCS (Unified Clock System) モジュールや、CS (Clock System) モジュールを使用してクロックを設定する。
- クロックソースの選択、クロック周波数の設定、クロック信号の有効化 / 無効化等を行う。
- クロック分周器
- クロックソースの周波数を分周して、必要なクロック周波数を生成する。
- MCLK、SMCLK、ACLKごとに独立した分周器がある。
- 低電力モード
- クロックを停止させることにより、消費電力を抑えることができる。
- 低電力モードには、MSP430マイコンの動作を停止するモードやクロック信号を選択的に停止するモードがある。
- クロックの切り替え
- 動的にクロックソースを切り替えることができる。
- 例えば、高速動作が必要な場合はDCOを使用して、低消費電力が必要な場合はVLOを使用する等の切り替えが可能である。
MSP430のクロックシステムは、アプリケーションの要件に合わせて柔軟に設定することができる。
適切なクロックソースとクロック周波数を選択して、低電力モードを活用することで、性能と消費電力のバランスを取ることができる。
また、動的なクロックの切り替えにより、状況に応じた最適な動作を実現することができる。
DCO
DCO (Digitally Controlled Oscillator) は、デジタル制御発振器のことである。
これは、MSP430マイコンに内蔵されているクロック源の1つである。
DCOの主な特徴を以下に示す。
- デジタル制御
- DCOの周波数は、デジタル的に制御および調整が可能である。
- 周波数は、DCOCTLレジスタとBCSCTLレジスタの設定により決定される。
- 広い周波数範囲
- DCOは、数十[kHz]から数十[MHz]までの広い周波数範囲で動作できる。
- MSP430G2553の場合、DCOの周波数は約1[MHz]から16[MHz]まで設定可能である。
- 校正機能
- DCOは、工場出荷時に校正された値を持つ。
- これらの校正値 (CALBCxとCALDCOx) を使用することにより、DCOの周波数を高精度に設定できる。
- クロック源としての役割
- DCOは、MSP430マイコンの主要なクロック源として使用される。
- 多くの場合、MCLKとSMCLKにDCOからのクロックが供給される。
- 低消費電力
- DCOは、外部クリスタルと比較して低消費電力である。
- バッテリー駆動のアプリケーションに適している。
DCOは、MSP430マイコンの柔軟性と低消費電力性を支える重要な機能の1つである。
アプリケーションの要件に応じて、DCOの周波数を適切に設定することにより、最適なパフォーマンスと消費電力のバランスを達成できる。
ただし、DCOは温度や電源電圧の変動の影響を受けやすいため、高い周波数安定性が必要な場合は、外部クリスタルを使用することが推奨される。
FLL
FLL (Frequency Locked Loop) は、周波数ロックループの略称で、MSP430マイコンに内蔵されているクロック制御機能の1つである。
FLLは、DCO (デジタル制御発振器) の周波数を安定化して、高速かつ正確なクロックを生成するために使用される。
FLLの設定は、BCSTCLレジスタとDCOCTLレジスタを通じて行う。
これらのレジスタを適切に設定することにより、目的の周波数とロック状態を実現することができる。
FLLの主な特徴と動作原理を以下に示す。
- 基準クロックとの比較
- FLLは、低速の基準クロック (通常は、32.768[kHz]の外部クリスタル) を使用する。
- DCOの周波数を、この基準クロックの整数倍に安定化させる。
- 分周器と比較器
- FLLには、基準クロックとDCOの出力をそれぞれ分周するための分周器がある。
- 分周された信号は、比較器に入力される。
- 比較器は、両者の位相と周波数を比較する。
- DCOの周波数調整
- 比較器の出力に基づいて、FLLはDCOの周波数を自動的に調整する。
- DCOの周波数が基準クロックの整数倍からずれている場合、FLLはDCOの周波数を増減させて、ずれを修正する。
- ロックとアンロック
- FLLがDCOの周波数を基準クロックの整数倍に安定化させることを「ロック」と呼ぶ。
- 一旦ロックされると、FLLは継続的にDCOの周波数を監視して、ずれが生じた場合には自動的に調整を行う。
- ロックが外れることを「アンロック」と呼ぶ。
- 柔軟性と低消費電力
- FLLを使用することにより、MSP430マイコンは外部クリスタルを使用せずに高速かつ正確なクロックを生成できる。
- これにより、システムの柔軟性が向上して、部品点数と消費電力を削減できる。
MCLK (Master Clock)
MSP430マイコン全般のメインクロックのことである。
メインクロックの動作とデジタル回路のタイミングを制御するためのものである。
クロックソースは、DCO、VLO、XTAL等から選択できる。
クロック周波数は、クロックソースの周波数をクロック分周器で分周することで設定する。
低電力モードでは、MCLKを停止させることでMSP430マイコンの主動作を停止して、消費電力を抑えることができる。
SMCLK (Subsystem Master Clock)
周辺モジュール用のクロックのことである。
タイマ、UART、SPI、I2C等の周辺モジュールに供給されるものである。
クロックソースは、DCO、VLO、XTAL等から選択できる。
クロック周波数は、クロックソースの周波数をクロック分周器で分周することで設定する。
低電力モードでは、SMCLKを停止させることにより、消費電力を抑えることができる。
MCLKとSMCLKの違い
- 用途
- MCLKはMSP430マイコン用、SMCLKは周辺モジュール用である。
- 動作
- SMCLKは、周辺モジュールの動作に影響する。
- MCLKは、CPUの動作に影響する。
- 低電力モード
- SMCLKを停止させても、MSP430マイコンは動作可能である。
- MCLKを停止させると、MSP430マイコンも停止する。
- 周波数
- MCLKとSMCLKは、同じクロックソースを使用できるが、分周率を変えることで異なる周波数で動作させることができる。
MCLKとSMCLKを適切に設定することにより、アプリケーションの要件に合わせたシステムクロックを実現できる。
また、低電力モードでは、これらのクロックを選択的に停止させることにより、消費電力を最適化できる。
ACLK (Auxiliary Clock)
ACLKとは
MSP430マイコンの低速の周辺モジュール用のクロック信号である。
低速の周辺モジュールに供給されるクロック信号であり、一般的に32[kHz]以下の周波数で動作する。
主に、タイマ、リアルタイムクロック (RTC)、ウォッチドッグタイマ (WDT) 等の低速モジュールに使用される。
ACLKは、MSP430マイコンの低消費電力化に重要な役割を果たす。
適切なクロックソースと周波数を選択することにより、低速の周辺モジュールを効率的に動作させることができる。
また、VLOを使用することで、さらに低消費電力化が可能になる。
クロックソース
ACLKのクロックソースは、以下の中から選択できる。
- VLO (Very Low Power Oscillator)
- 内部の低速・低消費電力クロックソースである。
- LFXT1 (Low Frequency Crystal Oscillator)
- 外部の低周波数水晶発振器を接続するためのクロックソースである。
クロックソースの選択は、UCBCSRレジスタまたはCSCTLxレジスタ (xはモジュールにより異なる) で行う。
- LFXT1の設定
- LFXT1S_0:LFXT1を使用 (デフォルト)
- LFXT1S_1
- 予約済み
- LFXT1S_2
- VLOを使用
- LFXT1S_3
- LFXT1のバイパスモード (外部クロックソースを直接使用)
クロック周波数
ACLKの周波数は、選択したクロックソースの周波数をそのまま使用する、または、分周器で分周した周波数になる。
分周率は、UCBCSRレジスタまたはCSCTLxレジスタで設定することができる。
低消費電力
ACLKは、低速の周辺モジュールに使用されるため、消費電力が低く抑えられる。
VLOをクロックソースとして使用することにより、さらに低消費電力化が可能となる。
使用例
- リアルタイムクロック (RTC)
- ACLKを使用して、低消費電力で正確な時間管理を行う。
- ウォッチドッグタイマ (WDT)
- ACLKを使用して、システムの異常動作を監視してリセットを行う。
- 低速のタイマ
- ACLKを使用して、長期間のタイミング制御を行う。
注意点
- ACLKを使用する場合、クロックソースの安定性に注意が必要である。
- 外部の水晶発振器を使用する場合は、適切な負荷容量と発振回路の設計が重要である。
サンプルコード
以下の例では、ACLKのクロックソースをVL0に選択している。
- まず、WDTを停止する。
これは、クロックの設定を変更する前に必要な処理である。 - BCSCTL3レジスタの
LFXT1S
ビットを設定して、ACLKのクロックソースを選択する。
以下の例では、LFXT1S_2
を設定することにより、ACLKのクロックソースをVLOに設定している。
※注意
クロックソースを切り替える際は、クロックが安定するまで待つ必要がある。
外部クロックソースを使用する場合は、適切な発振回路の設計が必要である。
#include <msp430.h>
int main(void)
{
// WDTを停止
WDTCTL = WDTPW | WDTHOLD;
// ACLKのクロックソースをVLOに設定
BCSCTL3 |= LFXT1S_2;
// その他の初期化処理
// ...略
while(1) {
// メインループ
// ...略
}
}
クロックの選択
デフォルトの設定
MSP430G2553マイコンは、クロックの指定が無い場合は、以下に示すクロック周波数で動作する。
- MCLK (マスタクロック)
- 1.1 [MHz]
- MCLKは、CPUとシステムクロックに使用される。
- デフォルトでは、内蔵のDCO (デジタル制御発振器) が
CALBC1_1MHZ
とCALDCO_1MHZ
の校正値を使用して、1.1[MHz]に設定されている。
- SMCLK (サブマインクロック)
- 1.1 [MHz]
- SMCLKは、ペリフェラル (タイマ、UART、SPI、I2C等) のクロックに使用される。
- デフォルトでは、SMCLKもDCOを使用して、MCLKと同じ1.1[MHz]で動作する。
- ACLK (補助クロック)
- 12 [kHz]
- ACLKは、低速のペリフェラル (ウォッチドッグタイマ、リアルタイムクロック等) のクロックに使用される。
- デフォルトでは、内蔵の低速オシレータ (VLO) が使用されており、約12[kHz]で動作する。
以下の例は、デフォルト設定でのクロック構成を示している。
#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) {
// ...略
}
}
MCLK / SMCLKを16[MHz]に設定
32.768[kHz]の外部水晶発振子を使用して、MSP430G2553を16[MHz]で動作させるには、内蔵のFLL (周波数ロックループ) を使用する。
FLLは、低速の外部クロックを基準にして、高速のDCOの周波数を安定化させる機能である。
以下の例では、32.768[kHz]の外部水晶発振子を使用してFLLを設定し、16[MHz]で動作させている。
- 外部クロック用のピンを設定する。
- 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]に設定する。
#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) {
// ...略
}
}
上記のサンプルコードでは、FLLはDCOの周波数を16[MHz]に安定化させて、MCLKとSMCLKに16[MHz]のクロックを供給している。
BCSCTL2 |= SELM_0 | SELS;
SELM
ビットを0
に設定して、MCLKの供給元をDCOに設定する。SELS
ビットを1
に設定して、SMCLKの供給元もDCOに設定する。
BCSCTL1 |= CALBC1_16MHZ;
CALBC1_16MHZ
の値をBCSTCL1レジスタに設定して、DCO周波数レンジを16[MHz]に設定する。
DCOCTL = CALDCO_16MHZ;
CALDCO_16MHZ
の値をDCOCTLレジスタに設定して、DCO校正値を16[MHz]に設定する。
MCLK 16[MHz] / SMCLK 8[MHz]に設定
MSP430G2553マイコンでは、MCLKとは別に、SMCLKを他の周波数に設定することが可能である。
SMCLKの周波数は、DCOの周波数を分周することで得られる。
以下の例では、MCLKを16[MHz]、SMCLKを8[MHz]に設定している。
BCSCTL2 |= SELM_0 | DIVS_1;
では、SELM
ビットを0
に設定することにより、
MCLKの供給元をDCOに設定、DIVS
ビットを1に設定して、SMCLKの分周比を2にしている。
これにより、DCOの周波数 (16[MHz]) がそのままMCLKに供給されて、SMCLKにはDCOの周波数を2で割った8[MHz]が供給される。
DCOの周波数レンジと校正値を16[MHz]に設定している。
#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) {
// ...略
}
}
SMCLKの分周比は、DIVS
ビットを変更することにより、調整することができる。
以下に、DIVS
ビットの設定とそれに対応するSMCLKの分周比を示す。
- DIVS_0
- SMCLK = DCO / 1 (分周なし)
- DIVS_1
- SMCLK = DCO / 2
- DIVS_2
- SMCLK = DCO / 4
- DIVS_3
- SMCLK = DCO / 8
したがって、DCOの周波数を16[MHz]に設定した場合、SMCLKは16[MHz]、8[MHz]、4[MHz]、2[MHz]のいずれかに設定できる。
これにより、アプリケーションの要件に応じて、MCLKとSMCLKの周波数を個別に最適化することができる。
他の周波数の設定 / DCOの周波数が16[MHz]の場合
MSP430G2553マイコンでは、DCOの周波数を分周して、SMCLKとMCLKの周波数を設定することができる。
分周比は、BCSTCLレジスタのDIVM
ビットおよびDIVS
ビットを使用して制御する。
- MCLKの分周比 (DIVMビット)
- DIVM_0 (分周なし)
- MCLK = DCO / 1
- DIVM_1
- MCLK = DCO / 2
- DIVM_2
- MCLK = DCO / 4
- DIVM_3
- MCLK = DCO / 8
- DIVM_0 (分周なし)
- SMCLKの分周比(DIVSビット)
- DIVS_0 (分周なし)
- SMCLK = DCO / 1
- DIVS_1
- SMCLK = DCO / 2
- DIVS_2
- SMCLK = DCO / 4
- DIVS_3
- SMCLK = DCO / 8
- DIVS_0 (分周なし)
これらの分周比を組み合わせることにより、DCOの周波数から必要なSMCLKとMCLKの周波数を得ることができる。
例えば、DCOの周波数が16[MHz]の場合、以下に示すような組み合わせが可能である。
- 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)
以下の例では、DCOの周波数を16[MHz]、MCLKを8[MHz]、SMCLKを4[MHz]に設定している。
BCSCTL2 |= SELM_0 | DIVM_1 | DIVS_2;
により、DIVM
ビットを1
に設定してMCLKの分周比を2、DIVS
ビットを2に設定してSMCLKの分周比を4にしている。
これにより、DCOの周波数 (16[MHz]) がMCLKに2分周されて8[MHz]、SMCLKに4分周されて4[MHz]が供給される。
#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) {
// ...略
}
}
他の周波数の設定 / DCOの周波数が16[MHz]以外の場合
MSP430G2553マイコンのDCOは、BCSCTL1レジスタ、および、DCOCTLレジスタに特定のビットを立てることにより、以下に示す周波数レンジで動作させることができる。
CALBC1_1MHZ
とCALDCO_1MHZ
- DCOの周波数を1[MHz]に設定
CALBC1_8MHZ
/CALDCO_8MHZ
- DCOの周波数を8[MHz]に設定
CALBC1_12MHZ
/CALDCO_12MHZ
- DCOの周波数を12[MHz]に設定
CALBC1_16MHZ
/CALDCO_16MHZ
- DCOの周波数を16[MHz]に設定
DCOの周波数を変更すると、MCLKとSMCLKの分周比に応じて、それぞれの周波数が変化する。
例えば、DCOの周波数を8[MHz]に設定した場合、以下に示すような組み合わせが可能となる。
- 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)
以下の例では、DCOの周波数を8[MHz]、MCLKを4[MHz]、SMCLKを2[MHz]に設定している。
DCOの周波数を8[MHz]に設定して、MCLKとSMCLKの分周比をそれぞれ2に設定している。
その結果、MCLKは4[MHz]、SMCLKは2[MHz]で動作する。
#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) {
// ...略
}
}
このように、DCOの周波数を変更すると、MCLKとSMCLKの周波数も変化する。
アプリケーションの要件に応じて、適切なDCOの周波数と分周比を選択することが重要である。