明けましておめでとうございます。本年もよろしくお願いいたします。RP2040を実装したある組込基板を開発している中で不思議な現象に悩まされていましたが、原因が分かったため、紹介したいと思います。
不思議な現象として、電源投入後、概ね正常に起動するが、時々起動しないという現象でした。起動しない状態になった際、RSTボタンを押すとすると正常に起動しました。プログラムが意図せずハングアップしているのかと思い、watchdogを有効にしてみましたが、上手くwatchdogのRSTが働かない・・・・という現象でした。
原因としてはBOOTがLOWと判断され、意図せずに書き込みモードで起動していたようです。基板の電源仕様の影響も多少ありますが、真因としてはBOOTスイッチのチャタリング防止0.1uFのキャパシタが邪魔して、起動時にBOOT信号がLOWとして判断されていたようです。当然ながら書き込みモードではwatchdogは働かず、書き込み待機状態になっていたようです。
RP2040のBOOTピンは外部FlashのCSピンと併用のため、起動直後にCSの状態を見て、通常起動するか、書き込みモードに入るか、判断される仕様です。RP2040のデータシートを確認するとCSのプルアップを有効にしてから100usec後にCSの状態を確認するようです。推奨回路やPico基板では10kΩでプルアップしつつ、1kΩでBOOTスイッチに接続されています。その回路そのままであれば問題ありませんが、抵抗で接続されたBOOTスイッチに更にキャパシタがあるとローパスフィルタとなってCSの立ち上がりが遅くなります。それにより、電源投入直後にCSがLOWと判断され、意図せず書き込みモードに入っていたようです。
電源の立ち上がりや最初のBOOTローダの起動時間を無視して、単純にCRのローパスフィルタとして考えると、抵抗は合計11kΩ、キャパシタは0.1uFなので、立上りは約2msecとなり、起動時の100usecに間に合いません。100usecに間に合わせるためには理論上、キャパシタを3.3nF程度より小さくする必要(3.3nF→立上り84usec)があります。
今回のRP2040を実装した組込基板はRP2040自体の電源をロードスイッチで管理する仕様だったため、通常の電源の立ち上がりに比べて緩やかであったことも多少影響していると思われます。
プッシュボタンスイッチがあるとチャタリング防止のため、習慣として0.1uF程度のキャパシタをパラに入れてしまいますが...Picoの標準回路同様にRP2040のBOOTスイッチにおいてはチャタリング防止のキャパシタを入れるのは避けた方がよさそうです。もし、入れるとしても0.1uFではなく、1nF程度の十分に小さなキャパシタに限られます。RP2040の他、最近リリースされたRP2350、RP2354等のBOOTスイッチは外部FlashのCSピンと併用のため、BOOTスイッチ周辺の回路設計には注意が必要だと思いました。