平成27年 5月 29日
割り込み関連のフラグを共通化する えっ、割り込みフラグの配置がファミリーによって違う?
次にDMAを使用した高速通信の準備をしていたのですが、ここで思わぬ落とし穴が見つかりました。
PIC32はデバイスの規模によって割り込み関連のIFやIEといったフラグのアドレスとビット配置が異なります。今まで、このようなデバイスに出会ったことが無かったのでビックリです。
確認のためにデータシートから割り込み関連のフラグ一覧表を一部を引用します。最初はPIC32MX5xx/6xx/7xxデバイスです。
(PIC32MX5xx/6xx/7xxデータシートより引用)
名前 IRQ番号 ベクタ番号

次はPIC32MX1xx/2xxデバイスです。
(PIC32MX1xx/2xxデータシートより引用)
テーブルは左から名前・IRQ番号・ベクタ番号・IF・IE・IPCの順に並んでいます。同じDMA0でも全てが再配置されていることが分かります。
このように再配置されているのは割り込み関連のフラグだけのようで、個々のSFRレジスタのアドレス等は両デバイスで一致しています。
このため以前書いたUARTライブラリ(USARTの番号を変更できる)のように、割り込み関連フラグのアドレスと配置が固定と仮定していたプログラムは、異なるPIC32ファミリーではそのまま動作しません。従って書き直しです。やれやれ。
デバイスファミリーの変更によって再コンパイルするのはいいので、ソースレベルで互換性を維持します。
上記の表を良く見ると、全ての割り込み関連のフラグで下記が成立しています。
- 割り込みフラグIFSと割り込み許可フラグIECはIRQ番号から一意に配置が決定しています。
- 割り込み優先度IPと副優先度ISはベクタ番号から一意に配置が決定しています。
IRQ番号, ベクタ番号はXC32コンパイラによって各デバイスごとにマクロ定義されています。
これを使って再度、周辺機能のライブラリを作り直してみます。