esp32のシステムを開発している。 プログラム書き込みは通常のシリアル経由でだが、 jtagで書き込めれば速いのではと思いついた。 ESP32 JTAGで検索すると 使えるようなので、基板を改版する際 JTAG端子(GPIO12-15とEN)用のピンヘッダを 追加した。
ESP32でJTAG電子工作
出来上がった基板にJTAGでのプログラム書き込みを 試すが上手く行かない。使用したJTAGアダプタは Olimex ARM-USB-OCD。 platformioを使っているので、platformio.iniに
upload_protocol = olimex-arm-usb-ocd
書けばjtagで書き込んでくれる。 表示されるエラーには
Error: JTAG scan chain interrogation failed: all zeroesなどとあり、全然動いていない感じ。 いろいろ調べるがわからないので、 JTAGアダプタとしてFT-232Hを使用してやってみると、 違うエラーが出る。
Error: IR capture error at bit 105, saw "0x4210842...
なんか、こっちはjtagが動いているし、惜しい(?)感じが する。しかし調べても原因がわからない。
実験対象をを自作の基板から ESP32-DevKitC(のコンパチ品?)に、 書き込むプログラムも単純なものに切り替え、 試行した結果 OLIMEX ARM-USB-OCDでプログラム書き込みができた。
問題の原因は2つ。1つはJTAGの接続間違いで、 もう1つはプログラムがJTAG機能を殺していたこと。 接続は このページ の表のとおりにしたら上手く行った。 失敗した時は ENをPin3(nRST)ではなくPin15(RESET)に 接続していた。 JTAGを殺す機能はESP32のeFuseにある。 このeFuseにはMACアドレスなども保存されている。 ESP32のフラッシュをクリアすると jtagで書き込めるが、 自分のプログラムを書き込んだ後だと jtagで書き込めなくなる。 プログラムで WiFiManagerライブラリを 使用しているので、このあたりが怪しいと 思っているが確認はしていない。 FT-232で上手く行かない原因はわからない。
接続 | FT-232H |
jtagでの書き込みができるようになったが速くない。 シリアル経由よりも遅い気がする。 プログラムの書き込みとverifyを なんの必要があるのかわからないが 4回繰り返している。 調整すれば多少速くできるのかも しれないが、期待とは程遠い。
期待したのはSTM32にST-Link2で書き込んだ時の 一瞬で書き込みが終わる感じ。 残念だがjtagでの書き込みは諦め シリアル経由での書き込みで我慢する。
そう言えば ESP32 JTAGで検索しても、 JTAGでデバッグするという話ばかりで、 書き込むという話は無かった気がする。