【Nano Framework ESP32 篇】刷入 nanoCLR 韌體以及相關問題

东邪独孤發表於2024-04-13

老周在幾個世紀前曾寫過樹莓派相關的 iOT 水文,之所以沒寫 Nano Framework 相關的內容,是因為那時候這貨還不成熟,可玩性不高。不過,這貨現在已經相對完善,老周都把它用在專案上了——第一個是自制的智慧插座,這個某寶上50多塊可以買到,搜“esp32 插座”就能找到。一種是 86 型盒子的,帶螢幕,背部可以安裝繼電器,需要自己接線(也不難,把線削出銅絲,然後懟進去,上緊螺絲就行);另一種就類似公牛的那種,無螢幕,一個三腳插孔,不需要引線,程式測試好後直接插電用。第二個給打工仔們用的,買了一塊帶電池介面的 ESP32 板,外殼是他們自己做的,主要是遠端控制,不過那個老周做了兩個版本,一個是 Nano Framework 做的,一個是用官方的 idf 做的(主要是要用到藍芽音x 頻)。

經過實際使用對比,Nano Framework 比 MicroPython 好用。MicroPython 真的太難用了,用來做專案簡直是給後續的維護人員挖墳墓。

好了,上面好像說了無關的鳥話,說回正題。如果你說在 ESP32 上開發應用啥框架最好,那肯定是官方的 idf,C語言直接擼,支援C++。很多人老吐槽 idf 安裝不上。說實話,老周不知道他們是怎麼搞的,老周裝過很多次 idf,在自己家的電腦裝過N次,在樹莓派上裝過,在某辦公室的一臺執行 Deepin 的破電腦上裝過一次,每次都能一步到位。記得老周曾經寫相關水文,直接用離線包裝的。這裡老周就順便扯一下線上安裝的兩個關鍵:

1、安裝Python 後,pip 要改用國內源(比如最高學府源,老週一般用這個);

2、在下載 idf 時,下載來源要選樂鑫的,不要選 github。如果你不會魔法(魔法上網套路多,要小心,可以用託管在國外的虛擬機器,安全一點,老周用 Azure 虛擬機器下的),github 源容易失敗。

做好上述兩點,基本不會失敗。

也有人吐槽說 idf 很難用,老周反而覺得挺好用的,函式的命名是 *nix 風格,idf 畢竟是官方的,功能也是最多的,如果你要用到的一些功能第三方框架沒有的,那必須上 idf 的。

老周覺得,在國產晶片裡面,樂鑫真的做得不錯了,不然你看看其他的,SDK 全是老鼠屎。這裡點名批評一下嘉楠 Kxxx 晶片,看看你們給的 SDK 都是些啥東東,偷工減料就算了,SDK中還 bug 一串串的。驅動也封裝得雞模狗樣(抄來的,尤其是 spiFlash)。開源程度而言,樂鑫也算可以的了,只有網路協議部分沒開源。再看看其他的,動不動就是“驅動不開源”,不開源也算了,你為啥連個介面文件都不寫?沒暫存器說明,無API說明,呼叫起來全靠運氣,買這些開發板就是活受罪。

所以,哪怕樹莓派比較貴,但老周堅持用樹莓派。

嗯,又扯遠了,說回 Nano frw。這個框架有一個 .NET 工具——nanoff,主要是用來刷韌體和 CLR 的,這個工具直接安裝就能用的。

dotnet tool install -g nanoff

不過,它是基於 .NET 6 的,如果你安裝的 .NET SDK 不是 6.0,無法正常執行,這個簡單,安裝一下 .NET 6 SDK 就完事了,不用找原始碼編譯了,很麻煩的。原始碼獲取地址:GitHub - nanoframework/nanoFirmwareFlasher: 🧰 nano firmware flasher nanoff (.NET nanoFramework toolbox)

那我不用 nanoff 工具行不行?可以的喲,樂鑫官方有刷韌體工具,下載地址:https://www.espressif.com.cn/sites/default/files/tools/flash_download_tool_3.9.6_2.zip。

現在工具有了,下一步找韌體,地址:Cloudsmith - Repositories - .NET nanoFramework (net-nanoframework) - nanoframework-images (nanoframework-images) - Packages

這裡面可是啥都有呢,比如老周這個,ESP32-S3 的,長得像個 U 盤,帶個小螢幕(這款是微雪的)。

拆開後是這樣的:

引腳較少,主要是體積小巧,還帶個殼子。殼子沒有螺絲,徒手可以直接拆。

所以,老周選擇的韌體就是 ESP32_S3_BLE,不用低功耗藍芽的話,也可以選 ESP32_S3,然後下載一個 zip 包,解壓后里面就是基礎韌體和 CLR 韌體了,另外有幾個分割槽表,針對不同大小的 Flash 的。老周買的這個,微雪自己說是 16MB 的板載 Flash。

認識一下這幾個韌體:

1、bootloader.bin:就是 BootLoader了,沒什麼好介紹的,就是用官方 idf 編譯的載入程式;

2、nanoCLR.bin:.NET CLR ,大家都是 .NET 老油條了,就不用介紹 CLR 吧;

3、partitions_Xmb.bin:分割槽表,csv 格式的分割槽不能直接刷進去的,要二進位制檔案才行,Xmb 就是 Flash 大小,如 8mb、16mb 等。

聰明絕頂的你一定猜到了,我們就是把這三個東西刷進去就行。但問題來了,直接在二進位制層面寫儲存器,不是有偏移地址嗎?啥東西?就是哪個分割槽放哪裡唄,偏移的地址就是位元組(這樣理解沒問題,不要抬槓),就是把幾個分割槽排隊,不能有重疊,重疊就會覆蓋資料了。

比如,第一個分割槽假定從第 16 起,大小是100,那麼它的終點是 16+100;然後,第二分割槽可以在116後的地址開始,依此類推。

現在,關鍵問題來了,咱們要弄清這幾個韌體的起始地址,不能亂刷。亂刷可能執行不了的。

1、bootloader:ESP32-C3 和 ESP32-S3 是特殊群體,它們的 bootload 起始地址是 0x00,就是從 0 開始;其他的從 0x1000 開始。

2、partition:分割槽表從 0x8000 開始;

3、Nano CLR:執行時的起始地址是 0x10000。

可能有人又要抬槓了,老周,你是怎麼知道這些的?Nano Framework 自己說的唄,不信你自己找。而且這個也可以參考 idf 的 hello world 示例的分割槽表,一樣的。只是把工廠韌體換成 nanoCLR 罷了。

其實還有一個地址,我們寫的 .NET 程式被燒錄到 0x1B0000 處,不過刷韌體時我們不用管它。

好了,該準備的都準備好了,幹活吧各位。開啟 flash download tool,在彈出的小對話方塊中選你的 ESP 型號,比如我的是 ESP32-S3,工作模式就是 develop,不要選工廠模式,那個是大批次開刷,等會兒介面會出現密密麻麻的刷機狀態。刷寫方式保留 UART 就行,點OK。

然後出現主介面,我們依次選好韌體檔案,填好正確的地址。

注意:每個韌體前面的對勾要打上,勾上才表示要刷進去的;視窗底部,選擇正確的串列埠號。

最後,點選 START,閉上眼睛等著刷完吧。

要驗證能不能用,到 VS 上,選單欄執行【擴充套件】>【管理擴充套件】,搜尋 nano framework。

拼命裝它就是了。如果下載很慢,可以用 https://nanoframework.gallerycdn.vsassets.io/extensions/nanoframework/nanoframework-vs2022-extension/2022.3.0.78/1712863972341/nanoFramework.Tools.VS2022.Extension.vsix,放到迅雷上下就很快。下載完成後,直雙擊執行安裝就行了。

擴充套件雖然裝好了,但還沒真正應用,此時你要以管理員身份開啟 VS,等待幾秒鐘讓擴充套件更新配置。然後在選單欄上執行【檢視】>【其他視窗】>【Device Explorer】,開啟檢視裝置的視窗。如果沒有別的問題,你會看到 ESP32 裝置了(沒看到的話,可以拔掉重新插上)。

這時你會發現,視窗上的一排奇葩按鈕看不見,不管它,反正不影響使用。

當然,如果你剛才刷錯了韌體,也可能無法執行。沒什麼大不了的,多刷幾個試試就是了。

新建一個專案,選擇“Blank Application”(空白應用程式)。

然後,就會看到熟悉的程式碼了。咱們把 Main 方法中的程式碼改一下:

public static void Main()
{
    int id = 0;
    while(true)
    {
        id++;
        Debug.WriteLine($"Hello, Gay{id}!");
        Thread.Sleep(2000);
    }
}

然後,執行。要在輸出視窗中看到內容,要用 Debug 類來輸出。結果如下:

取消除錯。咱們在 id++ 那裡設一個斷點,再次執行。

可以斷點除錯,是不是比 MicroPython 要強很多呢?

相關文章