/ クレア工房 / 電子工作 / PIC32 / PIC32の概要

PIC32の概要

特徴

特徴は次の通りです

メニュー

秋月で扱いのある(国内で購入の容易な)メニューは次の通りです。

Name ROM RAM USB
PIC32MX110F016B 16KB 4KB 0
PIC32MX120F032B 32KB 8KB 0
PIC32MX210F016B 16KB 4KB 1
PIC32MX220F032B 32KB 8KB 1
PIC32MX230F064B 64KB 16KB 1
PIC32MX250F128B 128KB 32KB 1
PIC32MX270F256B 256KB 64KB 1

電源

PIC32MX1 および PIC32MX2 の電源は 3.3V です。 消費電流は55mA以下です。

CPU コアそれ自体は 1.8V を要求しますが、 このための電源電圧はマイコンチップ内部のレギュレータが生成します。 レギュレータの安定化のために 1.8V 10μF 以上のバイパスコンデンサを CPU コア電源用レギュレータの端子 (VCAP) に外付けしなければなりません。 このほかに、電源ピンごとに一般的な 0.1μF のバイパスコンデンサが必要です。

CPU

PIC32 では標準的なアーキテクチャを持つ MIPS CPU コアが使われています。 PIC16 や PIC24 で使われていたような、 巷の C コンパイラが対応に手を焼く変態的な CPU コアのことは完全に忘れてしまって大丈夫です。 CPU の取り扱いに関して PIC16 や PIC24 の知識は役に立ちません。

PIC32 には PIC32MX ファミリと PIC32MM ファミリの選択肢があります。 勉強しなければならない項目に差異がありますので、 入門するなら選択肢の多い PIC32MX の選択をお勧めします。 PIC32MZ は DIP の選択肢がありませんので無視して大丈夫です。

Item PIC32MM PIC32MX1 PIC32MX2 PIC32MX3 PIC32MX4
CPU operation voltage 1.8V 1.8V 1.8V 1.8V 1.8V
CPU clock frequency Up to 25MHz Up to 50MHz Up to 50MHz Up to 100MHz Up to 100MHz
CPU core name microAptiv M4K M4K M4K M4K
Instruction Sets microMIPS MIPS32 + MIPS16e MIPS32 + MIPS16e MIPS32 + MIPS16e MIPS32 + MIPS16e
Instruction Cache No Yes Yes Yes Yes
Multiplier Yes Yes Yes Yes Yes
USB No No Yes No Yes

命令体系的にみてアセンブリ言語で人間が手書きすることは考慮されていません。 よほどのことがない限りCで記述してコンパイラに任せたほうが良いでしょう。

重大なバグ

ペリフェラルを調べるため等でマニュアルを読む前に、 最新のエラッタを 「公式からダウンロードして」 ひととおり調べることをおすすめします。 エラッタの内容はデバイスによって異なります……と言いたいところですが、 マイクロチップ社の修正の進捗は鈍くて遅いので、 最近のステッピングであろうとほとんどいっしょです。 いつになったらハードウェアバグから脱却できるのやら。

以下はリファレンスでもなければ具体的な回避方法を述べたものでもありません。 「エラッタを読まないとどれだけ酷いことになるか」 を想像してもらうために、恣意的に列挙したものです。 エラッタシートを読む気がしないならAVRから入門することをお勧めします。

1. 電源レギュレータの不具合

ブラウンアウトリセットが機能しない可能性があります。

2. オシレータ切替器の不具合

メインクロックの切り替えは失敗する可能性があります。 成功するまで繰り返す必要があります。

3. I2Cの不具合

アドレス0x78は扱えない可能性があります。 詳しくはエラッタシートを熟読してください。

4. USBの不具合

アイドル割り込みはワンショットでしか発生しません。 バスの再稼働が確認されるまで、 該当する割り込みフラグはクリアすべきではありません。

5. ADCの不具合

ADCモジュールは最大でも500kspsでしか正常に動作しません。

6. ADCの不具合

省略

7. ADCの不具合

ADCの変換開始を外部割込みINT0を用いてするときは、 常に上昇エッジを使わねばなりません。 割り込みが下降エッジで発生するように設定しても、意図したようには機能しません。

8. PMPの不具合

PMPを許可したとき、A0ピンとA1ピンにGPIO出力をマップすることはできません。 汎用出力として出力したいときはGPIOレジスタのかわりに PMPアドレスレジスタを使わねばなりません。

9. I/Oポートの不具合

I2C1モジュールが許可されているとき、 GPIOピンであるRA0とRA1のデジタル出力機能とアナログ機能は意図したように機能しません。 スルーレート制御ビットを1にして回避します。 回路の浮遊容量が大きい時の策はありません。

10. CPUコアの不具合

PIC32MXのCPUコアにはいささか重大なバグがあります。 通常、書き込みバストランザクションはストア命令の1度につき1度限り発生しますが、 CPUがタイミング悪く割り込まれた場合に、 割り込み前(命令のアボート時) と割り込み後(割り込まれた命令に復帰するとき) の2度に渡ってバストランザクションを発行することがあります。 副作用の伴うペリフェラル・レジスタに書き込む場合は割り込みを禁止しなければなりません。

11. オシレータの不具合

電源オンリセット期間中にCLKOピンに不安定な発振出力が現れます。 当該ピンを入力として使う場合は、 レジスタの設定によらず一時的な出力動作を覚悟しなければなりません。

12. インプットキャプチャの不具合

インプットキャプチャモジュールを割り込み専用モードに設定しなければ、 CPUがアイドルまたはスリープしたときに機能しません。

13. ワッチドッグタイマの不具合

ウィンドウモードではCPUがタイマのクリアを試みてもなお CPUリセットを発行することがあります。 (要するに使えません)

14. 5VトレラントでないI/Oピン内部プルアップの不具合

内部プルアップ抵抗は50μAを超えて電流を出すことはできません。 もし超えた場合、プルアップの用を成さない可能性があります。

15. 5VトレラントであるI/Oピン内部プルアップの不具合

内部プルアップ抵抗は50μAを超えて電流を出すことはできません。 もし超えた場合、プルアップの用を成さない可能性があります。

16. I/Oピンの不具合

オープンドレインとする設定は通常出力モードでないと機能しません。 加えて、ピン選択機能を使うことができません。

17. I/Oピンの不具合

I2C2モジュールが許可されているとき、 RB5ピンとRB6ピンのデジタル出力とアナログ機能は意図したように動作しません。 スルーレート設定ビットを1に設定しなければなりません。

18. I/Oピンの不具合

デバッグ用にPGED3/PGEC3ペアを使うと、一部の機能が動作しません。 VREF+, CVREF+, AN0, C3INC, VREF-, CVREF-, AN1 が使えなくなります。 これを回避するには PGED1/PGEC1ペアもしくはPGED2/PGEC2ペアを使用する必要があります。

19. UARTの不具合

UART受信動作でFIFOをオーバーフローさせてしまうと、 受信シフトレジスタが(ハングして)機能しなくなります。 この状態から復帰するにはUARTを繰り返しON/OFFする必要があります。

回避策として「絶対にFIFOをオーバーフローさせない」設計を施します。 これができない場合は、 通信プロトコルにおいてARQを実装し、 UARTをリセットして復帰させたうえで 受信しそこなったパケットを再送してもらいます。

20. Timer1の不具合

Timer1は外部クロック非同期モードにおいて 1:1プリスケーラモードでなければ割り込みを発生しません。

21. フラッシュメモリ制御の不具合

ブートフラッシュメモリ書き込み禁止を指示しなければ、 プログラムフラッシュメモリの書き込み禁止は有効になりません。

22. フラッシュメモリ制御の不具合

ブートフラッシュメモリ書き込み禁止の設定は、 誤ってプログラムフラッシュメモリの先頭ページ (アドレス0x0400未満) も書き込み禁止にします。 このことはフラッシュメモリ全体のバルク消去操作には影響しません。

23. フラッシュメモリ制御の不具合

プログラムフラッシュ書き込み禁止の設定は、 1ページずれています。

24. フラッシュメモリ制御の不具合

プログラムフラッシュ書き込み禁止の設定は、 実際にはマニュアルと異なります。

アドレス空間

MIPSにはメモリマップI/OとI/OマップI/Oの区別はありません。 すべてはメモリマップI/Oです。 ペリフェラルのアドレスデコードが大変なのではという気がしますが、 すべてはオンチップでありメモリバスが外部に出ていないので気にする必要はありません。 PIC32が搭載するPMPモジュールは CPUが直接アクセスできるメモリバスを外部に拡張するものではありません。

MIPSコアが採用されていることの厄介な副作用といて、 CPUバスとメモリバスの間にアドレス変換回路が介在します。 MMUの一種ですがページテーブルが扱えるわけではなく、 Fixed Mapping Translation (FMT)と呼ばれています。 OS搭載を想定した標準アドレスマップ すなわちユーザランドソフトウェアとの互換性を取るためだけに存在する、 最小限度のモジュールです。

x86/x64 CPUではキャッシュの許可をページテーブルで制御します。 MIPS CPUではMMU/FMTで制御します。 FMTではアドレスをハードウェア的に固定して割り当て、 ソフトウェアはそれに従います。 それによりキャッシュ有無も、 ソフトウェア的には仮想アドレスで選択することになります。

RAMでプログラムを実行することを前提としないマイクロコントローラであるPIC32に なぜFMTが存在するのか? といえば、 おそらくMIPS CPUコアに深く結合して供給されていて 省くに省けなかったのが理由と予想します。 真相は設計者のみ知るところです。

Virtual Address Name Description
0x0000 0000 〜 0x7FFF FFFF KUSEG ユーザアドレス空間は使用しません。 どうしても使いたければ、 レジスタを設定することでメモリをマップし、 使うことは可能です。
0x8000 0000 〜 0x9FFF FFFF KSEG0 キャッシュが許可されたカーネルアドレス空間には、 主要なコードやデータが配置されます。
  • 0x8000 0000 からRAMが始まります。
  • 0x9D00 0000 からProgram Flashが始まります。
  • 0x9FC0 0000 からBoot Flashが始まります。
  • 0x9FC0 0BF0 からDevice Configuration Registerが始まります。
0xA000 0000 〜 0xBFFF FFFF KSEG1 キャッシュが禁止されたカーネルアドレス空間には、 機能レジスタなどが配置されます。
  • 0xA000 0000 からRAMが始まります。
  • 0xBD00 0000 からProgram Flashが始まります。
  • 0xBF80 0000 からSpecial Function Registers (SFRs)が始まります。
  • 0xBFC0 0000 からBoot Flashが始まります。 リセットされたCPUは、 マスクROMあるいはマイクロコードによる初期化を済ませたのちに ここからプログラムの実行を開始します。
  • 0xBFC0 0BF0 からDevice Configuration Registerが始まります。
0xC000 0000 〜 0xDFFF FFFF KSEG2 PIC32では使用されません
0xE000 0000 〜 0xFFFF FFFF KSEG3 PIC32では使用されません

組み込みアプリケーションでは通常カーネル空間を利用します。 オプションとしてユーザ空間を定義することもできますが、 メモリ管理が簡素過ぎて役に立つかどうかは微妙です。

gccでコンパイルして作成する実行形式であるELFファイルは、 通常はランタイムに準じた仮想アドレスを前提として作成します。 ROMライタがPIC32のROMに書き込む場合、 仮想アドレスを物理アドレスに翻訳しなければなりません。

Physical Address Size Description
0x0000 0000 〜 0x0000 7FFF 4KB〜32KB Static RAM
0x1D00 0000 〜 0x1D01 FFFF 16KB〜128KB Program Flash ROM
0x1F80 0000 〜 0x1F8F FFFF - Memory Mapped I/O space (SFRs)
0x1FC0 0000 〜 0x1FC0 0BEF - Boot Flash ROM
0x1FC0 0BF0 〜 0x1FC0 0BFF - Device Configuration Registers

PIC32はブート用のROMを搭載しており、 その末尾16バイト分をデバイスコンフィグレーションのために予約しています。 デバイスコンフィグレーション情報はMCUリセット時に専用レジスタに読み込まれ、 デバッガの動作をブロックするコードプロテクト、 ブートメモリのライトプロテクト、 JTAGモジュールの許可、 クロック生成用のPLLを設定するなどの用途に使われます。

PIC32はブート用のROMから実行を開始しますので、 ブートローダを使用しない場合においても何らかの初期化プログラムを ブートROMに配置する必要があります。

クロック生成

オンチップRCオシレータ(FRC)で8MHzが供給されています。 最初期のソフトウェアはこれを前提に設計することになります。 水晶を付ける場合も、FRCに倣って8MHzが標準ということになります。

MCU外部に取り付ける水晶(またはその他の発振回路)は CPUクロックと直結されているわけではありません。 PIC32には一般的にクロック生成用PLL(System PLL)が内蔵されており、 水晶で作ったクロックは単にリファレンスとして使われます。

USBモジュールは48MHz固定のクロックを必要としており、 そのために専用のPLLモジュール(USB PLL)が組み込まれています。 USBモジュールを使用する場合は外部に水晶を取り付けるなどして 安定なクロックを供給する必要があります。

PLLに入力するクロックは3.92MHzから5MHzの範囲でなければなりません。 また、PLLが制御するVCOは60MHzから120MHzの範囲しかサポートしません。 このことを念頭にクロック生成用パラメタ決定する必要があります。


Copyright (C) 2014 clare. All rights reserved.