(この記事と第一回の記事との間には実時間で数日経っており、大分重複している部分がありますが、本人がメモ代わりに書いた物なので気にしないでください^^;)
Arduino IDEでMaple等のSTMF103なボードの開発を...と言う話があり、
手元を探したところHWデバッガー(似非ULINK2 & 似非J-LINK Plus)で標準なARM用JTAGを試すべく購入した上のボードがありました
このボード、安くて(eBayで送料込JPY500位でした)良いのですが、ネット上の評判は色々で、クリスタルが壊れてただの(?)と悪いのから、安くて良いんじゃないというものまで
回路図を見ると、LEDはVCC<>GND間のみでIOにはつながってないとかありますが、
USBのD+もジャンパで1.5Kプルアップ有る無しが選べたり、VCC/RX/TX/GNDがひとかたまりになってるし、勿論Boot mode選択用にBOOT0/BOOT1のジャンパもあるので最低限のことは出来そうです
なんせ「JTAG debug出来ればいいや」とコネクタだけ見て買ったので、その後積んでいましたが、もう少し調べてみました
最終的な目的はUSBで書き込み出来るようにすることです
STM32のこの辺りのレンジのMCUはUARTなBOOTLOADERが積まれており、USBシリアルモジュールでPCにつなげば最低限の書き込みは出来ます
あとBOOTLOADERのバージョンとかもあるようなので一応知っておきたかったり
STMのサイトから"Flash Loader Demonstrator(STSW-MCU005)"というのを落としてきます、
現時点でバージョン2.8.0
インストール後、PCとボードをUSBシリアル基板で接続
設定上、パリティがEvenになってたりしたので、普段は使わないのを合わせて設定、
Nextを押してボードに接続する
Flashサイズは64Kで表示されているが気にしない
ドロップダウンから128Kデバイスを選択すれば
128K読めてます
肝心のBOOTLOADERのバージョンは2.2
AN2606 ”STM32 microcontroller system memory boot mode”によれば、一応最新
このツールは、FlashをEraseしたり、MCUへバイナリをDLしたり、MCUからファイルに落としたり、Option bitを操作したりと、一通りのアクセスが可能になるので、最後の手段として使えそう^^;
こんな枯れたMCUですが、72MHzで走ってペリフェラルも一杯なのでいいのではと思って作業を進めます
その後、このボードに特化したこのページを発見^^
USB BOOTLOADERの項目もあり(!)
...少し寄り道、うちにはSTM32VLDiscoveryな基板も積まれていたが、これをメイン教材にした講座がIndiana Univ.に、C335
そこの教材にLab Manualと言うのが有り、これはいい教材
但し、C335のページから辿ると認証を求められるが、講師のページからいくと誰でもDL可
一番下の"STM32 Book"がそれ
...ところがこのUSB BOOTLOADERはどうもLinux環境用なのか、無理矢理DFUなWindowsのドライバをインストールしても(Maple用のドライバのinfファイルを書き換えたり...)うまくいかず...(この間、相当試行錯誤しています^^;)
本家にあった各種プラットフォーム(Linux/OSX/Windows)毎のドライバの挙動説明を読んだりしてなんとなくWindows固有の問題(1デバイス1enum)を把握しました
そうこうしているうちにSTM32duinoの方で、Generic STM32ボード用USB Bootloaderがバイナリまであったことに気がつき^^;
これを使って再度USB Bootloaderにトライ、
選択したのは一番上にあるやつでLEDがPA1につながっているボード用
手持ちのボードの唯一のLEDはVCCとGND間に1Kの抵抗を介してつながってるだけ...
取り敢えずPA1とUART専用な4ピン並びのGNDとの間に何かキャップでも作るとして、
まずはブレッドボードで実験
ボードへの書き込みはUSBシリアル基板でPC1に接続後、
STM謹製のFlash Loader Demonstratorでさっくり、BOOT0をHIGHにするのを忘れずに、
書き込み完了後はBOOT0はLOに戻してreset
次にSTM32duinoで配布されてるパッケージの中にあるDriverフォルダを使って
Windows用ドライバのインストール、ボードをPCにつなぐ前に
install_drivers.bat起動で事足ります
さてボードをUSBケーブルでPCにつなぐと、DFUのドライバインストールに成功するはず
しない場合はUSBの抜き差しを繰り返したり...
次に環境セットアップ済みのArduino IDEからボードに書き込みを試みる...
USBシリアルドライバがなんかの拍子にインストールされます^^;...
...これではどうしようも無いので、私の理解している範囲で説明すると、USB Bootloaderは起動後僅かの間DFUモードになり、Windows側もその認識でDFUドライバを関連付けてenumします(USBシリアルデバイスとして同時にenum出来ないのがWindowsの難点)
この間にダウンなパルスをボードに送るとBootloaderは続く4byteを監視し、それが"1eaf"("1"は数字のoneで、小文字の"L"では無いです、16進数4桁)だったらDFUモードでBootloaderの更新コマンド等を待ちます
但し、リセット後ダウンなパルスも無く一定時間が過ぎるとBootloaderは自身をリセットしてUSBシリアルデバイスとして再enumされようとします
この時WindowsはDFUのドライバを捨てて、USBシリアルのドライバに関連付けします
これでようやくとArduino IDEで指定すべきCOMポートの割り当てが行われ、
IDEでコンパイルしたスケッチがUSBケーブルで書き込めるようになります^^
...でようやくとLチカ出来そうになりました
サンプルのまま^^;、LEDをPB1につなぎ替えます
まさにArduino、
シリアルBootloaderはこの環境を使う限りUSB Bootloaderを何かの拍子に壊さない限り不要になりました^^/
結論としては、
- 中華ボードでSTM32duinoは動いた(USB Bootloaderで)
- reset swしかないボードだが、USB Bootloaderのおかげでsw操作等無しで楽々コンパイル & 書き込み
Arduinoっぽいのでナイス
- 分かったのは素直そうなボードならまず動きそうだと言うこと(Flash 128Kもあるし^^)
ペリフェラルも一杯^^
- 唯一Windows環境でネックになり得るのがドライバのインストール
提供されているbatファイルを使えばすんなりいけそうな気がする
(実際、試したらうまくいった、自分で延々buildしていた時間は何だったのだろう...orz)
上の方で書いたIndiana Univ.の講座のLab manualが積み基板のSTM32VLDiscovery用だったので
これも一通り試してみたいカモ
Arduinoっぽいので、次回は漢字ROMを読んで、TFT液晶に日本語表示してみようかと
それにしても今回はLinix環境で自分でUSB BootloaderをあれこれBuildしたりと、
期せずして色々勉強になりました^^;
今回はWindowsでない方が(i.e. Linux)の方がドライバのbuildもinstallも楽でした...
参考、スケッチをボードに書き込んだ際のArduino IDE上の表示
ついでにSerial.printを試しました、
USB経由でシリアルモニタに表示が出ることを確認
PWMサンプルなFadingもPB1でそのまま動いた^^