【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出现了错误,如果想 ...
随机推荐
- SemanticKernel如何基于自有数据聊天
效果 使用gpt-3.5-turbo的效果 什么是向量数据库? 向量数据库是一种专为处理高维向量数据而设计的数据库系统.与传统的关系型数据库不同,向量数据库专注于存储和查询向量数据,例如图像.音频.文 ...
- ImageClipboard js粘贴剪切板图片,已测试,可用,可获得base64
ImageClipboard js粘贴剪切板图片,已测试,可用,可获得base64 具体用到自己项目的时候,拿源码改成自己的库,从写一遍 3个小问题 onpaste 执行了两遍,一次是图片加载完成,一 ...
- matting tool by cs - 视频扣绿幕 1.4 - 软件推荐
本地软件,还没用,先留个档,试试 第一个下载还套了个广告壳,醉了,但是能用 https://www.123pan.com/s/X3jA-POMQv 这个装了,是原版,没套壳 https://pan.b ...
- koa-generator - koa 脚手架
koa-generator - koa 脚手架 npm install -g koa-generator 创建 koa2 /tmp/foo && cd /tmp/foo 资料: 基于N ...
- float、double的精度、范围,在内存中的存储方式
float.double的精度,在内存中的存储方式 一.浮点型变量在内存中的存储方式 Java的浮点数遵循IEEE 754标准,采用二进制数据的科学计数法来表示浮点数,float遵从的是IEEE R3 ...
- zhelper-cvtool
https://github.com/bbqz007/zhelper-cvtool cvtool images/SuperMario.mp4 anno,cascade cvtool images/Su ...
- 29_SDL多线程与锁机制
目录 一.简介 二.代码实现: 2.1.声明 2.2.创建锁.消费者 2.3.销毁 2.4.实现生产者逻辑 2.5.实现销毁者逻辑 2.6.创建生产者 三.分装SDL锁机制 condmutex.h c ...
- 调试3D渲染和3D可视化的五个好处
建筑和建筑环境是我们日常生活中不可避免的一部分,直接影响我们和我们的福祉.它可以是我们的家.办公室.附近的教堂或城市的商业综合体;所有这一切的设计和规划都是建筑.然而,具有讽刺意味的是,建筑的交流往往 ...
- 记录--Vue3问题:如何实现组件拖拽实时预览功能?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. 需求分析 实现一个CMS内容管理系统,在后台进行内容编辑,在官网更新展示内容. 关于后台的编辑功能,大致分为两部分:组件拖拽预览.组 ...
- Lambda表达式编写递归函数
class Program { //Fix求出的是函数f的不动点,它就是我们所需要的递归函数: static Func<T, TResult> Fix<T, TResult>( ...