マイコンプログラミング その2
はじめに
前回はパワーオンリセットがかかり、PowerON_Reset_PC関数を呼び出すところまででした。今回はHardwareSetup関数の中を実装してみます。
プロテクトレジスタ設定
はじめにクロックを設定します。が、事前にプロテクトレジスタでクロックモジュールの設定変更ができるようにしておかないと、クロック設定ができません。(最初ここにハマって上手く設定ができませんでした…)
一度プロテクトを解除するため、PRKEYビットに「0xA501」を書き込みます。クロックモジュールへの書き込み後は再度「0xA500」を書き込んでプロテクトをかけ直します。
クロックモジュール
ここからクロック設定を行います。今回使用しているマイコンボードは、EXTALに20MHzの水晶振動子が接続しています。この水晶振動子をメインクロックの入力として使用します。
クロックソース選択
クロックソースを選択するため、SCKCR3(システムクロックコントロールレジスタ3)を設定します。上記のブロック図より、メインクロック発信器やサブクロック発振器、高速・低速オンチップオシレータなどをクロックソースとして選択できる事が分かります。
メインクロック発信器を選択したいので、CKSELビットを2にします。
分周比設定
CPUへ設定するクロックはメインクロックを分周したシステムクロックを使用します。なのでSCKCR(システムクロックコントロールレジスタ)で分周比を設定します。
今回はシステムクロックを64分周にします。このためICLKビットを「5」「6」にします。これでシステムクロックが20MHzの1/64である312.5KHzになります。
メインクロックの発振動作
最後にメインクロックの発振動作させます。このためにメインクロック発振器コントロールレジスタ(MOSCCR)を設定します。
HardwareSetup関数
関数のソースコードは以下になりました。
void HardwareSetup(void)
{
// クロックソース選択の保護解除
SYSTEM.PRCR.WORD = 0xA501;
// クロックソースをメインクロックに設定
SYSTEM.SCKCR3.BIT.CKSEL = 2;
// 設定完了待ち
while(SYSTEM.SCKCR3.BIT.CKSEL != 2)
;
// システムクロック(ICK)を64分周に設定
SYSTEM.SCKCR.BIT.ICK = 5;
// 設定完了待ち(不要なのでコメントアウト)
//while(SYSTEM.SCKCR.BIT.ICK != 5)
// ;
// メインクロックの発振動作
SYSTEM.MOSCCR.BIT.MOSTP = 0;
// 設定完了待ち
while(SYSTEM.MOSCCR.BIT.MOSTP != 0)
;
// クロックソース選択の保護
SYSTEM.PRCR.WORD = 0xA500;
}
次回はIOポート設定とLED点灯をしてみたいと思います。
<2024/3/2 追記>
以下の処理を実行すると無限ループ?になってしまうようなのでコメントアウトしました。
while(SYSTEM.SCKCR.BIT.ICK != 5) ;
この記事が気に入ったらサポートをしてみませんか?