6. 寄り道:謎の高速化関数 SYSTEMConfig

マイクロチップのサンプルプログラムをあれこれ眺めていると、SYSTEMConfig という関数があります。
(プロジェクトの作成に Harmony を使用していないと思われる、従来型のサンプルプログラムで見かけます。)

MPLAB-XC32-Users-Guide.pdf をみても解説が無く最初は何だろうと思ったのですが、ネット上の情報によると、

  1.CPU用のクロックが希望周波数になるように、PLLの分種設定などを自動で設定する。
  2.クロックに合わせ、メモリのWAIT数などを自動で最適値に設定する。
  3.CPU命令のキャッシュをONにする。(デフォルトではOFF?)

といった機能の関数らしいです。
実際、この関数の記述をコメントにしてしまうと、LEDの点滅速度が1/8程度まで遅くなります。

以下、Microchip のサンプルソースより抜粋。

  #define SYS_FREQ (80000000)

  // Configure the device for maximum performance, but do not change the PBDIV clock divisor.
  // Given the options, this function will change the program Flash wait states,
  // RAM wait state and enable prefetch cache, but will not change the PBDIV.
  // The PBDIV value is already set via the pragma FPBDIV option above.
  // Configure the device. CPU:80MHz, SET WAIT STATE, SET CACHE

  SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);



なお、プロジェクトの作成に Harmony を使用した場合は、この関数は不要です。
生成されたプロジェクトの中のシステム初期化処理 system_init.c の中に

  SYS_DEVCON_PerformanceConfig(SYS_CLK_SystemFrequencyGet());

などの関数が自動的に組み込まれ、先のCPUの設定をしてくれます。
逆に、Harmony 作成のプロジェクトで SYSTEMConfig を使用するとエラーになるので注意。
(おそらく、従来型のプログラムで使用している plib.h を、 Harmony 生成プロジェクトでは使わないため?)

ちなみに SYS_DEVCON_PerformanceConfig 関数の本体は、

  sys_devcon_pic32mx.c
  sys_devcon_pic32mz.c

の中にありました。参考まで。