【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出现了错误,如果想 ...
随机推荐
- xml中xsd、xsi、xmlns的含义
XML是可扩展标记语言,它定义了按格式编码文件的一系列规则[3],编码的文件是机器可读和人可读的.XML文件对于机器可读是基于XSD(XML Schema Definition)[1]的.XSD是受W ...
- 17. Class字节码指令解析
## 1. 概述 官方文档:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html Java 字节码对于虚拟机,就好像汇编语言对于 ...
- C++ STL函数对象 仿函数
1 //STL函数对象 仿函数 2 #include<iostream> 3 #include<string> 4 5 using namespace std; 6 7 8 / ...
- 微软应用商店错误代码“0x80131500”怎么修复?
处理方法一 打开"运行"输入 inetcpl.cpl ("WINDOWS"+"R"键,输入 inetcpl.cpl亦可),点开高级往下拉,勾 ...
- Windows10 windows installer卸载或安装不了软件怎么办?
先说我的方法: 1.把安装出现问题的软件或者想要卸载的软件的安装目录下的所有文件都删除. 2.用清理软件清理一下垃圾,包括注册表,这里我自己使用的是火绒->安全工具- ...
- vue css 背景图 路径 记得加波浪号 background-image: url("~@/assets/images/d.jpg");
vue css 背景图 路径 记得加波浪号 background-image: url("~@/assets/images/d.jpg"); 为什么 不加波浪号,图片显示不出来哟
- FreeRTOS教程4 消息队列
1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCO ...
- electron 下网页获取 micphone 权限
网页获取麦克风或摄像头权限我们只需调用 navigator.mediaDevices.getUserMedia 方法就可唤起浏览器用户授权 const useMicphone = async () = ...
- springMVC+JDBC:分页示例
文章来源:http://liuzidong.iteye.com/blog/1067492 一 环境:XP3+Oracle10g+MyEclipse6+(Tomcat)+JDK1.5 二 工程相关图片: ...
- jquery之ajax中文乱码解决方案
$.ajax({ dataType : 'json',type : 'POST',url : 'http://localhost/test/test.do',data : {id: 1, type: ...