0

次のルーチンを使用して、MSP430(msp430g2231)マイクロコントローラーのクロックを構成します。

void configure_clock(void) {
if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF) { // Checks the clock constants
        while(TRUE); // If callibration constants are erased, TRAP!
    }

    BCSCTL1 |= CALBC1_1MHZ; // Sets DCO range
    DCOCTL |= CALDCO_1MHZ; // Set DCO step and modulation

    BCSCTL1 &= ~(XTS | XT2OFF); // Disables XT2 and sets low frequency mode
    BCSCTL3 |= (LFXT1S_0 | XCAP_3); // Selects LFXT1 crystal with 12,5pF

    do {
        IFG1 &= ~OFIFG;
        __delay_cycles(1000);
    } while (IFG1 & OFIFG); // Waits until crystal stabilizes

    BCSCTL2 |= (SELM_2 | SELS); // Selects SMCLK and MCLK from LFXT1CLK
}

問題は、コードが最初に実行されたとき(マイクロコントローラーの電源を入れた直後)、すべてが期待どおりに機能し、32768kHzのクロックが得られることです。しかし、ボードのリセットボタン(MSP430 Launchpad)を押すと、時計が正しく機能していないように見え、コードの実行が非常に遅くなります(10回程度)。時計の構成について何かアイデアはありますか?

ありがとう!

ペレ

4

2 に答える 2

1

まず、電源電圧を見ることができます。起動時にスパイクが発生した場合、DCO は機能しません。その場合、BCSCTL1 への値のアライメントの直前に遅延を使用してみてください。

   __delay_cycles(10000);
   BCSCTL1 = CALBC1_1MHZ; // Sets DCO range

これにより、起動時のスパイクが確実に抑制されます。

次に疑わしいのは、ターゲット ボードのデカップリングです。VCCのコンデンサとリセットで使用されるコンデンサを意味します。TI では、リセット ラインに 1nF ~ 2nF、VCC に 0.1uF を推奨しています。ただし、プラットフォームとして LaunchPad を使用している場合は、問題にはなりません。

また、キャリブレーション値の割り当てには、論理演算子ではなく代入演算子を使用します。他の値が 0 であるため、デフォルトです。

  BCSCTL1 = CALBC1_1MHZ;               // Set DCO
  DCOCTL = CALDCO_1MHZ;

XT2 を実行する予定の場合、G2231 では利用できません。そのLFXT1を直接。32.768KHz クリスタルが動作するために明示的な初期化は必要ありません。電源を入れるだけで動作します。したがって、追加の初期化手順は必要ありません。

より良いヘルプを見つけるには、クロック設定に関連するソフトウェアの例についてslac463aを参照してください。

于 2011-11-10T06:27:53.013 に答える
0

私があなたのコードで提案できる唯一のことは以下の通りです。彼らがあなたの問題を解決するかどうかはわかりません。最初の実行がOKであるのは奇妙に思えますが、リセット後はそうではありません。他の場所でクロック設定にアクセスしますか?リセット時にどのコードを呼び出しますか?

レジスタに値を含めたり除外したりするには、常にビット操作を使用します。既知の値から始めて、そこからビットを調整する必要があります。そうしないと、前の状態のビットが組み込まれる可能性があります。たとえば、次の代わりに:

BCSCTL1 |= CALBC1_1MHZ;
BCSCTL1 &= ~(XTS | XT2OFF);

次のようにすると、最終的な値に設定できます。

BCSCTL1 = XT2OFF | (CALBC1_1MHZ & 0x0F);

もう1つの提案は、XT2をオフにするにはXT2OFFを設定する必要があるということです。あなたはビットをクリアしているので、それをオンのままにします。これはあなたのコメントと矛盾しているので、エラーである可能性があります。

于 2011-11-08T13:40:36.910 に答える