こんばんは、ファルコンM です。
PIC にはまっております。
今回は、プログラム実行中に、動的にクロック周波数を切り替える方法について。
アセンブラを使わずにC言語だけで実装する。
開発環境
- マイコン PIC24FJ128GC006
- PICKIT3
- MVA v2017_03_06
FRC Oscillator PLL 32MHz → FRC 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言語だけで実装した。
アセンブラを使いたくないって人もいると思うので、このコードを参考にしていただきたい。
コメントを残す