概要
- Pro MicroをPro Micro用のISPに仕立てた(+3.3V/8MHz版)。
- Arduino IDEに付属の ArduinoISPスケッチを使うときは、プログラマとして、Arduino as ISP (ATmega32U4) を選択する。
- avrdude.exe で指定するprogrammerのid (-cオプション) には、avrispではなく arduino を指定する。
秋になったある日、Pro Micro +3.3V/8MHz版のUSBケーブルをPCに接続しても仮想シリアルポートが出てこなくなった。そのためArduino IDEからスケッチの書込みができなくなった。ブートローダーを開始させるためにRSTピンをGNDに落としたりするが、うまくいかない。いつの間にか別のマイコンのブートローダーでも書いてしまったのかもしれない。
しょうがないので、ISPを使ってブートローダーを書き直すことにした。以前は+5V動作のPro MiniにUSB-シリアルデバイス(FT231X)を接続してやっていたが、今回のターゲットは+3.3V動作のPro Microなので、同じく+3.3VのPro MicroをISP装置に仕立てることにした。電圧の高い方から低い方に接続するラインにレベルシフタを入れることも考えられるが、同じ動作電圧のマイコンが使えるならその方が話は簡単だろう。
ISPやブートローダーについては、Arduino.cc が公開している Arduino as ISP and Arduino Bootloaders を参照のこと。
接続回路
2つのPro Microの接続は以下のようにした。
図面左側のPro Microがターゲット(書き込まれる側)で、右側がISPになる。ISP側のUSBコネクタにケーブルを差してPCまたはハブに接続する。2つのPro Microの電源としては、ISP側のLDOレギュレータの出力(+3.3V)が供給される。オンボードのLDOには300mAくらいの出力能力があるはずなので、電源は問題ない。
ISP側が+5V動作ならば
ISPとターゲットを接続するSPI用ラインのうち、ISP側が駆動するのはSCLKとMOSIの2本だけなので、+5V動作のArduinoをISPにするならばこれら2本を+3.3Vにレベルシフトする。そして、D10とターゲットのRSTを接続するリセット用の接続もレベルシフトが必要になる。また、ターゲット側の電源としてISPのRAW(USBのVBUS相当)またはVCCから、ターゲット側のRAWに接続する。
Arduino IDE (1.8.15)
ツールメニューの書込装置に、Arduino as ISP (ATmega32U4) という項目が増えていた。以前使ったときはなかったと思うのだが、しばらく「書込装置」は開いていなかったので、いつ追加になったのかはわからない。
当然これを選ぶ。ツール/ブートローダを書き込む を選ぶと、なんの問題もなく、書込みが終了した。
Arduino as ISP と Arduino as ISP(ATmega32U4)の相違については後述する。
avrdudeのパラメータ
フラッシュ内容の消去やヒューズの書き換えを行うときなど、avrdude.exe を直接使うことになる。avrdudeをコマンドラインから実行する場合、オプション -c に続けてISP装置名を指定する。 前にやったときは -c avrisp とか書いて通ったのだけど今回はだめだった。
1 2 3 4 5 6 7 8 |
c:\Program Files (x86)\Arduino\hardware\tools\avr\bin>avrdude -C ..\etc\avrdude.conf -p m32u4 -P COM6 -b 19200 -c avrisp2 avrdude: stk500v2_ReceiveMessage(): timeout avrdude: stk500v2_ReceiveMessage(): timeout avrdude: stk500v2_ReceiveMessage(): timeout avrdude: stk500v2_ReceiveMessage(): timeout avrdude: stk500v2_ReceiveMessage(): timeout avrdude: stk500v2_ReceiveMessage(): timeout avrdude: stk500v2_getsync(): timeout communicating with programmer |
Arduino IDEを使ったブートローダー書込みは成功するので、参考のために出力エリアを見てみると、以下のようになっていた。
-carduino とあるので、書込み装置名は arduinoとするようである。書き込み時のコマンドラインを表示するときには、以下のように環境設定で より詳細な情報を表示する:書き込み をチェックしておく必要がある。
avrdudeに対して -c arduino を与えて実行したところ以下のように正常に動作した。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
c:\Program Files (x86)\Arduino\hardware\tools\avr\bin>avrdude -v -C ..\etc\avrdude.conf -p m32u4 -P COM6 -b 19200 -c arduino avrdude: Version 6.3-20190619 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2014 Joerg Wunsch System wide configuration file is "..\etc\avrdude.conf" Using Port : COM6 Using Programmer : arduino Overriding Baud Rate : 19200 AVR Part : ATmega32U4 Chip Erase delay : 9000 us PAGEL : PD7 BS2 : PA0 RESET disposition : dedicated RETRY pulse : SCK serial program mode : yes parallel program mode : yes Timeout : 200 StabDelay : 100 CmdexeDelay : 25 SyncLoops : 32 ByteDelay : 0 PollIndex : 3 PollValue : 0x53 Memory Detail : Block Poll Page Polled Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- --------- eeprom 65 20 4 0 no 1024 4 0 9000 9000 0x00 0x00 flash 65 6 128 0 yes 32768 128 256 4500 4500 0x00 0x00 lfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00 hfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00 efuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00 lock 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00 calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00 signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00 Programmer Type : Arduino Description : Arduino Hardware Version: 2 Firmware Version: 1.18 Topcard : Unknown Vtarget : 0.0 V Varef : 0.0 V Oscillator : Off SCK period : 0.1 us avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.02s avrdude: Device signature = 0x1e9587 (probably m32u4) avrdude: safemode: lfuse reads as FF avrdude: safemode: hfuse reads as D8 avrdude: safemode: efuse reads as CE avrdude: safemode: lfuse reads as FF avrdude: safemode: hfuse reads as D8 avrdude: safemode: efuse reads as CE avrdude: safemode: Fuses OK (E:CE, H:D8, L:FF) avrdude done. Thank you. |
“-v” を指定しないと以下のようにヒューズのもつ値があっさりと出力される。
1 2 3 4 5 6 7 8 9 10 11 |
C:\Program Files (x86)\Arduino\hardware\tools\avr\bin>avrdude -C ..\etc\avrdude.conf -p m32u4 -P COM6 -b 19200 -c arduino avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.02s avrdude: Device signature = 0x1e9587 (probably m32u4) avrdude: safemode: Fuses OK (E:CE, H:D8, L:FF) avrdude done. Thank you. |
arduino プロトコルについて
ArduinoIDE の ツール/書込装置 で選択される内容は、…\Arduino\hardware\arduino\avr\programmers.txt に書かれている。その内容の一部を抜粋すると以下のようになっていた。
1 2 3 4 5 6 7 8 9 10 |
#通常のArduino用の項目 arduinoasisp.name=Arduino as ISP arduinoasisp.protocol=stk500v1 arduinoasisp.program.protocol=stk500v1 ... #ATmega32U4 (Leonardo, Pro Micro)用の項目 arduinoasispatmega32u4.name=Arduino as ISP (ATmega32U4) arduinoasispatmega32u4.protocol=arduino arduinoasispatmega32u4.program.protocol=arduino ... |
stk500 というのはATmel社が出していた AVR用の書込み装置で、ここでは制御側(PC)とのコマンドやデータのやり取りの規則(プロトコル)の名称として登場している。avrdudeのソースファイルを見ると、”stk500v1″プロトコルと”arduino”プロトコルはほとんど同じで、PC側からシリアルポートをオープンする際にちょっとした工夫が入っているだけのようだった。
最後に、ブートローダー書込みをしているときの様子です。一瞬ですが。