<PIC32クロックシステム>



上記の図がPIC32ボードのクロックシステムです。PIC32ボードには16MHzのクリスタルがPrimary Oscillatorとして使用されています。
例えば80MHzでCPUを動作(SYSCLK)させるためには、16MHzをPLL Input Dividerで4分周して4MHzにします。これをPLL Multiplierに入力して20倍して80MHzを作り出します。

USBのクロックは図上部のUSB PLLにて48MHzが生成されます。CPUクロックとは別管理になっています。

UART、SPI、I2Cといった周辺機器(Periferals)のクロック(PBCLK)はCPUクロック(SYSCLK)をPBDIVで分周することにより作り出します。

PIC32ボードで使用しているPIC32MX795F512Lのメーカー保証最大動作クロックはSYSCLK、PBCLK共に80MHzです。


<PIC32のオーバークロック>

最大80MHzで動作出来るPIC32ボードはかなり高速です。ですが、時にはCPU処理能力が若干不足する場合や、外部機器との絡みで周辺機器のクロックを高速にしたい場合などがありえます。半導体メーカ(マイクロチップ)が保証している動作クロックを超えて使用することを、オーバークロックと言います。もちろんオーバークロックはオプティマイズも保証の対象外ですので、ユーザの責任において実行することになります。大量生産されるマスプロダクトでは絶対に推奨される行為ではありませんが、実験用途、プロトタイプ、電子工作などでは有効な手法になり得ます。

上記の図を見るとわかりますが、PIC32のCPUクロックはPLLによって生成されています。PLLのパラメータはデバイスコンフィグレーション(DEVCFG2 : 0x1FC2FF4)の値によって決定されますので、非常に簡単に周波数を変更することが可能です。特にPLLの倍率設定(PLL Multiplier)は動作中にプログラムによって変更(OSCCONレジスタ)することも可能です。

PLL Multiplierは設定により、15倍、16倍、17倍、18倍、19倍、20倍、21倍、24倍に設定できます。従って16/4 * 20 = 80MHzで動作中のPIC32ボードを16/4 * 24 = 96MHzに簡単に変更することが可能です。

また、PIC32ボードはクリスタルが16MHzですので、PLL Input Dividerの設定を通常の16/4 = 4MHzから16/3 = 5.33MHzに変更することで更に多彩なオーバークロックが可能になります。(上記の図にも記載があるように、PLLの仕様上の入力クロックは4MHzから 5MHzの間である必要があります。この時点で既に動作保証外になります。)

下記表はPIC32ボードで設定可能なオーバークロックの組み合わせ一覧です。

FPLLDIV
(PLL入力分周)
PLLMULT
(PLL倍率)
CPUクロック
(SYSCLK)
4 21 84MHz
4 24 96MHz
3 16 85.3MHz
3 17 90.6MHz
3 18 96MHz
3 19 101.3MHz
3 20 106.6MHz
3 21 112MHz
3 24 128MHz

FPLLDIVはデバイスコンフィグレーション(DEVCFG2)でのみ設定可能で、CPU動作中にダイナミックに変更することは出来ません。(デバイスコンフィグレーションはフラッシュメモリの特定の領域に書き込まれたデバイス動作設定パラメータです。)

デバイスコンフィグレーションの設定はプログラムのソースコード(main.cなど)の先頭で、
「 #pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_3, FPLLODIV = DIV_1, FWDTEN = OFF 」
のように設定します。この例では 16 / 3 * 20 = 106.6MHzになります。


<オーバークロック確認プログラム>

自分の所有するPIC32ボードのオーバークロック耐性を調べるには、DEVCFG2の値を変更した対象のプログラムをフラッシュメモリに書き込んで動作させるのが最も確実な方法です。ですが、事前にどの程度のクロックで動作するのか調べておきたい場合もあります。そこで、USBローダを使用した簡易な手順を用意しました。

ソース・ヘキサファイル(ovclktest.lzh)をダウンロード&解凍します。

USBローダを起動した状態で、コンソールウインドウで解凍したディレクトリに移動して「pic32cons ovclktest」を実行します。


現在動作中のSYSCLK、PBCLKが表示され続けます。
CYCLESというのは、一行表示するのに要したSYSCLKのサイクル数です。一行表示するのに必要な時間はPCのUSB周りの処理能力に大きく依存し、PIC32の動作クロックにはさほど依存せず、一定の可能性が高いはずです。その一定時間にPIC32が何サイクル要したかを表示しています。当然PIC32の動作クロックが上がれば、値も大きくなります。

キーボードの↑カーソルキーを押すと、PLLMULTの倍率が上がり、動作クロック(SYSCLK)が上がります。キーボードの↓カーソルキーを押すとPLLMULTの倍率が下がります。

画面にメッセージが表示され続けているということは、その動作クロックで問題なく動作していることの証となります。
(ovclktest自体はRAMで実行されますが、USB処理を行うためフラッシュメモリのUSBローダプログラムも実行されます。このためフラッシュ上で動作するプログラムの動作チェックも行うことが出来ます。)

上記の例では「FPLLDIV = 4」の状態ですので、60MHzから96MHzまでしか確認できません。
そこで、フラッシュメモリー上のDEVCFG2を書き換えて「FPLLDIV = 3」に設定します。
(この手順を実行すると最悪USBローダが起動しなくなる可能性があります、その場合は別のPIC32ボード、あるいはPICKit3などを使用してUSBローダを書き込む必要があります。)
(あり得ないとは思いますが、最悪の場合はPIC32チップが壊れる可能性もあります。オーバークロックはあくまでも自己責任になります。)

USBケーブルを抜き差しして、再度USBローダを起動します。
コンソールウインドウから「pic32cons flashutil setdiv3.txt」を実行します。
これで、DEVCFG2が書き換えられたので、再度USBケーブルを抜き差ししてUSBローダを起動します。

コンソール画面から「pic32cons ovclktest」を実行します。


今度は80MHzから128MHzまで確認出来ます。

「FPLLDIV = 4」に戻すには、USBローダを起動した状態で「pic32cons flashutil setdiv4.txt」を実行します。


執筆時点で組み立てた7台全てのPIC32ボードが128MHzで動作しました。
シリコンのロットによるかもしれませんが、PIC32のオーバークロック耐性は非常に高いと思われます。


<オーバークロックで考慮すべき点>

上記のovclktestはPLLの倍率を設定後に、
「SYSTEMConfig(sys_freq, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE | SYS_CFG_PB_BUS);」
関数を呼び出しています。(sys_freqには動作クロックが入ります)

このSYSTEMConfig()関数はマイクロチップの提供するペリフェラルライブラリに含まれるもので、指定した動作クロックに対して、最適なフラッシュメモリのウエイトサイクル数、ペリフェラルクロック分周数(PBDIV)などを設定してくれます。

フラッシュメモリは30MHzまではノーウェイトでアクセス出来ますが、それ以上の周波数は30MHz毎に1ウェイトステートが必要です。フラッシュメモリは一度に128bitデータをアクセスしますので、4命令分になります。従ってプリフェッチ機能を有効にすれば、3ウェイトアクセスまでは分岐の無いプログラムの場合にノーウェイトで動作可能です。3ウェイトアクセスは120MHzですので、120MHzまではノーウェイト実行が可能です。(120MHz以上でもフラッシュのアクセス自体をオーバースペックで使用することで、ノーウェイト実行することも可能です)

ペリフェラルクロックはスペック上は80MHzまでですので、SYSTEMConfig()関数は80MHzを超えるクロックを指定した場合には適宜ペリフェラルクロック分周数(PBDIV)を使って80MHz以内に収まるようにしてくれます。

内蔵RAMにアクセスする際のウェイトの設定はBMXCONレジスタのBMXWSDRMで設定(0wait or 1wait)出来ます。SYSTEMConfig()関数内ではクロック数に関係なくノーウェイトが設定されます。


オーバークロックのためにフラッシュメモリやRAMに対してウェイトを挿入しなければならないケースや、ペリフェラルクロックを下げなければならないケースも発生します。そのため、CPUの動作クロックは上がったにもかかわらず、システム全体のパフォーマンスが低下してしまう場合もあります。このため最終的なシステムでの調整が不可欠となります。