LPC810M021FN8 (2) -- シリアル ISP (2)

LPC8xx では「システム・クロック」として、

  • 12 MHz 内部 RC オシレータ
  • ウオッチドッグ・タイマ用内部 RC オシレータ (9.3 kHz 〜 2.3 MHz)
  • 外付け水晶振動子用 (内蔵) オシレータ
  • 外部クロック入力

および (ウォッチドッグ・オシレータを除く) クロック源を PLL で逓倍したものの、いずれかを選択することができます。
ただし、外付け水晶振動子用発振回路の端子 (XTALIN、XTALOUT) は P0_8 と P0_9 とに固定的に割り当てられており、8 ピンデバイスである LPC810M021FN8 には存在しないピンなので使用不可です。
リセット後は、必ず内部 12 MHz RC オシレータによるクロックで起動し、内蔵ブート ROM に制御が移ります。
ブート ROM 内のプログラムでは、まず「コード・プロテクション」のようすを調べ、プロテクトされていない場合に限り SWD (Serial Wire Debug) によるアクセスを許可します。
リセット要因には、パワーオン・リセットやリセット端子経由のハードウェア・リセットだけではなく、ウォッチドッグ・リセットもありますが、その場合には、有効なユーザ・プログラムが書き込まれていることを確認したうえで、ユーザ・プログラムのリセット・エントリに制御を移します。
その他の場合には、プロテクションで ISP (In System Programming) が禁止されていなければ、ISP 強制起動フラグ (P0_1 == 'L') をチェックして、UART (シリアル) ISP を起動するかどうかを判断します。
強制起動でない場合には、有効なユーザ・プログラムが書き込まれているかどうかを確認して、有効ならばユーザ・プログラムの起動、無効ならば UART ISP を起動します。
ISP 起動ピン」は、すべてのパッケージのブートローダバージョン「13.1」、「13.2」については「P0_1」となっていますが、ブートローダバージョン「13.4」では DIP8 ピン・パッケージ以外では「P0_12」に変更されています。
ブートローダバージョンとデバイスのリビジョンは現物にマーキングされています。
入手した LPC810M021FN8 ではマーキングは「4C」で、ブートローダバージョン「13.4」、デバイス・リビジョン「C」の 2013 年 41 週製造の物でした。
ここで問題となるのは、LPC810M021FN8 では外部クロック入力の「CLK_IN」と、ISP 起動フラグの「P0_1」とが DIP 8 ピンパッケージの同じ 5 番ピンに割り付けられていることです。
外部クロックが常時供給されていると、ISP 起動のための信号と干渉して、

  • ISP を起動したいのに、ユーザ・プログラムが実行されてしまう
  • ユーザ・プログラムを実行したいのに、ISP が起動されてしまう

という不具合が発生する可能性があります。
この問題を解決するひとつの方法として、外部クロックを常時供給するのではなく、リセットが解除されブート ROM 内のプログラムが実行されている期間では外部クロックは「ハイインピーダンス」とし、その後に「低インピーダンス」でクロックを供給する構成があります。
ブート・シーケンスで P0_1 を読んで ISP 起動を判断する時点で外部クロックがハイインピーダンスで影響を与えなければ、ISP 選択信号が 100 % 有効になります。
ユーザマニュアル「UM10601」では、セクション 21.5.1 Boot loader の項で、

Assuming that power supply pins are at their nominal levels when the rising edge on RESET pin is generated, it may take up to 3 ms before the ISP entry pin is sampled and the decision whether to continue with user code or ISP handler is made.

という記述があり、リセット後、ISP 起動ピンの状態がサンプリングされるまで最大 3 ms かかることが示されています。
実際のチップで、リセット後、ユーザプログラムが起動されるまでの時間を測定してみたところ、約 250 μs かかることが分かりました。
したがって、リセット後 1 ms 程度の間、外部クロック出力をハイインピーダンスに保持できれば問題は生じません。
OE (アウトプット・イネーブル) 端子付きのクリスタル・オシレータを使えば、比較的簡単な回路で実現できます。
秋月で売っているエプソントヨコム (現・宮崎エプソン) 製のクリスタル・オシレータを使った回路例を下に示します。

回路例には、5 V 定格、DIP 形状で 12 MHz 出力のものが単価 100 円と安い SG-531PAP (通販コード P-04795) を示してありますが、手持ちがなく、実験には手持ちの SG-636PAP (表面実装、5 V 定格、20 MHz、10 個入り 300 円、通販コード P-03007) を使って確かめてあります。
手持ちには 14.318 MHz の (無印) SG-531 もあるのですが、「P」サフィックスのない、このタイプは 1 番ピンは NC で OE 機能はないようで、うまく動作しませんでした。
OE 端子に接続してある 22 kΩ の抵抗と 0.1 μF のコンデンサによる時定数回路で、リセットの立ち上がりから約 1 ms 程度遅延してからクリスタル・オシレータ出力がアクティブになります。