【Nano Framework ESP32 篇】刷入 nanoCLR 固件以及相关问题

老周在几个世纪前曾写过树莓派相关的 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 要强很多呢?