PIC MCC Clock クロック周波数切り替えをC言語で実装する

こんばんは、ファルコンM です。

PIC にはまっております。

今回は、プログラム実行中に、動的にクロック周波数を切り替える方法について。

アセンブラを使わずにC言語だけで実装する。

開発環境

  • マイコン PIC24FJ128GC006
  • PICKIT3
  • MVA v2017_03_06

 

FRC Oscillator PLL 32MHzFRC Oscillator PLL なし 4MHz に変更する。

 

MCC のクロック周波数設定

 

初期設定をMCC で行う。

  • PLL Enable にチェックを入れる。Prescalerを1:1、CPU Divisor を1:1 とし、Fosc を32MHz にする。
  • Enalbe Clock Switching にチェックを入れる。これを入れることで、クロックの切り替えができるようになる。

 

設定後、ジェネレートして、ソースコードを出力する。

 

クロック周波数切り替えのコード

8MHzに切り替えるコードは以下。

static void clockLo( void )
{
  __builtin_write_OSCCONH((uint8_t) (0x01)); // A
  __builtin_write_OSCCONL((uint8_t) (0x01)); // B
  CLKDIV = 0x0100;  // C
  return;
}

 

OSCCON レジスタに値を書き込むためには、ロック解除シーケンスを実装する必要がある。

__builtin_write_XXXXXX (XXXXXX にはレジスタ名が入る ) マクロを使用すれば、ロック解除シーケンスを記述する必要はない。コンパイル時に、アセンブラコードが生成される。

クロック周波数を設定するOSCCON レジスタは書き換えにロック解除シーケンスが必要である。なので、__builtn_write_XXXXXX を使用する。

A行の __builtin_write_OSCCONH でOSCCONのNOSC ( 切り替え後のオシレータ < 14:12> ) を0x07 ( ポストスケーラ付き高速RCオシレータ ) にする。

B行で、__builtin_write_OSCCONL でOSCCONのOSWEN(  オシレータ切り換えイネーブル ビット ) を0x01 に設定する。

C 行は、__builtn_write_XXXXXX を使用する必要はない。

CLKDIV のRCDIVを1 (4MHz 2分周 )とする。

 

実際に切り替えたいタイミングでこの関数を呼び出せば、クロック周波数の切り替えができる。

 

まとめ

 

クロック周波数の切り替えをC言語だけで実装した。

アセンブラを使いたくないって人もいると思うので、このコードを参考にしていただきたい。

 

スポンサードリンク



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です