文章總列表

ESP32(4) ESP32-C3搭配Arduino

這篇簡單介紹怎麼在ESP32-C3跑起Arduino,還有一些思考的結果

[我認知的Arduino]

用SDK開發像開手排車,開發者得處理所有的細節,大一點的系統甚至得要一個team來處理;簡化的方法也簡單,用廠商給的預設組態先玩,出問題再找FAE幫忙解答。走SDK開發這路,每換一家廠商都是生命攸關的大事,畢竟底層的操作方法全換了

Arduino把底層介面包裝成一致性的介面,讓LED一閃一閃亮晶晶變得無比簡單。他整體的體驗還包括一致編輯器,程式庫下載器,除錯器。邏輯是Arduino規定了工具的操作介面,由廠商或熱心開發者配合Arduino的邏輯,加入生態(用的人多!)

選擇Arduino代表放棄某些彈性,換來輕易上手的介面。很多應用,或是製作原型,真的不需要搞清楚所有細節,這些細節真的多到很靠腰啊...


[ESP32-C3 + Arduino IDE]

下載Arduino IDE,很快就在ESP32-C3跑起Blinky範例。官網最新版(2022/9/17)很乾脆的說,ESP32-C不支援Debugger。這當然是假的,專做debugger軟體,visualgdb就有給出範例

正確的翻譯是:ESP32-C當然能用JTAG debugger,只是廠商還沒把介面修改成Arduino IDE認可的樣子,所以不能用


[JTAG原理/ Debugger原理]

JTAG硬體實作和scan chain有莫大的關聯,底下有段我發佈在PTT的心得是ARM7的紀錄,現代CPU應該沒這麼做了;大家可以讀一下,JTAG本身沒什麼神秘之處

程式build完產生執行檔,除錯軟體解析執行檔,載入到記憶體開始執行。上述的visualgdb,或是Arduino內建的debugger,或是platformIO都能做到,並沒有特別之處。現在的差異只剩下:Arduino IDE裡面的debugger,還沒人接上ESP32-C3


[ESP32-C + PlatformIO + Arduino]

在PlatformIO裡要架起Arduino倒是意想不到的簡單,基本上和上一篇幾乎一樣,差異只有framework = arduino這行。底下的範例也同時產生Release/ Debug兩種組態。照著一般build flow跑,然後就能debug了

[env]
platform = espressif32
board = airm2m_core_esp32c3
framework = arduino
debug_tool = esp-builtin
upload_protocol = esp-builtin

; Environment for debug
[env:airm2m_core_esp32c3]
build_type = debug

; Environment for release
[env:airm2m_core_esp32c3_release]



隨便寫個軟體試試看,確實是看到一閃一閃亮晶晶,也能設定斷點


這個工程樣板可以在此下載

[Re-Think Arduino]

Arduino IDE吸引大量開發者,提供簡單好用的開發板管理,程式庫管理,方便的除錯器,省去安裝toolchain的麻煩;PlatformIO應該也能做到一切,黑暗執行緒似乎打算轉檯了

理論上也能平常開發都在Arduino IDE,拿PlatformIO來當debugger使用

我猜兩個開發工具都會繼續活著,持續發展。想看到更多細節的開發者,有可能被吸引到PlatformIO


[Serial Print], 2022/10/02更新

在Arduio上,如果要透過內建的USB port印東西,需要在platformIO新增幾個compile option,初始化Serial port不用塞數baud rate。工程樣板也已經更新了




[JTAG原理]

現代 IC 在設計時, 會在輸出入的地方加入 flip flop

這個 Flip flop 可以用來阻擋IC輸出/外界輸入

進而做到, 隔離 IC 的功能


這裡講的 IC 不一定是整顆包起來的晶片, 也可以是 IC 內部的 module

運用加 flip flop 的方法, 可以把一整個 module 輸出入隔離開來...



----



這些 flip flop 還可以串起來, 一個串一個, 這樣做用途多多

串起來的 flip flop 叫做 shift-register

這個結構很有意思, 只要灌 clock 給這堆 flip flop

shift-register 的資料就可以被敲出來

反過來說, 我們想要的資料也可以敲進去


這個結構有個專業的名詞: scan chain


scan chain可以拿來測試 IC/module

舉例來講, 我們可以把輸入灌到某條 scan-chain

這條 scan-chain 正好是 IC 的輸入, 看到了嗎, 我們可以自行決定輸入


反過來講, scan-chain也可以把 IC 的輸出敲出來

所以剛剛打進去的輸入, 產生的輸出, 就可以用這招再敲出來 !!



----



以 ARM7 的 CPU 來講, CPU會存取的 data bus 上, 正好就有條 scan-chain 經過

如果我們想知道 register R0 的內容, 可以把下面這道指令塞到 scan chain 上...


        str R0, [R10]


這個指令會把 R0 的內容寫到 R10 指向的記憶體

CPU 會去執行這道指令, 但在 debug 模式時, CPU 被隔離, 沒辦法存取到記憶體

上面這道指令只為了讓 R0 的內容出現在 scan-chain 上


看CPU 的結構, R0 可能要一兩個 cycle 以後才會出現

這時候可以再塞一些 NOP 指令給 CPU 泡茶聊天...

等資料出現在 scan chain 時, 再敲 clock 就可以讀出 register R0 內容了


這個方法真的是, 很巧妙啊 !!

類似的技巧可以組合出, 讀寫記憶體, 讀寫 CPU 暫存器



----



實際看 JTAG 的文件, 還會包涵一張 state machine 的圖

除非有打算做 ICE, 不然知道 JTAG 的根本原理是用 scan-chain 做壞事就可以了 XD


ARM7 的文件有提到, 他的 scan chain 位在 CPU 哪裡

以及嵌入的 debug unit 怎麼用 scan chain 操作

瞭解 ICE 的根本原理, 其實很有意思的 :)



--


非專業讀書心得, 有錯請更正, 感謝 :)

留言

這個網誌中的熱門文章

幼犬書桌椅選擇心得 升降桌 兒童桌椅

Herman Miller Aeron 一代氣壓棒維修

JUJU-250 升降桌 電腦主機 桌下安裝 調整心得