デュアルコアdsPIC33CHシリーズの使い方まとめ

dsPIC33CH64MP202をSSOP-28変換基板にはんだ付けしたところ

PIC使いにはおなじみのdsPICですが、1年くらい前にデュアルコアが登場。電子工作もデュアルコアの時代になったと言えば大げさかもしれませんが、これは使ってみたいということで「ソフトウェアラジオの自作!dsPICで計算した音を聴く」で使ってみました。

dsPIC33CHはデュアルコアなだけでなく、Fosc:200MHzで100MIPS、12-bit ADCは最速3.5Mspsと、これまでのものよりかなり高性能です。

予想以上に簡単に使えて、300円程度でこれだけの性能が手に入る!ということが分かり、思わず伝えたくなりましたので、ポイントをまとめておきます。

dsPICデュアルコアの概要

dsPIC33のデュアルコアのイメージとしては、これまでのシングルコアのdsPICが、単に2つ入ったお得なパッケージという感じです。

デュアルコアのブロック図

dsPICデュアルコアのブロック図
AN2721 – Getting Started with Dual Core

入っている各コアは、マスターコア、スレーブコアと呼ばれており、メモリやペリフェラル、DSPエンジンなど多くの構成要素は別々にあって、それぞれに備わっています。

なので、機能的には、両者にはさほど大きな違いはありません。一応、マスター側は全体制御、スレーブ側はクリティカルな信号処理というような役割分担が想定されていて、モジュールの数などはそれに沿った形で決められているようです。

マスターとスレーブの特徴

マスターとスレーブの特徴
dsPIC33CH128MP508 Family Datasheet

マスターとスレーブで共有するものは、クロックソースとコア間のI/F関連モジュールくらいです。

もちろん、ピンも共有になりますが、基本的に同時に使うわけではなくて、マスターとスレーブどちらからそのピンを使うのか?というのを、コンフィギュレーションで設定するようになっています。(電源ピンやICSPピンなどは除く)

デフォルトでは、全てマスターコアから使う設定になっています。

オシレータクロックと速度

マスターとスレーブでは、クロックソースは共有ですが、デバイダやPLLの設定はそれぞれにあるので、全く異なる速度で動作させることができます。

逆に、両者を同期して動作させるには、クロックソースを外付けのXTALにして、かつPLLを使わない設定にする必要がありますが、そのような使い方は多分まれでしょう。

なお、上の表にある通りマスターとスレーブでは最大スピードが異なります。両方とも100MIPSだったら良かったのですが、なぜだかマスターの方は90MIPSという謎の仕様になっていますね。

最大速度で動作させた場合の消費電流は、1コアあたりおよそ50mA、2つで100mA。触ると温かいです。

それから、デュアルコアとは直接関係ありませんが、オーバークロックも可能です。
当方の実験では、(PLLFBDレジスタのPLLFBDIVをなるべく高い値にするのがコツ)

・マスターコアで、Fosc:300MHz(150MIPS)
・スレーブコアで、Fosc:320MHz(160MIPS)

まで普通に動きました。
※全ての機能をテストしたわけではありません。もちろん保証外ですので程々に。

マスターとスレーブの違い

一番大きな違いは、フラッシュメモリを持っているのはマスター側だけという点です。その代わり、スレーブ側はPRAMというプログラムを格納する専用メモリを持っています。

ライタから書き込むデータには、マスターとスレーブの両方のイメージが含まれていて、両方ともマスターの持つフラッシュに書き込まれます。

デバイスを起動すると、まずマスターが起動され、スレーブ用のイメージをフラッシュからPRAMへ転送し、その後スレーブコアを起動するという流れになります。

デバッグの場合は例外的な手順もありますが、リリース後の通常起動シーケンスでは、必ずこの手順が必要となります。

スレーブへのプログラム転送イメージ

スレーブへのプログラム転送イメージ

このスレーブへの転送と起動は、マスター側のユーザープログラムが実行しなければなりませんが、次のようにビルトイン関数を使って簡単に行うことができます。

これにより、任意のタイミングでスレーブコアを起動したり、転送するプログラムを切り替えたりすることもできます。また、スレーブが不要ならこの手順を実行しなくても良く、その場合はこれまでのシングルコアPICと同等に動作します。

後述しますが、_program_slave()関数に渡している’Slave’は、MPLAB X が自動生成するヘッダ内で定義されている変数で、スレーブのバイナリが格納されているアドレスが設定されています。また、第1引数はスレーブ番号(通常1)、第2引数はイメージがチェック済かどうか(通常0)を指定します。

コア間のインターフェース

デュアルコアとなると、コア間でテータを共有したいケースが出てきます。しかしdsPICでは、それぞれが独自のメモリを持っており、共有アクセスできるアドレス空間はありません。また、相手にシグナルを送りたいといったこともあるでしょう。

このような要求を実現するため、コア間のインターフェースを提供するモジュール(MSI)が用意されています。

MSIブロック図
dsPIC33/PIC24 FRM, Master Slave Interface (MSI) Module

MSIの機能

大きくは5つの機能がります。

スレーブ制御

先の、マスター側からのスレーブ側へのプログラム転送や起動がこれにあたります。
ビルトイン関数の_start_slave()関数は、MSI1CONレジスタのSLVENビットを1にセットします。逆に、0にリセットする_stop_slave()関数もあります。

割り込み

お互いに割り込みを発生させることができます。これを使って処理の待ち合わせやシグナルのやり取りが行えます。

デュアルコアMSI割り込み

FIFO

データのやり取りには2つの方法が用意されていますが、その1つがFIFOです。マスターからスレーブ、またはスレーブからマスターへ、Byte又はWord単位でシーケンシャルにデータを送受信することができます。

また、DMAやハーフレディー割込みなど、一般的なFIFO機能もサポートされています。サイズは品種によって異なりますが、最低でも32Byteの容量があります。

Mailbox

もう1つの方法はこのMailboxです。16個のレジスタを使って、データをブロック単位やメッセージなど、構造を持った形で送受信したい時に使えます。

MSIのMailbox使用例Mailboxの利用例

FIFOでも同じことができなくもないですが、Mailboxを使うとハンドシェイクやデータの分解・組立ての手間が簡略化されるので便利になります。

ステータス交換

マスターとスレーブ間でお互いの動作状態を、MSIのレジスタを通して知ることができます。例えば、マスター側からスレーブを監視し、異常が発生したら再起動する、といったこともできます。

デュアルコアのプロジェクト

普通のPICと同じように、MPLAB Xを使ってプロジェクトを作ります。

開発環境:MPLAB-X IDE

シングルコアと違うところは、マスター用とスレーブ用に2つのプロジェクトを作り、関連付けの設定が必要なことです。

スレーブコアを使わないのであれば、マスター用のプロジェクトだけでOKです。

プロジェクト作成手順

例として、dsPIC33CH64MP202 でのプロジェクトを示します。

まず、マスターコアのプロジェクトを普通に作ります。

次に、スレーブコアのプロジェクトを作るんですが、ここで選択するデバイス名には「S1」というサフィックスの付いたデバイスを選択します。

マスタープロジェクトのデバイスが dsPIC33CH64MP202 なら、スレーブプロジェクトでは、dsPIC33CH64MP202S1 のデバイスを選択します。デュアルコアなら、必ずそのようなスレーブデバイスが見つかります。

マスタープロジェクトで関連付けを行います。

SlavesプロジェクトフォルダのプロパティーSlavesプロジェクトを右クリック→
 Propertie…を選択。

Slaveプロジェクトを追加するダイアログ

[Add Slave Project…]からスレーブプロジェクトを追加し、Buildチェックボックスにチェックを入れます。

このBuildチェックが重要。単にビルドするしないだけでなくて、書込みイメージにスレーブを含めるか含めないかを指定するものです。このチェックを入れないと、ライタで書き込んだ時にスレーブのイメージが転送されません。

また、Buildチェックを入れると、フラッシュイメージ内におけるスレーブイメージのアドレスを定義するヘッダが自動生成されます。チェックを外すと生成されません。

この自動生成ヘッダは「スレーブプロジェクト名+’.h’」というファイル名で作られ、次のような1行が含まれます。

この変数は、_program_slave()ビルトイン関数の引数に渡すためのものです。つまり、スレーブ側へのプログラム転送に必要な定義になります。
複数のスレーブプロジェクトを作って複数追加すると、この変数も複数定義されます。

それから、Debugチェックは、スレーブ側のデバッグを行う時にチェックします。

コンフィギュレーション

コンフィギュレーションには、マスター固有の設定、スレーブ固有の設定、共有の設定がありますが、フラッシュを持っているマスター側でのみ行います。スレーブプロジェクト側では必要ありません、というか含めることはできません。

デュアルコア特有の設定として、物理的なピンの割当てがあります。デフォルトでは、全てがマスターコアから使うことになっているので、スレーブから使いたいピンがある場合は、次のように設定する必要があります。

ピンは、ポートの番号で表されていますが、I2CのSCLなど、そのピンを共有するペリフェラルからの接続も含まれます。

その他に、デバック時にスレーブを切り離すか否かの設定があります。

この設定をONにすると、通常は必要な「マスター側からのスレーブコアの起動」を行わなくても、スレーブをデバッグモードで起動できるようになります。デバッグ時はONにすることをおすすめします。

プログラムとデバッグ方法

普通のPICと同じようにICSPを使います。通常、ICSPピンはマスターとスレーブで共有ですが、スレーブコア専用のICSPピンも存在します。このピンは、マスターとスレーブを同時にデバッグする時にのみ使うICSPピンで、それ以外では使うことはありません。

マスターとスレーブ両方のイメージ転送が行われるため、普通のPICよりも書込みやデバッグの開始に時間がかかります。最初のうちはちょっと遅いなと感じるかも知れません。(10秒くらいか、それ以上かかる)

マニュアル(AN272)では、次の4つにケース分けして説明されています。

デュアルコアのデバッグとプログラムモード
AN2721 – Getting Started with Dual Core

Master Core Only

マスターのみをプログラム又はデバッグする場合は、シングルコアのPICと何ら変わりません。もちろん、スレーブを起動する必要もありません。

Slave Core Only

スレーブのみをプログラム又はデバッグする場合でも、マスタープロジェクトは必要です。最低限、コンフィグの定義&転送とスレーブコアを起動する必要があるためです。
※デバッグの場合でコンフィグのS1ISOLATをONにしている場合は、起動は不要。

Dual Debug

マスターとスレーブを同時にデバッグすることもできますが、ICEが2つ必要になり、スレーブコア専用のICSPピンも使うことになります。

Normal Mode

マスターをプログラム又はデバッグし、スレーブはプログラムのみのケース。
両コアともリリース書き込みをする場合や、マスター側だけをデバッグする場合です。手順としては、マスターのみの場合と同じ、つまり普通のPICと同じになります。

操作手順

大抵はマスターとスレーブを別々にデバッグするやり方で事足りると思います。

マスターコア側のデバッグをする場合
Masterプロジェクトをメインプロジェクトに設定する。

Slavesプロジェクトフォルダのプロパティーで、スレーブコアプロジェクトのDebugチェックを外す

Masterプロジェクトで、コンフィグのS1ISOLATをOFFにする。

デバッグを開始する。※どちらもデバッグしない場合は、ここでリリースビルドして普通にdsPICに書き込めばOK。

スレーブコア側のデバッグをする場合
Masterプロジェクトをメインプロジェクトに設定する。

Slavesプロジェクトフォルダのプロパティーで、スレーブコアプロジェクトのDebugチェックを付ける

Masterプロジェクトで、コンフィグのS1ISOLATをONにする。

リリースビルドしてdsPICに書き込む。

Slaveプロジェクトをメインプロジェクトに設定する。

デバッグを開始する。

デュアルコアのプログラムやデバッグは、おなじみのPICKit3でもできます。

PICkit3PICkit3
Microchip正規品。PICへのプログラムの書き込やデバッグができます。最近では安い中国製の互換品も出回っていますが微妙です。

デュアルコアdsPICの入手先

dsPIC33CHシリーズでは、今の所28ピン~80ピンまでがラインナップされています。DIPパッケージは無いので、ブレボで使うには変換基板も必要。

発売されて1年ほど経ちますが、いまだ日本のパーツショップでは見かけません。しばらくは海外通販を利用することになりそうです。

Microchip DIRECT
MOUSER
Digi-Key

Digi-Keyと提携しているマルツでも入手可能です。
マルツオンライン