MSP430LaunchPadを少しいじくって見ました。
下記の様なプログラムです。
#include "msp430G2553.h";
int main(void){
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
BCSCTL1 = CALBC1_1MHZ; // Set SMCK = DCO to 1MHz
DCOCTL = CALDCO_1MHZ; // Set SMCK = DCO to 1MHz
//P1DIR = (LED1+LED2);
P1DIR |= (1 << 6 | 1 << 4 | 1 << 0); // Set LED to output direction
//P1SEL = 1 << 4;
P1SEL |= BIT4; //Out SMCLK
P1SEL2 &= ~BIT4;
P1OUT &= ~(1 << 0);// Set LED1 off
P1OUT |= 1 << 6;// Set LED2 on
while (1) {
P1OUT ^= LED1;
P1OUT ^= LED2;
_delay_cycles(1000000); // 1sec
}
}
MSP430はクロックが内臓されています。MCLKはCPUを駆動するクロックですが、これはオプションでクロック源を選べますが、ここでは内部のDCO(デジタル コントロールド オシレータ)を使います。
DCOはレジスタの設定でその周波数を設定します。
RSELx:Coarse Freqency Range
DCOx:Fine Frequency range
MODx: Frequency modulation between the selected fine value
ここで使ったMSP430G2553はMax clkが16MHzでデフォルトは1MHzになっています。
BCSCTL1 = CALBC1_1MHZ; // Set SMCK = DCO to 1MHz
DCOCTL = CALDCO_1MHZ; // Set SMCK = DCO to 1MHz
工場出荷時にキャリブレーションをした値が書き込まれているらしく上記の様にプログラムすると、その値を呼び出してくるようです。電圧と温度の影響をより少なくする配慮がされています。
BCSCTL1 = CALBC1_16MHZ;
DCOCTL = CALDCO_16MHZ;
16MHzも使えるようです、これは使うCPUによって異なるようです。
また、ポートはIO機能とペリフェラル機能がありこれはP1SELxの設定で選ぶことが出来ます。ここではSMCLKをポートP1の4に出力させています。
DCOと云われる所以?SMCKにはジッタがあります。ジッタが影響するような場合は注意が必要です。CPUから外部に発生する電磁波の影響を少なくする?策として周波数を揺らしているとか、、、聞いたことがあります。詳細は知りせん。
後はお決まりのLチカです。2個のLEDを1秒間の周期で点滅させてみました。
_delay_cycles(1000000); // 1sec
上記マクロで1秒が得られます。時間は_delay_cycles(1*SMCLK) で計算できます。オッシロで見るとほぼ1秒のHigh、Lowが出ています。
カスタムキャリブレーションも出来そうなのですが、(そのプログラムはコンパイルでエラーになり使えません)8通りくらいの周波数でキャリブレーションを行いその値をメモリに書き込み、その値を呼び出してMCLKとして使える様です。
※コメント投稿者のブログIDはブログ作成者のみに通知されます