秋月でPIC32MX 28pin DIP版出る
* はじまり
2012/06
http://akizukidenshi.com/catalog/c/cpic32_dI_ssp/
秋月で、なんと、28pin DIP 300mil の32ビットマイコンPIC32MXが、
さらに、なんと 32KByte + USB機能付で220円ポッキリという
いわゆる、「秋月価格」で販売開始された。
PIC32MX220F032B
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en556007
ちなみに、メーカ直販価格は2012/06時点で、1個 216円(80円/$)=$2.7、
1000個以上で1個 168円(80円/$)=$2.1
http://www.microchipdirect.com/ProductSearch.aspx?keywords=PIC32MX220F032B-I/SO
少し前にARM Cortex-M0 の 太めな28pin DIP 600mil タイプがあったけど、このPIC32MX220の300milの
ほうが小さくて良いね。Coretex-M0 DIPも秋月に置いて欲しいけど。
より大容量型:
以下の様に同じ28pin DIPの大容量型も存在するので、これらも秋月価格でだしてほしいね。
28pin DIP Flash, SRAM,
PIC32MX230F128B 128kb, 32kb, USB
PIC32MX250F064B 64kb, 16kb, USB
http://www.microchip.com/maps/microcontroller.aspx
* PIC32MX用コンパイラ
コンパイラは、
1, MPLAB系に付いてくる「pic32-gcc」、
2, Pinguinoプロジェクトで配布している「mips-gcc」(無料)、
gcc version 4.5.2
これはPinguinoをインストールすると自動でインストールされる。
http://avr.paslog.jp/article/2477815.html
Pinguino X.3なら
C:\PinguinoX.3\win32\p32\bin
に実行パスを通せばコンパイル可能。リンカスクリプトやビルドスクリプトは
一度Pinguino上でコンパイルすると、
C:\PinguinoX.3\source
に生成されるので参考になる。
3, Sourcery Codebench Lite MIPS ELF
gcc version 4.6.3
mips-sde-elf-gcc
mips-sde-elf-g++
後述。 調査中。
4, Chipkit IDEに付属のgcc
調査中。
https://github.com/chipKIT32/chipKIT32-MAX/downloads
mpide-0023-windows-20120903.zip (Windows用)をダウンロード、解凍します。
これらのgccは同じgccから派生した物と思われます。
比較はこれからだけど、最適化制限のあるMPLAB系のgccよりも最適化制限のない
その他のgccのほうがFlashサイズが小さくなる可能性が高い。
16bit長のコード生成 / mips16e:
『はじめて読む MIPS(リローデッド)』 by 中森章
http://www.cqpub.co.jp/interface/TechI/Vol39/app/mips_asm.pdf
が非常に参考になります。
ARMのThumbコードと同様に16bit長のコード生成が可能で、実行速度は落ちるものの
Flashサイズを激減させることが出来る。
今回のPIC32MX220等には必須だろう。
mips-gcc -Os -mips16 main.c
の様にコンパイル時に「-mips16」オプションを付ける。
リンク時にも付ける。
MPLAB IDEの場合、コンパイルオプションの設定で、
General - 「Genarate 16-bit code」にチェックを入れる。
コードの最適化は、「-Os」にしておく。(最適化の期限切れのはずだけど、なぜか多少の効果がある)
アセンブラ出力で確認する:
MPLABなら
pic32-objdump -h -S main.elf > main.lst
mips gccなら
mips-objdump -h -S main.elf > main.lst
とELFファイルからアセンブラ出力が得られるので、実際の16bit長のコード、
32bit長のコードの使われ方が確認できる。
*OpenOCD/JTAGでPIC32MX220に書込み&デバッグ
以下のスレッド、まだ全部読めてないけどPIC32MX220F03Bは既に
OpenOCDで対応済み風。
http://www.mail-archive.com/openocd-devel@lists.sourceforge.net/msg01059.html
なので、JTAGアダプタさえあればPickit3なしでもFLASH書込み&デバッグが今すぐ
出来る可能性が高い。
28pinしかないのでちょっとつらいけど、
Pingunoプロジェクトの
http://avr.paslog.jp/article/2477815.html
PIC32MX220用のブートローダがそのまま使えるらしいので、
最初にブートローダだけ書いて使うという手が良いかも。
ついでにPinguinoも試せる。
* PIC32MX220のエラッタ
http://ww1.microchip.com/downloads/jp/DeviceDoc/jp556114.pdf
2012/06現在入手できるのは、たぶんリビジョン「A0」か「A1」のはず。
(エラッタは今のところ11個)
ちなみに、このリビジョン「Ax系列」はかなり初期の段階で、これから修正が
入るのと新たなバグが発見されて「Bx系列、「Cx系列」に移行して行くと思われる。
エラッタは全部熟知したほうが良いわけだけど、なかなか大変。
自分的にハデ目なものを挙げてみる。
(以下はざっくりめなので詳細はエラッタ参照のこと)
(1)CPUの書込みサイクル・バグ
通常、CPUの書込みサイクルの初期段階で「割込みが入る」と、
(a) 書込みサイクルキャンセル(或いは保留?)
(b)→ 割込み処理開始 → 割込み終了
(c)→ キャンセルされた書込みサイクル開始
という形になるが、(a)部にバグがあって
「書込みサイクルがキャンセルされずに実行されてしまう」ので
結局、余分に書込みが発生してしまうのだ。orz
問題:
書込み先がメモリなら無問題なものの、SPI,I2C,UARTなどの送信レジスタ
だった場合、同じデータが2度送られるという凶悪なバグが発生する。
(PMPも同様らしい)
対策:
送信レジスタに書く前に必ず割込みを禁止する。
又は、送信にDMAを使えば避けることができる。
orz
エラッタは読んだ方が良い。
まず、エラッタを読む。
* pic32prog: PIC32MX220をPickit2/Pickkit3で書き込む
このソフトを使うと
http://code.google.com/p/pic32prog/
Pickit2で標準サポートされていないPIC32MX群への書込みが
できるらしい。
Windows/Linuxで動作可能の様だ。
ここ数日(2012/06/19)で大きく変わっていて、
(1)Pickit2/Pickit3対応
(2)WindowsではUSB HID対応となり、LibUSB-Win32のドライバは不要となった。
(3)LinuxはLibUSBベース
(4)デバイスIDの誤記修正
(5)書込み速度の改善
等々、良い感じになってきた。
特にWindows用がHID直接タイプになったので非常に使い易い。
(ドライバのインストール不要で、pic32prog.exeを実行するだけ)
コンパイル済みの実行ファイル:
http://code.google.com/p/pic32prog/source/browse/trunk/pic32prog.exe
実は上のリンクから実行ファイルが取得できないので、
こちらで取得したものを置いておきます。
解凍するといろんなファイルに混じってpic32prog.exeが出てきます。:D
pig32prog_src_pack_2012017.zip
これは、うまく書込みできないのでirukaさんのページのものを取得してください。
PIC32MXについて(概要)
http://hp.vector.co.jp/authors/VA000177/html/PIC32MX.html
使い方:
http://code.google.com/p/pic32prog/wiki/README
* pic32prog はダメだった orz 2012/11
このソフトで実際に「Pickit2」からPIC32MX220F032Bへ書き込んでみたものの、
LEDチカチカさえ出来なかった。orz
ソースを見るとコンフィグファイルの書込み部分に難ありな感じでした。
素直にPickit3を買った方が良いかも。 orz
(2013/02)
Programming pinguino 32 PIC32MX220 hid bootloader not responding
http://code.google.com/p/pic32prog/issues/detail?id=5&sort=-id
上のページでも同様にコンフィグ部分に不具合があると指摘されている。
上のページから得られるファイルにPic32progで書き込めるPinguino 32のブートローダファイルが
あるので、そのうち試してみよう。
(2013/02)
irukaさんの改良版pic32progで見事書込み&LEDチカチカ成功しました。
大感謝 m(__)m
ようやくスタートラインに立てたもののすでにモチベーションが...(爆
*UBW32プロジェクト
というのもあるらしい
http://www.schmalzhaus.com/UBW32/
* 最適化制限のない CodebenchのMIPS, コマンドライン コンパイラ
CodebenchもMIPS用のコンパイラを出しているので、MPLAB(X)のコンパイラに付属の
PIC32MXマイコン用ヘッダファイルやリンカスクリプトを使えば、
最適化制限なしでコンパイルできるんじゃないかと思います。
Sourcery CodeBench Lite Edition for MIPS ELF
https://sourcery.mentor.com/GNUToolchain/subscription3537?lite=MIPS
のページに入って、「IA32 Windows Installer」を選択。
ダウンロードは登録が必要。
探査中。
参考文献:
参考:
1個200円のマイコンに書き込むために約4000円のライタが売れまくるという戦略。
も、あるにはある。(爆
検索キー: pic32 pic32mx pic32mx220 PIC32MX220F032B Pickit2 Pickit3 pic32prog errata エラッタ Pinguino
posted by Copyright (C) audin All Rights Reserved. at 00:00|
Comment(17)
|
PIC32MX
|

|
おかげでSerialも動きました。
PinguinoX.3のスケッチのままでOKでした。
io.cのソース読んだら、remapのTX,RXがどこに
繋がるべきか分かりました。
配線チェックしてたらU1TXとU1RXが逆でした。がっくり。
(以前に試したときはU1TXもU1RXもHi.Zになってた気がしたんだけど、きっと夢でも見てたんでしょうね)
軽量型ブートローダすばらしいです。
今後使わせていただきます。
ようやくブレッドボード改造してPIC32 Pinguino readyになったところなので、これからいろいろ試したいと思います。
CDC.printf()もirukaさんのページを参考にうまく動きました。m(__)m
PinguinoのUARTですが、
p32/include/pinguino/core/io.c
の最後あたりにMX220F032の定義があるので、
以下を追加で動作しました。マッピング漏れでした。
SPIは未確認です。
#ifdef __SERIAL__ U1RXRbits.U1RXR=4;//Define U1RX as RB2 ( D10 )
RPB3Rbits.RPB3R=1;//Define U1TX as RB3 ( D9 )
#endif
#ifdef __SPI__
SDI1Rbits.SDI1R=1;//Define SDI1 as RB5
RPA4Rbits.RPA4R=3;// Define SDO1 as RA4
#endif
ピン数が少ないのでSPIはオーバーラップしてます。
をMX220対応させて、8KB(+3K)に詰め込み成功
しました。(1kB弱の余裕があります)
ライター(PicKit2互換機)とブートロが完成し
ましたので、(自分的には)目的達成です。
全体を-mips16でビルドできるようにするためには、mips16でコンパイルエラーする関数を片っ端から
__attribute__((__nomips16__))
すればOKです。
というかMicroChipのライブラリは大抵そうなっています。
Pinguinoのライブラリはそこが手抜きです。
というかスケッチをmain32.cにインクルードさせ
ると同時にそれに必要なシステムライブラリも
ソースでインクルードして一発芸コンパイルする
環境もどうかとは思っています。
(そこがArduinoの強引さなんでしょうけど)
UBW32のブートローダーHIDBoot.X.zipをMX220
に対応させてみました。
以下のサイトに公開しました。
ttp://hp.vector.co.jp/authors/VA000177/html/PIC32MX.html
MPLAB付属のpic32-gccは'-mips16'が効くみたいです。-mips16でビルドするとコードサイズは11K程度になります。
BOOT-ROMが3K(BFC0_0000〜BFF)ありますので、
そこに詰め込めればFLASH消費量 8K以内に詰め込めそうで、そうでない感じです(爆
詰めたところで、ユーザーエリアが4K増えるだけ
で焼け石に水なんですけど・・・。
MIPS32はメモリー空間32bit FLATなMPUのはずなのに、どういうわけかPIC18Fみたいな細切れSEGメモリーに詰め込む時代錯誤感半端無い、
相変わらずのMCHIP法則が発動しています。
いろいろ情報ありがとうございます。
>CDCprintfとか割り込みとかは動くようになりました。
まとまったら本家に投げちゃいたいですね。
>system.cあたりにインラインアセンブリやマクロが山盛りで入っていて
これ気づきませんでした。
去年トライしたときは以下のアトリビュートで
割込みとスタートアップコードだけなんとかしようと画策しましたが、Flashに書き込めないので挫折しました。(^^;
型 __attribute__((__nomips16__)) func(void)
型 __attribute__((__mips16__)) func(void)
相変わらずSerialはだめなんですが、
CDCprintfとか割り込みとかは動くようになりました。
mips16なソースは混ぜても危険ではなく動くみたいでした。(jalx命令でmips16コードを呼び出します)
スケッチ自体をmips16でコンパイルしようとするとpinguino/core/system.cあたりにインラインアセンブリやマクロが山盛りで入っていてそれらは
MIPS32限定品なのでエラーするのは仕方ないですね。(全部外部関数にしてそれらだけMIPS32でビルドしておくとか)
Pinguinoのブートロは一応MX220で動いてますし、
インチキ(?)PicKit2も安定してますので環境としては悪くないです。あと、AN1388ブートローダー
をMPLABでビルドして-mips16で動きました。
>そもそもOnTimer0()とか実装されてませんでした。
PIC32の方はずっと書込み不能だったので無関知でしたが、まだまだ絶賛開発途中でしたか :D
ひとまず、新規ページに簡単にGUIがインストールできるものをアップしました。
Py2.6はこれから試します。
PinguinoX.3ではSerialが動かなかったので、PinguinoX.4にあるexample/とかp32/をPinguinoX.3に接木することで、wxguiだけX3な
X4環境を作ってSerialPrintfを試そうと悪あがき
してました。
結果は惨敗です。U1TX,U1RX(U2TX,U2RXも)に
なんの信号も出てきません。というか0Vです。
割り込みによるBlinkも全然動かなくて、ぐぐって
みたら無理やりIntハンドラーをスケッチに書いてるページに辿り着きました。そもそもOnTimer0()
とか実装されてませんでした。
仮想マシン上のXPでやってみましたがPythonは、
今はv2.6じゃないとうまくないようです。
v.2.6ならこれで。
ttp://www.python.org/ftp/python/2.6.6/python-2.6.6.msi
参照ページ(インストール系)
ttp://avr.paslog.jp/article/2239812.html
以下にX.4のインストールの補足を追記しました。
ttp://avr.paslog.jp/article/2477815.html
ページが分散してしてしまったのでそのうちまとめようと思います。
あと、実験的ですが、簡単にインストールできるパッケージを作成中です。
たびたびすみません。netlaputaは入れないようです。
ttp://wiki.pinguino.cc/index.php/Development_environment_applications_and_support_libraries
に書いてあるようにPython25を入れてwxPython2.8を入れようとすると、for Python26なので入りませんでした。無理して入れてみたのですが、MSVCP90.dllが無いとかわけわかめになるようです。
>これが比較的最新版の入手法ですがメンドクサイので多くの人が挫折しているようです。(爆
PinguinoX.3でSerialがうまく動かなかったので
X.4にしようとしたんですが案の定挫折しました。
(source/stdoutと等価です)
Makefile32.win32内の「copy」コマンドは「cp」に変更しておきます。(utf8のエラー防止)
この辺はPIC18Fだと無問題だったのですが、MIPSコンパイラはエラーコメントを日本語で出すのが問題の様です。
さっきPinguinoのGUIを使って、
01.Basic - Print Formatted - Printf.pde
を試してみました。
普通にビルドするとlink errorが出ますが、
CDC.printlnを半分くらい削ると14K程度に
なって、ちゃんとスケッチとして動作する
ようです。
Pinguinoにはいろいろ謎があって面白いです。
スケッチはC++ではなくCの拡張子みたいなん
ですけれど、
CDC.printf() みたいにC++風に書いてあって
それが何故か/source/user.cではCDCprintfに
置き換わって動いていたりしてpythonは魔術です。
というかworking_dir/には*.pycしかなくて
ソース読めなかったりします。
irukaさんのpled.zipで見事にLEDチカチカ出来ました。(^^)/
ブートローダはこれから試してみます。
ありがとうございます。m(__)m
MIPS32はコード効率が悪そうですね。jump命令16バイトは絶句です。
"-mips16"オプションは必須な感じですがPinguinoは
無関心のようです。(爆
ARM7同様にスタートアップコードと割込み関係だけはmips32コードであることが必要みたいです。
あと、PinguinoのX.3はだいぶ前から放置されているのでX.4のrev.684が比較的まともだと思います。
なにぶんにもコードがでかいことですね。
PinguinoのBL(ブートロ)は12k常駐しますので
残量20kということになりますが、さらに
4kはboot flashの代わりのベクターエリアと
いう設定なので、実質16kしかコードを置けません
printfを使っただけでオーバーします。
というより、絶対番地へ飛ぶjmp命令が常に
16バイトも消費してます。(爆)
自分もconfigの罠にはまりました。
不思議なことにdevcfg0のdebug bitが'10'でも
RAMを16バイト未満使用ならLチカが動いて、
16バイト以上使用ならLチカすら動かない、
という不思議な現象です。
(ホントに.bssの初期化サイズ以外全く同一
のHEX で試してそうなりました。)
結果的にはdebug bitを'11'にmodifyすることで
PinguinoのBOOTLOAERがちゃんと動くように
なりました。
(pic32progをバキバキ改造してやりました)
書込みありがとうございます。
config DEBUGなしでもう一度ためしてみます。