LOCKCNT( PLL Lock Counter )はPLLが安定するまで待つときに使うカウンターです。
不可解なことに(というか、アナデバの場合よくあることなんですが┐(・_・)┌)、このレジスタをどう使うか、HRにはまったく書いてありません。ただ、リセット時には不定であり、間違ってロック信号をだすことがあると書いてあるだけです。どうやら、219xコアの仕様をそのままコピーしているようです。
またHR 14-40にはBYPASSモードからCLOCK MULTIPLYモードへの遷移時にはLOCKCNTによってプロセッサが自動的にPLLのロックを待ってくれそうな意味合いのことが書いてあります。しかし実験してみるとそうではなくてBYPASSから抜ける前にPLLがロックしたかどうか自分で判断しなければなりません。
このレジスタには内部構造はありません。16ビット符号なし整数レジスタです。リセット後の初期値は不定ですが、十分に長い時間のリセットパルスを与えれば、リセット後の値は有意な値になっているようです。
C/C++言語用に以下のインターフェースが用意されています。宣言はsysreg.hとdef2191.hで行われています。LOCKCNTにアクセスする前には必ずIOPGにClock_and_System_Control_Pageを設定してください。
// #include <sysreg.h> // #include <def2191.h> sysreg_write(sysreg_IOPG, Clock_and_System_Control_Page) // クロックページに設定 io_space_write(LOCKCNT, 値) // LOCKCNTに値を設定 変数 = io_space_read(LOCKCNT) // LOCKCNTの値を取得
項目 | マニュアルのページ等 |
---|---|
説明 | HR B-17 |
以下の記述は推測を多く含みます。
ADSP-2199xにも同じレジスタがあり、ADSP-2199x HRはこれについてより深い説明を行っています。それによると、LOCKCNTはPLLをリセットした場合、逓倍率を変えた場合、PLLをオンにした場合などに0に初期化され、HCLKによってインクリメントされます。そして、値が0x200になったら停止します。
一方ADSP-219xのHR 14-34には、PLLが安定するのに500サイクルかかるとかいてあり、また、定常実行中に実チップのLOCKCNTを読み出すと0x200になっています。さらにBYPASSモードでMSEL4-0の値を変えると、LOCKCNTは0から始まって0x200で止まります。
こういったことを総合すると、LOCKCNTは次のような動作をします。
もっとも、LOCKCNTを使わずにプログラマーが0から0x1FFまで数え上げれば済むのですからそれほどLOCKCNTにしがみつく必要もありません。