老周在几个世纪前曾写过树莓派相关的 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 固件以及相关问题的更多相关文章

  1. NodeMCU入门(1):刷入At固件,透传数据到TcpServer和Yeelink平台

    准备工作 1. NodeMCU  LUA ESP8266 CP2102  WIFI Internet Development Board,仔细看背面可以看出自带cp2102模块,可以通过普通的手机充电 ...

  2. 杂牌机搞机之旅(一)——获得root权限(刷入magisk)

    刷机不规范,抱机两行泪,谨慎刷机!! 一般获取root权限,我们都是通过软件来获取的,但是,软件破解root的成功率不是很高,现在,android版本普遍5.0+,大名鼎鼎的magisk可以直接获得r ...

  3. OpenWrt固件刷入后串口终端没有反应的问题

    [路由器开发板硬件固件配置] MTK双频:MT7620a + MT7612e 内存:256 MB 闪存:16 MB 固件:MTK自带SDK中的OpenWrt固件(mtksdk-openwrt-2.6. ...

  4. 极路由1s,固件需要刷入RipOS系统的加40块

    极路由1s,固件需要刷入RipOS系统的加40块,集成wifidog功能,wifi广告路由器的理想选择功能. 经过测试,无线性能稳定,无线可带32个手机客户端. 具体配置: 7620CPU ,主频58 ...

  5. NodeMCU之旅(一):构建、刷入固件,上传代码

    扬帆起航 本系列文章将试图实现,使用Web页面远程点亮led.具体包括: 在NodeMCU上搭建HTTP服务器,使其可以通过Web页面配置要接入的网络. 在配置页面可以显示附近中英网络名与信号强度. ...

  6. NodeMCU入门(2):在线构建、刷入固件,上传代码

    准备工作 1.NodeMCU模块 2.ESP8266Flasher.exe 3.ESPlorer v0.2.0-rc6 构建固件 Building the firmware提供了三种构建你自己固件的方 ...

  7. 关于ESP8266 NodeCMU固件无法刷入新代码的解决方法

    在玩ESP8266时,有时候会无意中写了导致死循环的代码,或都某些函数传递了不合适的参数导致系统崩溃,这可能会导致ES8266不停地重启,这时我们发现无法刷入新的代码,也无法删除8266中的原代码.我 ...

  8. 从谷歌官网下载android 6.0源码、编译并刷入nexus 6p手机

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/fuchaosz/article/details/52473660 1 前言 经过一周的奋战,终于从谷 ...

  9. Genymotion刷入谷歌应用市场以及获取root权限

    Genymotion刷入谷歌应用市场以及获取root权限 - 推酷http://www.tuicool.com/articles/rEV3aa6 刷入gapp, arm框架,supersu的包要注意, ...

  10. 杂牌机搞机之旅(二)————移植TWRP第三方Recovery并刷入

    原本想把杂牌机作为android破解和开发的测试机,破解的话肯定是安装框架的嘛,毕竟有些是要涉及到脱壳 . 但是,我尝试安装xposed的时候,手机卡在了开机界面,也就是magisk出现了错误,如果想 ...

随机推荐

  1. SemanticKernel如何基于自有数据聊天

    效果 使用gpt-3.5-turbo的效果 什么是向量数据库? 向量数据库是一种专为处理高维向量数据而设计的数据库系统.与传统的关系型数据库不同,向量数据库专注于存储和查询向量数据,例如图像.音频.文 ...

  2. ImageClipboard js粘贴剪切板图片,已测试,可用,可获得base64

    ImageClipboard js粘贴剪切板图片,已测试,可用,可获得base64 具体用到自己项目的时候,拿源码改成自己的库,从写一遍 3个小问题 onpaste 执行了两遍,一次是图片加载完成,一 ...

  3. matting tool by cs - 视频扣绿幕 1.4 - 软件推荐

    本地软件,还没用,先留个档,试试 第一个下载还套了个广告壳,醉了,但是能用 https://www.123pan.com/s/X3jA-POMQv 这个装了,是原版,没套壳 https://pan.b ...

  4. koa-generator - koa 脚手架

    koa-generator - koa 脚手架 npm install -g koa-generator 创建 koa2 /tmp/foo && cd /tmp/foo 资料: 基于N ...

  5. float、double的精度、范围,在内存中的存储方式

    float.double的精度,在内存中的存储方式 一.浮点型变量在内存中的存储方式 Java的浮点数遵循IEEE 754标准,采用二进制数据的科学计数法来表示浮点数,float遵从的是IEEE R3 ...

  6. zhelper-cvtool

    https://github.com/bbqz007/zhelper-cvtool cvtool images/SuperMario.mp4 anno,cascade cvtool images/Su ...

  7. 29_SDL多线程与锁机制

    目录 一.简介 二.代码实现: 2.1.声明 2.2.创建锁.消费者 2.3.销毁 2.4.实现生产者逻辑 2.5.实现销毁者逻辑 2.6.创建生产者 三.分装SDL锁机制 condmutex.h c ...

  8. 调试3D渲染和3D可视化的五个好处

    建筑和建筑环境是我们日常生活中不可避免的一部分,直接影响我们和我们的福祉.它可以是我们的家.办公室.附近的教堂或城市的商业综合体;所有这一切的设计和规划都是建筑.然而,具有讽刺意味的是,建筑的交流往往 ...

  9. 记录--Vue3问题:如何实现组件拖拽实时预览功能?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. 需求分析 实现一个CMS内容管理系统,在后台进行内容编辑,在官网更新展示内容. 关于后台的编辑功能,大致分为两部分:组件拖拽预览.组 ...

  10. Lambda表达式编写递归函数

    class Program { //Fix求出的是函数f的不动点,它就是我们所需要的递归函数: static Func<T, TResult> Fix<T, TResult>( ...