LGT8F328Pのブートローダー書き込み

LGT8F328Pのブートローダー書き込みがやっと成功しました。普通に使っていれば、ブートローダー書き込みは必要ありません。これは、万一ブートローダーを飛ばしてしまったときのための備えです。
しかし、LGT8F328Pへのブートローダー書き込みは困難でした。失敗を繰り返し、漸く成功しましたので、備忘録として残しておきます。
LGT8F328Pのブートローダー書き込みにはSWD端子を使う
本家Arduino UNOや、多くの互換機のMCUは、ATmega328P(ATmega328PBもある)が使われています。しかし、激安互換機のMCUはLGT8F328Pです。搭載のMCUが違うため、ブートローダー書き込みに使う端子も異なります。ATmega328Pでは、ISCP端子を使用します。しかし、LGT8F328Pでは、SWD端子を使用して、ブートローダーを書き込みます。
SWDでは、送信と受信を1本の信号線で行います。送信と受信が別なISCPでは、6本の結線が必要です。しかし、SWDでは一本減って、5本の結線で済みます。
LGT8F328Pのブートローダー書き込み時の結線
ATmega328P(B)を使用したArduinoであれば、ISCP端子に出ている信号線が、D11~D13にも出ています。しかし、LGT8F328Pの場合、SWC(クロック)とSWD(データ)はSWD端子にしか出ていません。そのため、SWD端子にもピンヘッダを取り付けておいた方がよいでしょう。
SWD端子のピンアサインは以下のとおりです。

今回は、2台のLGT8F328P搭載Arduino互換機を使用して、ブートローダーを書き込みます。結線は下図のとおりです。

書き込み側 | 書き込まれ側 |
GND | GND |
5V | VCC |
D10 | RST |
D12 | SWD |
D13 | SWC |
書き込み側の結線は、ATmega328P(B)搭載の互換機でブートローダーを書き込む場合とだいたい同じです。
なお、ブートローダー書き込みには、LarduinoISPというスケッチを使用します。LarduinoISPの説明書きには、D7~D8にステータス表示用のLEDを設置するよう記載されています。しかし、これらのLED設置は必須ではありません。
また、一部のサイトで説明されている、RST端子のプルアップは必要ありません。なぜならば、RST端子はLarduino基板上でプルアップされているからです。また、SWD端子のプルアップも必要ありません。その他、RST端子とVCC端子間のコンデンサは無くても動作します。
LarduinoISPスケッチを書き込み機に書き込む
結線が終わったら、書き込み側LarduinoをISPに仕立てます。この作業は、結線後に行っても問題ありません。
今回は、LGT8Fxプロジェクトのボードマネージャーを使用しています。したがって、その他のボードマネージャーを使用した場合は、以下の説明とは異なる可能性があります。
書き込みに使用するスケッチ、LarduinoISPを開きます。

使用するLarduinoISPは、ボードマネージャーインストールと同時に、ArduinoIDEにインストールされます。
ArduinoISPの「ファイル→スケッチ例→LGT8F328用スケッチ例→LarduinoISP→LarduinoISP」にあります。
しかし、このスケッチを書き込んで、そのままブートローダーを書き込むとエラーになります。

エラーの内容から判断すると、書き込まれ側のLGT8F328Pとの同期がとれていないようです。実際に、信号波形を見てみると、書き込まれ側のLGT8F328Pが応答していないようでした。

LGT8F328Pのブートローダー書き込み失敗の原因
色々な説明を読みながら、ブートローダーの書き込みを試しましたが、ことごとく失敗しました。そこで、最終手段として、オシロスコープで信号を見ながら、失敗の原因を探りました。本来であれば、ロジックアナライザが欲しいところです。しかし、無いものは仕方がありません。
結局、失敗の原因は、リセット信号にありました。リセット信号が短すぎるため、書き込まれる側が応答できないようです。スケッチを修正しようかとも思ったのですが、一か八か試した方法が、効果的でした。それは、書き込みに使用しているLGT8F328Pのクロック安定化です。
LGT8F328P搭載のArduino互換機は、デフォルトで32MHzの内部クロックで動作します。どうやら、この内部クロックのジッターが大きいようです。幸い、購入したArduino互換機には、水晶発振器が搭載されていましたので、これを使ってみることにしました。
クロックソースの切り替えは、スケッチ書き込み時に行われます。今回は、ArduinoIDEのツール設定を以下のように変更してから、LarduinoISPのスケッチを書き込みました。

ArduinoIDEのツール設定を、上図の様に変更します。シリアルバッファを250kBに設定。クロック源を「External 16MHz」に設定。書き込み装置は「AVR ISP」に設定しておきます。
これらの設定を終えたら、「CTRL+U」を押して、書き込み用のLarduinoにLarduinoISPを書き込みます。これで、書き込み機の準備は整いました。
ブートローダーを書き込む
ブートローダーを書き込む前に、ArduinoIDEのツール設定を元に戻しておきます。しかし、ここで設定を戻し忘れても、次のスケッチ書き込み時に戻せます。したがって、ツール設定を戻し忘れても、困ったことにはなりません。おまじない程度に捉えておいてください。

ArduinoIDEのツール設定を戻したら、「ツール→ブートローダーを書き込む」をクリックしましょう。これで、LGT8F328Pを使用したArduino互換機へのブートローダー書き込み完了です。万一ブートローダーを飛ばしてしまっても安心です。
LarduinoISPを使えば、USB-シリアルコンバーターを搭載していないボードにスケッチを書き込めます。とびっきり安価な、LGT8F328P MiniEVBなどへのスケッチ書き込みもできるはずです。
