【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 要强很多呢?
【Nano Framework ESP32 篇】刷入 nanoCLR 固件以及相关问题的更多相关文章
- NodeMCU入门(1):刷入At固件,透传数据到TcpServer和Yeelink平台
准备工作 1. NodeMCU LUA ESP8266 CP2102 WIFI Internet Development Board,仔细看背面可以看出自带cp2102模块,可以通过普通的手机充电 ...
- 杂牌机搞机之旅(一)——获得root权限(刷入magisk)
刷机不规范,抱机两行泪,谨慎刷机!! 一般获取root权限,我们都是通过软件来获取的,但是,软件破解root的成功率不是很高,现在,android版本普遍5.0+,大名鼎鼎的magisk可以直接获得r ...
- OpenWrt固件刷入后串口终端没有反应的问题
[路由器开发板硬件固件配置] MTK双频:MT7620a + MT7612e 内存:256 MB 闪存:16 MB 固件:MTK自带SDK中的OpenWrt固件(mtksdk-openwrt-2.6. ...
- 极路由1s,固件需要刷入RipOS系统的加40块
极路由1s,固件需要刷入RipOS系统的加40块,集成wifidog功能,wifi广告路由器的理想选择功能. 经过测试,无线性能稳定,无线可带32个手机客户端. 具体配置: 7620CPU ,主频58 ...
- NodeMCU之旅(一):构建、刷入固件,上传代码
扬帆起航 本系列文章将试图实现,使用Web页面远程点亮led.具体包括: 在NodeMCU上搭建HTTP服务器,使其可以通过Web页面配置要接入的网络. 在配置页面可以显示附近中英网络名与信号强度. ...
- NodeMCU入门(2):在线构建、刷入固件,上传代码
准备工作 1.NodeMCU模块 2.ESP8266Flasher.exe 3.ESPlorer v0.2.0-rc6 构建固件 Building the firmware提供了三种构建你自己固件的方 ...
- 关于ESP8266 NodeCMU固件无法刷入新代码的解决方法
在玩ESP8266时,有时候会无意中写了导致死循环的代码,或都某些函数传递了不合适的参数导致系统崩溃,这可能会导致ES8266不停地重启,这时我们发现无法刷入新的代码,也无法删除8266中的原代码.我 ...
- 从谷歌官网下载android 6.0源码、编译并刷入nexus 6p手机
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/fuchaosz/article/details/52473660 1 前言 经过一周的奋战,终于从谷 ...
- Genymotion刷入谷歌应用市场以及获取root权限
Genymotion刷入谷歌应用市场以及获取root权限 - 推酷http://www.tuicool.com/articles/rEV3aa6 刷入gapp, arm框架,supersu的包要注意, ...
- 杂牌机搞机之旅(二)————移植TWRP第三方Recovery并刷入
原本想把杂牌机作为android破解和开发的测试机,破解的话肯定是安装框架的嘛,毕竟有些是要涉及到脱壳 . 但是,我尝试安装xposed的时候,手机卡在了开机界面,也就是magisk出现了错误,如果想 ...
随机推荐
- Nebula Importer 数据导入实践
本文首发于 Nebula Graph Community 公众号 前言 Nebula 目前作为较为成熟的产品,已经有着很丰富的生态.数据导入的维度而言就已经提供了多种选择.有大而全的Nebula Ex ...
- go语言实现扫雷
源码如下 package main import ( "archive/zip" "bytes" "encoding/base64" &qu ...
- WPF 应用迁移到 Electron 框架过程记录
前一段时间我用 WPF 开发了一个查看 emoji 表情的小工具 https://github.com/he55/EmojiViewer ,由于最近我使用 macOS 系统比较多,我想能在 macOS ...
- AI大模型加速RPAxAI时代到来,谁会是RPA领域的杀手级应用?
GPT等AI大模型震撼来袭,基于RPA的超级自动化仍是最佳落地载体 对话弘玑CPO贾岿,深入了解国产RPA厂商对AI大模型的探索与实践 文/王吉伟 关于RPA已死的说法,在中国RPA元年(2019年) ...
- JavaScript 最新动态:2024 年新功能
前言 随着 Web 技术的日新月异,JavaScript 也在不断地吸收新的特性和技术,以满足日益复杂和多样化的开发需求.在 2024 年,JavaScript 迎来了一系列令人瞩目的新功能,这些功能 ...
- 玩转Vue3之Composables
前言 Composables 称之为可组合项,熟悉 react 的同学喜欢称之为 hooks ,由于可组合项的存在,Vue3 中的组件之间共享状态比以往任何时候都更容易.这种新范例引入了一种更有组织性 ...
- 一些Clion使用记录
一些Clion使用记录 编译链设置 在设置"工具链"中可以按需增加不同的编译链 访问越界溢出debug AddressSanitizer介绍:AddressSanitizer 交的 ...
- vscode复制相对路径时是反斜杠\,改为正斜杠/ [转]
痛点:复制路径的时候斜杠不对 解决:explorer.copyRelativePathSeparator 设置 在跳出来的设置页面的搜索栏里输入explorer.copyRelativePathSep ...
- etcd每个节点都存储了完整的键值对数据集,为什么扩容etcd集群仍可分散存储压力?
etcd每个节点都存储了完整的键值对数据集,这主要是为了确保数据的一致性和高可用性.在这种设计下,任何一个节点都可以处理读取请求,并在本地提供数据,从而无需跨节点通信.这种冗余的数据存储方式也增加了系 ...
- 精通 Grails: 测试 Grails 应用程序
排除 bug,构建可执行文档 Grails 可以轻松确保您的应用程序从始至终都远离 bug.这还有另一个好处,您可以利用测试代码生成一组通常是最新的可执行文档.本月 Grails 专家 Scott D ...