ルモーリン

クロック設定を全自動で

投稿:2012-03-06

前ページで「MとNの組み合わせが16000通りを越えるのでエクセルで全部の組み合わせから良さそうなのを選抜すると、」とかやりましたけれど、 せっかく目の前にマイコンがあるのに、なんで手作業でクロック設定をコーディングしなきゃならないんだこれ? と言うわけで、マイコンが起動した直後に自分で適切なクロック設定を約16000通りから検索して設定するようにしました。

クロック設定していないのに、なんでマイコンが動作するかというとリセット直後は内蔵RCクロック(IRC)、確か4MHz程度で動作してます。 デバッグ環境での目分量ですけれど、ほぼ1秒で検索していますので、素人が趣味で使う分には差し支えありませんね。 他の環境でつかったり、ペリフェラルに合わせてクロック変更が必要になる度に手作業で適切なクロックを検索するのはつまらないですし、 それよりも条件を変更してデバッグ環境で実行、適切なクロックを検索できてることを確認して終わりにするほうが楽しいです。

それとこれは私だけの偶然で、他の環境の方々には無縁かと思いますが、私が使っているのはLPCXpresso(1768)で、現在は生産終了しています。 皆さんご存知の秋月電子通商では同(1769)を販売しています。 この2者の違いが最高クロックにあって100MHzから120MHzへ増加していますので、プログラムがどちらのボードで動作しているか確認した上で、 クロックの上限を100MHzか120MHzにしたかったというのもあります。

LPC(LPC17xxシリーズ?)には2個のプログラムISPとIAPが内蔵されていて、IAPを使うとCPU情報を得られます。
最後はカテゴリ「鉄ゲタ」にふさわしくハマった話。
下記はsystem_LPC17xx.cのSystemInit()でPLL0を設定する所です。
    LPC_SC->PLL0FEED  = 0xAA;
    LPC_SC->PLL0FEED  = 0x55;
FEEDに0xAAを書き込んでから0x55を書き込むまでに他の処理禁止が仕様ですけれど、ステップ実行は当然ステップ毎に割り込みます。 で、対策が冗談みたいだけどコメントの通り上手く行きます(笑)。
//次の2ステートメント間をステップ実行するとPLL0がロックしないので、1行にしてステップ実行回避
    LPC_SC->PLL0FEED  = 0xAA;	LPC_SC->PLL0FEED  = 0x55;
(面倒になってきたのでツイッターからコピー&ペースト)
LPCシリーズのユーザーマニュアル、ページ633~636にあるCommand codeが4桁になっていますけれど上2桁を10進数として使うのが正しいです。下2桁は「10進数」という表記の体裁誤り。簡単に言うとTable 588. IAP Command Summary参照。

まあ、どうせ話が通じないと思うので、あとはソース見てください(^^;
yrntrlmnmnt20120206.zip