Sahara's WebLog

日記のような、備忘録のような、うらみつらみのような、自慢のような…。

PIC32MX - SYSTEMConfigPerformance();って何? -

PIC32MXのオシレータの設定を調べる。
まず、System Clock(SYSCLK)について考える。
Primary、Secondary、Internal Fast そして Internal Low-Power の4つのクロック・ソースから選べる。
Primary、Secondaryは外付けなので、基本的に内蔵を使うことにし、速い方を使うことにすると Internal Fast RC (FRC) Oscillator を使えばいい。
かつ、PLLを利用してとにかく高速で動かしたい(これは何となく)ので、結果として、Internal FRC Oscillator with PLL Module を選ぶことにする。
pic32_rm_06_13_t6-2-1

#pragma config FNOSC = FRCPLL // Oscillator Selection Bits (Fast RC Osc with PLL)

あとは、PLLだが、これはFRCPLLで設定する。
8MHzそのままでは速すぎるので、半分の4MHzにしてから入れるために、FRCDIVで設定する。
pic32_rm_06_16-1

#pragma config FPLLIDIV = DIV_2 // PLL Input Divider (2x Divider)
#pragma config FPLLMUL = MUL_20 // PLL Multiplier (20x Multiplier)

OSCCONないのレジスタで設定するという説明になっているが、上のように、Configuration Bitsで設定してもいいんだよねえ、きっと。
というわけで、以下のようなコードを走らせてLチカさせてみる。

出力をオシロスコープで見てみると、5.48Hzとなっている。
pic32_rm_06_osc01
遅すぎないか?
80MHzのつもりなんだけど。
とりあえずMPLABXのシミュレーションでストップウォッチで時間を計ってみることにする。
オシレータは80MHzとする。
Instruction Frequencyはどうすりゃいいんだろう。
1クロックで1サイクルでよかったかな?
とりあえず、同じにしておこう。
pic32_rm_06_simu01
すると、LEDの点滅間隔はシミュレータ上では11.5msとなるので、約87Hzとなる。
pic32_rm_06_simu02
なぜ実測と15倍も違うのだろう。
この後、設定をいろいろ見直したりしたが、この違いは解消されなかった。
で、いろいろさまよった挙句に見つけたのが、表題にもある SYSTEMConfigPerformance(); だ。

#include SYSTEMConfigPerformance(80000000L);

を追加するだけで、実測はこうなる。
pic32_rm_06_osc02
38.36Hzとなって、これはさっきの5.48Hzの実に7倍だ。

SYSTEMConfigPerformance() is a very helpful library function used to easily optimize the performance of the PIC32. You provide the system (instruction) clock frequency and this function will do the rest. It will perform the following tasks for you:
Enable instruction and data caching
Enable instruction prefetch
Configure the Flash and SRAM for minimum wait states
Maximize the peripheral bus clock frequency

とのことだ。
ループで時間稼ぎとかいう無駄な処理を行っている場合は、適度な最適化が必要ってことか。
何だか謎が多いねPIC32は。
もらったサンプルで遊んでるだけだからいいけど、自腹で買って何かに使おうとしたら、なかなか紆余曲折が多くてめげそうなチップだ。

このエントリーをはてなブックマークに追加

Posted under: PIC32MX470F512H


コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.