MSP430F149 - クロック
概要
MSP430マイコンには、様々なクロックソースとクロック信号があり、これらを適切に設定することにより、システムの動作を最適化することができる。
- クロックソース
- DCO (Digitally Controlled Oscillator)
- 内部の高速クロックソースである。
- LFXT1 (Low Frequency Crystal Oscillator)
- 外部の低周波数水晶発振器を接続するためのクロックソースである。
- XT2 (High Frequency Crystal Oscillator)
- 外部の高周波数水晶発振器を接続するためのクロックソースである。
- DCO (Digitally Controlled Oscillator)
- クロック信号
- MCLK (Master Clock)
- CPUとデジタル回路のタイミングを制御するクロック信号である。
- SMCLK (Subsystem Master Clock)
- 周辺モジュールに供給されるクロック信号である。
- ACLK (Auxiliary Clock)
- 低速の周辺モジュールに供給されるクロック信号である。
- MCLK (Master Clock)
- クロック制御
- Basic Clock Module (BCM) を使用してクロックを設定する。
- クロックソースの選択、クロック周波数の設定、クロック信号の有効化 / 無効化等を行う。
- クロック分周器
- クロックソースの周波数を分周して、必要なクロック周波数を生成する。
- MCLK、SMCLK、ACLKごとに独立した分周器がある。
- 低電力モード
- クロックを停止させることにより、消費電力を抑えることができる。
- 低電力モードには、MSP430マイコンの動作を停止するモードやクロック信号を選択的に停止するモードがある。
- クロックの切り替え
- 動的にクロックソースを切り替えることができる。
- 例えば、高速動作が必要な場合はXT2を使用して、低消費電力が必要な場合はLFXT1を使用する等の切り替えが可能である。
MSP430のクロックシステムは、アプリケーションの要件に合わせて柔軟に設定することができる。
適切なクロックソースとクロック周波数を選択して、低電力モードを活用することで、性能と消費電力のバランスを取ることができる。
また、動的なクロックの切り替えにより、状況に応じた最適な動作を実現することができる。
DCO
DCO (Digitally Controlled Oscillator) は、デジタル制御発振器のことである。
これは、MSP430マイコンに内蔵されているクロック源の1つである。
DCOの主な特徴を以下に示す。
- デジタル制御
- DCOの周波数は、デジタル的に制御および調整が可能である。
- 周波数は、DCOCTLレジスタとBCSCTL1レジスタの設定により決定される。
- 広い周波数範囲
- DCOは、数十[kHz]から数[MHz]までの広い周波数範囲で動作できる。
- MSP430F149の場合、DCOの周波数は約100[kHz]から8[MHz]程度まで設定可能である。
- 速い起動時間
- DCOは、外部クリスタルと比較して起動時間が非常に短い。
- これにより、低電力モードからの高速復帰が可能となる。
- クロック源としての役割
- DCOは、MSP430マイコンの主要なクロック源として使用される。
- 多くの場合、MCLKとSMCLKにDCOからのクロックが供給される。
- 低消費電力
- DCOは、外部クリスタルと比較して低消費電力である。
- バッテリー駆動のアプリケーションに適している。
DCOは、MSP430マイコンの柔軟性と低消費電力性を支える重要な機能の1つである。
アプリケーションの要件に応じて、DCOの周波数を適切に設定することにより、最適なパフォーマンスと消費電力のバランスを達成できる。
ただし、DCOは温度や電源電圧の変動の影響を受けやすいため、高い周波数安定性が必要な場合は、外部クリスタルを使用することが推奨される。
FLL
FLL (Frequency Locked Loop) は、周波数ロックループの略称で、MSP430マイコンに内蔵されているクロック制御機能の1つである。
FLLは、DCO (デジタル制御発振器) の周波数を安定化して、高速かつ正確なクロックを生成するために使用される。
FLLの設定は、BCSCTL1レジスタとDCOCTLレジスタを通じて行う。
これらのレジスタを適切に設定することにより、目的の周波数とロック状態を実現することができる。
FLLの主な特徴と動作原理を以下に示す。
- 基準クロックとの比較
- FLLは、低速の基準クロック (通常は、32.768[kHz]の外部クリスタル) を使用する。
- DCOの周波数を、この基準クロックの整数倍に安定化させる。
- 分周器と比較器
- FLLには、基準クロックとDCOの出力をそれぞれ分周するための分周器がある。
- 分周された信号は、比較器に入力される。
- 比較器は、両者の位相と周波数を比較する。
- DCOの周波数調整
- 比較器の出力に基づいて、FLLはDCOの周波数を自動的に調整する。
- DCOの周波数が基準クロックの整数倍からずれている場合、FLLはDCOの周波数を増減させて、ずれを修正する。
- ロックとアンロック
- FLLがDCOの周波数を基準クロックの整数倍に安定化させることを「ロック」と呼ぶ。
- 一旦ロックされると、FLLは継続的にDCOの周波数を監視して、ずれが生じた場合には自動的に調整を行う。
- ロックが外れることを「アンロック」と呼ぶ。
- 柔軟性と周波数安定性
- FLLを使用することにより、MSP430マイコンは低周波の外部クリスタルから高速かつ正確なクロックを生成できる。
- これにより、システムの柔軟性が向上して、高周波クリスタルを使用する必要がなくなる。
XT2
XT2 (High Frequency Crystal Oscillator) は、MSP430F149マイコンに搭載されている高周波外部クリスタル用のクロックソースである。
XT2の主な特徴を以下に示す。
- 高周波動作
- XT2は、400[kHz]から8[MHz]までの高周波クリスタルを接続することができる。
- 高速動作が必要なアプリケーションに適している。
- 高精度
- 外部クリスタルを使用するため、DCOと比較して周波数精度と安定性に優れている。
- 温度や電源電圧の変動に対しても安定した動作が可能である。
- クロック源としての用途
- XT2は、MCLKとSMCLKのクロック源として使用できる。
- 高速かつ高精度なクロックが必要な通信プロトコル等で有用である。
- 消費電力
- XT2を使用する場合、外部クリスタルの発振に電力が必要となる。
- DCOと比較すると消費電力が高くなる傾向がある。
- 起動時間
- 外部クリスタルの発振が安定するまでに時間が必要である。
- DCOと比較して起動時間が長くなる。
XT2は、高速動作と高精度が求められるアプリケーションにおいて重要なクロックソースである。
ただし、消費電力と起動時間のトレードオフを考慮して、適切に使用する必要がある。
MCLK (Master Clock)
MSP430マイコン全般のメインクロックのことである。
メインクロックの動作とデジタル回路のタイミングを制御するためのものである。
クロックソースは、DCO、LFXT1、XT2等から選択できる。
クロック周波数は、クロックソースの周波数をクロック分周器で分周することで設定する。
低電力モードでは、MCLKを停止させることでMSP430マイコンの主動作を停止して、消費電力を抑えることができる。
SMCLK (Subsystem Master Clock)
周辺モジュール用のクロックのことである。
タイマ、UART、SPI、I2C等の周辺モジュールに供給されるものである。
クロックソースは、DCO、LFXT1、XT2等から選択できる。
クロック周波数は、クロックソースの周波数をクロック分周器で分周することで設定する。
低電力モードでは、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マイコンの低消費電力化に重要な役割を果たす。
適切なクロックソースと周波数を選択することにより、低速の周辺モジュールを効率的に動作させることができる。
クロックソース
ACLKのクロックソースは、以下の中から選択できる。
- LFXT1 (Low Frequency Crystal Oscillator)
- 外部の低周波数水晶発振器を接続するためのクロックソースである。
- 一般的には32.768[kHz]のクリスタルが使用される。
クロックソースの選択は、BCSCTL1レジスタで行う。
- XTS ビットの設定
- XTS = 0
- LFXT1を低周波モードで使用 (32.768[kHz]クリスタル用)
- XTS = 1
- LFXT1を高周波モードで使用 (400[kHz]以上のクリスタル用)
- XTS = 0
クロック周波数
ACLKの周波数は、選択したクロックソースの周波数を分周器で分周した周波数になる。
分周率は、BCSCTL1レジスタのDIVAビットで設定することができる。
- DIVAビットの設定
- DIVA_0
- ACLK = LFXT1 / 1 (分周なし)
- DIVA_1
- ACLK = LFXT1 / 2
- DIVA_2
- ACLK = LFXT1 / 4
- DIVA_3
- ACLK = LFXT1 / 8
- DIVA_0
低消費電力
ACLKは、低速の周辺モジュールに使用されるため、消費電力が低く抑えられる。
32.768[kHz]のクリスタルを使用することにより、低消費電力で正確な時間管理を行うことができる。
使用例
- リアルタイムクロック (RTC)
- ACLKを使用して、低消費電力で正確な時間管理を行う。
- ウォッチドッグタイマ (WDT)
- ACLKを使用して、システムの異常動作を監視してリセットを行う。
- 低速のタイマ
- ACLKを使用して、長期間のタイミング制御を行う。
注意点
- ACLKを使用する場合、クロックソースの安定性に注意が必要である。
- 外部の水晶発振器を使用する場合は、適切な負荷容量と発振回路の設計が重要である。
- MSP430F149には内蔵の超低消費電力オシレータ (VLO) は搭載されていないため、外部クリスタルが必要である。
サンプルコード
以下の例では、ACLKのクロックソースとして32.768[kHz]のLFXT1を選択している。
- まず、WDTを停止する。
これは、クロックの設定を変更する前に必要な処理である。 - BCSCTL1レジスタの
XTSビットを0に設定して、LFXT1を低周波モードで使用する。 DIVAビットを設定して、ACLKの分周率を選択する。
※注意
クロックソースを切り替える際は、クロックが安定するまで待つ必要がある。
外部クロックソースを使用する場合は、適切な発振回路の設計が必要である。
#include <msp430.h>
int main(void)
{
// WDTを停止
WDTCTL = WDTPW | WDTHOLD;
// LFXT1を低周波モードに設定 (32.768kHz用)
BCSCTL1 &= ~XTS;
// ACLKの分周率を1に設定
BCSCTL1 &= ~(DIVA_3);
BCSCTL1 |= DIVA_0;
// クロックが安定するまで待機
do {
IFG1 &= ~OFIFG; // クリアフラグ
for (int i = 0xFF; i > 0; i--); // 遅延
} while (IFG1 & OFIFG); // フラグが立たなくなるまで待機
// その他の初期化処理
// ...略
while(1) {
// メインループ
// ...略
}
}
クロックの選択
デフォルトの設定
MSP430F149マイコンは、クロックの指定が無い場合は、以下に示すクロック周波数で動作する。
- MCLK (マスタクロック)
- 約1.1 [MHz]
- MCLKは、CPUとシステムクロックに使用される。
- デフォルトでは、内蔵のDCO (デジタル制御発振器) が約1.1[MHz]で動作する。
- SMCLK (サブマスタクロック)
- 約1.1 [MHz]
- SMCLKは、ペリフェラル (タイマ、UART、SPI、I2C等) のクロックに使用される。
- デフォルトでは、SMCLKもDCOを使用して、MCLKと同じ約1.1[MHz]で動作する。
- ACLK (補助クロック)
- 使用可能にするには外部クリスタルが必要
- ACLKは、低速のペリフェラル (ウォッチドッグタイマ、リアルタイムクロック等) のクロックに使用される。
- MSP430F149には内蔵の低速オシレータがないため、ACLKを使用するには外部の32.768[kHz]クリスタルが必要である。
以下の例は、デフォルト設定でのクロック構成を示している。
#include <msp430.h>
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // ウォッチドッグタイマを停止
// Default clock configuration:
// MCLK = DCO = ~1.1 MHz
// SMCLK = DCO = ~1.1 MHz
// ACLK = 外部クリスタルが必要
while(1) {
// ...略
}
}
MCLK / SMCLKを8[MHz]に設定 (XT2使用)
MSP430F149で高速動作を実現するには、外部の高周波クリスタル (XT2) を使用する方法がある。
XT2には、4[MHz]から8[MHz]の範囲の高周波クリスタルを接続できる。
以下の例では、8[MHz]の外部クリスタルをXT2に接続して、MCLK / SMCLKを8[MHz]で動作させている。
- 外部クロック用のピンを設定する。
- P5.2 (XT2IN)
- P5.3 (XT2OUT)
- BCSCTL1レジスタを設定して、XT2を有効化する。
- XT2の発振が安定するまで待つ。
- BCSCTL2レジスタを設定して、MCLKとSMCLKのクロックソースをXT2に設定する。
#include <msp430.h>
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // ウォッチドッグタイマを停止
// XT2の発振を有効化
BCSCTL1 &= ~XT2OFF; // XT2をオンにする
// XT2が安定するまで待機
do {
IFG1 &= ~OFIFG; // 発振フォールトフラグをクリア
for (int i = 0xFF; i > 0; i--); // 遅延
} while (IFG1 & OFIFG); // フォールトフラグが立たなくなるまで待機
// MCLKとSMCLKのソースをXT2に設定
BCSCTL2 |= SELM_2 | SELS; // MCLK = XT2, SMCLK = XT2
while(1) {
// ...略
}
}
上記のサンプルコードでは、XT2から8[MHz]のクロックが供給され、MCLKとSMCLKが8[MHz]で動作する。
BCSCTL1 &= ~XT2OFF;- XT2OFF ビットをクリアして、XT2の発振を有効化する。
BCSCTL2 |= SELM_2 | SELS;SELMビットを2に設定して、MCLKの供給元をXT2に設定する。SELSビットを1に設定して、SMCLKの供給元もXT2に設定する。
MCLK / SMCLKをDCOで高速化 (FLL使用)
MSP430F149では、外部の32.768[kHz]クリスタルをLFXT1に接続して、FLLを使用することでDCOを高速化できる。
FLLは、低周波の基準クロックから高速のDCOクロックを生成する機能である。
以下の例では、32.768[kHz]の外部クリスタルを基準にして、DCOを約2[MHz]に設定している。
- 外部クロック用のピンを設定する。
- BCSCTL1レジスタを設定して、LFXT1を低周波モードに設定する。
- FLL制御レジスタ (SCFQCTL、SCFI0、SCFI1) を設定して、DCOの周波数を設定する。
- クリスタルの発振が安定するまで待つ。
#include <msp430.h>
#define DELTA 244 // 32768 x 61 = 1999648 Hz (~2MHz)
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // ウォッチドッグタイマを停止
// LFXT1を低周波モードに設定
BCSCTL1 &= ~XTS;
// FLLの設定: 32.768kHz x 61 = ~2MHz
SCFQCTL = DELTA - 1; // FLL乗数を設定
SCFI0 = FLLD_1 | FN_2; // DCO範囲選択
// クロックが安定するまで待機
do {
IFG1 &= ~OFIFG; // 発振フォールトフラグをクリア
for (int i = 0xFFFF; i > 0; i--); // 遅延
} while (IFG1 & OFIFG); // フォールトフラグが立たなくなるまで待機
// MCLKとSMCLKのソースをDCOに設定
BCSCTL2 |= SELM_0 | SELS; // MCLK = DCO, SMCLK = DCO
while(1) {
// ...略
}
}
上記のサンプルコードでは、FLLがDCOの周波数を約2[MHz]に安定化させて、MCLKとSMCLKに約2[MHz]のクロックを供給している。
SCFQCTL = DELTA - 1;- FLLの乗数を設定する。DELTAの値により、DCOの周波数が決定される。
- 周波数 = 32768 × (DELTA + 1) [Hz]
SCFI0 = FLLD_1 | FN_2;- DCOの周波数範囲と内部設定を行う。
MCLK 8[MHz] / SMCLK 4[MHz]に設定 (XT2使用)
MSP430F149マイコンでは、MCLKとSMCLKを異なる周波数に設定することが可能である。
MCLKやSMCLKの周波数は、クロックソースの周波数を分周することで得られる。
以下の例では、8[MHz]のXT2を使用して、MCLKを8[MHz]、SMCLKを4[MHz]に設定している。
BCSCTL2 |= SELM_2 | SELS | DIVS_1;では、SELMビットを2に設定することにより、
MCLKの供給元をXT2に設定、SELSビットを1に設定してSMCLKの供給元もXT2に、DIVSビットを1に設定してSMCLKの分周比を2にしている。
これにより、XT2の周波数 (8[MHz]) がそのままMCLKに供給されて、SMCLKにはXT2の周波数を2で割った4[MHz]が供給される。
#include <msp430.h>
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // ウォッチドッグタイマの停止
// XT2の発振を有効化
BCSCTL1 &= ~XT2OFF;
// XT2が安定するまで待機
do {
IFG1 &= ~OFIFG;
for (int i = 0xFF; i > 0; i--);
} while (IFG1 & OFIFG);
// MCLKとSMCLKの設定
BCSCTL2 |= SELM_2 | SELS | DIVS_1; // MCLK = XT2, SMCLK = XT2 / 2
while(1) {
// ...略
}
}
SMCLKの分周比は、DIVSビットを変更することにより、調整することができる。
以下に、DIVSビットの設定とそれに対応するSMCLKの分周比を示す。
- DIVS_0
- SMCLK = クロックソース / 1 (分周なし)
- DIVS_1
- SMCLK = クロックソース / 2
- DIVS_2
- SMCLK = クロックソース / 4
- DIVS_3
- SMCLK = クロックソース / 8
したがって、XT2の周波数を8[MHz]に設定した場合、SMCLKは8[MHz]、4[MHz]、2[MHz]、1[MHz]のいずれかに設定できる。
これにより、アプリケーションの要件に応じて、MCLKとSMCLKの周波数を個別に最適化することができる。
MCLKの分周設定
MSP430F149マイコンでは、クロックソースの周波数を分周して、MCLKとSMCLKの周波数を設定することができる。
分周比は、BCSCTL2レジスタのDIVMビットおよびDIVSビットを使用して制御する。
- MCLKの分周比 (DIVMビット)
- DIVM_0 (分周なし)
- MCLK = クロックソース / 1
- DIVM_1
- MCLK = クロックソース / 2
- DIVM_2
- MCLK = クロックソース / 4
- DIVM_3
- MCLK = クロックソース / 8
- DIVM_0 (分周なし)
- SMCLKの分周比(DIVSビット)
- DIVS_0 (分周なし)
- SMCLK = クロックソース / 1
- DIVS_1
- SMCLK = クロックソース / 2
- DIVS_2
- SMCLK = クロックソース / 4
- DIVS_3
- SMCLK = クロックソース / 8
- DIVS_0 (分周なし)
これらの分周比を組み合わせることにより、クロックソースの周波数から必要なMCLKとSMCLKの周波数を得ることができる。
例えば、XT2の周波数が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 = 2[MHz] (DIVM_2), SMCLK = 2[MHz] (DIVS_0)
- MCLK = 2[MHz] (DIVM_2), SMCLK = 1[MHz] (DIVS_1)
以下の例では、XT2の周波数を8[MHz]、MCLKを4[MHz]、SMCLKを2[MHz]に設定している。
BCSCTL2 |= SELM_2 | DIVM_1 | SELS | DIVS_1;により、DIVMビットを1に設定してMCLKの分周比を2、DIVSビットを1に設定してSMCLKの分周比を2にしている。
これにより、XT2の周波数 (8[MHz]) がMCLKに2分周されて4[MHz]、SMCLKに2分周されて4[MHz]が供給される。
さらに、SMCLKはSELSによりXT2から供給されるため、最終的にSMCLKは4[MHz]となる。
#include <msp430.h>
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // ウォッチドッグタイマの停止
// XT2の発振を有効化
BCSCTL1 &= ~XT2OFF;
// XT2が安定するまで待機
do {
IFG1 &= ~OFIFG;
for (int i = 0xFF; i > 0; i--);
} while (IFG1 & OFIFG);
// MCLKとSMCLKの設定
BCSCTL2 |= SELM_2 | DIVM_1 | SELS | DIVS_1; // MCLK = XT2 / 2, SMCLK = XT2 / 2
while(1) {
// ...略
}
}
DCOを使用した様々な周波数設定
MSP430F149マイコンのDCOは、FLLを使用することで様々な周波数で動作させることができる。
SCFQCTLレジスタのDELTA値を調整することにより、DCOの周波数を設定する。
DCOの周波数は、以下の式で計算される。
- 周波数 = 32768 × (DELTA + 1) [Hz]
例えば、以下のような周波数設定が可能である。
- DELTA = 30
- 周波数 = 32768 × 31 = 1,015,808 Hz (約1MHz)
- DELTA = 60
- 周波数 = 32768 × 61 = 1,998,848 Hz (約2MHz)
- DELTA = 121
- 周波数 = 32768 × 122 = 3,997,696 Hz (約4MHz)
- DELTA = 243
- 周波数 = 32768 × 244 = 7,995,392 Hz (約8MHz)
以下の例では、DCOの周波数を約4[MHz]に設定している。
#include <msp430.h>
#define DELTA 121 // 32768 x 122 = 3997696 Hz (~4MHz)
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // ウォッチドッグタイマの停止
// LFXT1を低周波モードに設定
BCSCTL1 &= ~XTS;
// FLLの設定
SCFQCTL = DELTA - 1; // FLL乗数を設定
SCFI0 = FLLD_1 | FN_4; // DCO範囲選択 (4MHz用)
// クロックが安定するまで待機
do {
IFG1 &= ~OFIFG;
for (int i = 0xFFFF; i > 0; i--);
} while (IFG1 & OFIFG);
// MCLKとSMCLKのソースをDCOに設定
BCSCTL2 |= SELM_0 | SELS; // MCLK = DCO, SMCLK = DCO
while(1) {
// ...略
}
}
このように、FLLとDELTA値を調整することにより、アプリケーションの要件に応じた様々な周波数でDCOを動作させることができる。
ただし、高い周波数での動作は消費電力が増加するため、バッテリー駆動のアプリケーションでは注意が必要である。