nanoFramework 正式支持 Raspberry Pi Pico RP2040

期待已久!nanoFramework 社区终于在近期正式合并了对树莓派 RP2040 及其 Wi-Fi 版本的底层支持。另外,RP2350 开发板的支持也在规划中。

1. 背景

Raspberry Pi Pico 是树莓派基金会推出的一款基于 RP2040 双核微控制器的开发板,因其低成本、丰富的 GPIO 和强大的性能而备受嵌入式开发者欢迎。

nanoFramework 作为一个开源的 .NET 运行时环境,长期以来一直受到社区的热切期待,希望能在 Pico 上运行 .NET 应用。

相关的 GitHub 议题 #687 "Support for Raspberry Pi Pico" 已于 2026年4月23日 完成并关闭,标志着官方对 RP2040 的支持正式到位。

2. 快速上手

官方的 nanoff 工具已经支持 RP2040 和 其 Wifi 版本的最新固件,直接使用 nanoff 命令行工具即可一键秒刷。

按住开发板上的 BOOT/BOOTSEL 键不放,插入 USB 线连上电脑,识别为 U 盘后松开按键,然后在终端执行:

bash 复制代码
# 针对普通 RP2040 开发板
nanoff --platform rpi_pico --target RP_PICO_RP2040 --update

# 针对带 Wi-Fi 的版本
nanoff --platform rpi_pico --target RP_PICO_W_RP2040 --update

关于 nanoff 相关使用和 nanoFramework 快速入门,可以参考官方文档,或我之前的 nanoFramework 系列文章。

如果你不想用命令行工具,也可以去 Cloudsmith 仓库下载 uf2 固件,将下载的 uf2 文件拖放到设备中即可完成烧录。

刷入完成后,打开 Visual Studio 的 nanoFramework 插件,就可以看到设备了。

3. 运行测试

对于这个设备的测试,如果想快速的在物理世界看到控制结果,那么你可能会兴奋的打开 VS,准备写一段控制板载 LED 闪烁,或者读取板载 BOOT 按键的代码。

不过,你大概率会碰壁,因为我就是这样过来的。特别是测试未焊接的板子。

3.1 为什么不能直接点亮板载 LED

我这边测试的是微雪 RP2040-Zero 迷你开发板,板载 LED 是一颗连接在 GPIO 16 上的 WS2812。

这种灯需要极其严格的纳秒级时序,通常依赖 RP2040 独有的 PIO 外设。

但目前因为刚刚支持 nanoFramework 的 RP2040 底层尚未实现 PIO 支持,也没有类似 ESP32 那种傻瓜式的 RMT 驱动。所以,目前还无法直接通过 GPIO API 来控制板载 LED。

如果自己来实现,就需要费很大的功夫了,还是等官方后续更新吧。

3.2 如何测试

这块板子上的 RESET 是必然不能用的,虽说还有一个 BOOT 按键,但连接的是 QSPI_SS_N 引脚,不像 ESP32 那样直接把 BOOT 键当普通按钮用,如果想用需要费上一番功夫。

这样看起来想快速做个简单测试,这两条路都不太好走。那么如何快速测试呢?其实思路也很简单,我们只需要额外一根杜邦线,或是回形针,金属镊子即可。

然后,挑一个边缘的 GPIO,将其配置为"带有内部上拉的输入模式"。这样它默认是高电平,只要将它和 GND 短接一下,就会产生一个完美的低电平信号,来测试 GPIO 输入功能。

不过,需要注意的是,针对这个板子来说,GNG 在左边,而且前面是 5v,GNG,3v3,GP29 挨着,而且丝印位置容易误读,搞错直接设备报废,是极其危险的。

为了防止手抖误触,我们可以使用右边的逻辑引脚,GP0、GP1、GP2、GP3 这四个引脚都在右侧边缘位置,误触的风险较小。

这样测试思路就很清晰了:

  • 在代码里配置 GP0 为输出模式,并拉低,扮演 GND 的角色
  • 配置 GP1 为输入模式,带上内部上拉,默认是高电平

这样,只要把 GP0 和 GP1 短接一下,就会看到 GP1 变为低电平,具体的事件触发代码如下:

csharp 复制代码
public static void Main()
{
    Debug.WriteLine("RP2040 C# 极简测试启动!");

    GpioController gpio = new GpioController();

    // 设置 GP0 为输出,并拉低,扮演 GND 的角色
    GpioPin fakeGndPin = gpio.OpenPin(0);
    fakeGndPin.SetPinMode(PinMode.Output);
    fakeGndPin.Write(PinValue.Low);

    // 设置 GP1 为带有内部上拉的输入模式
    GpioPin testPin = gpio.OpenPin(1);
    testPin.SetPinMode(PinMode.InputPullUp);

    // 监听 GP1 的引脚电平变化事件
    testPin.ValueChanged += (sender, e) => {
        // 当 GP1 被短接到 GP0 时,触发事件
        if (e.ChangeType == PinEventTypes.Falling)
        {
            Debug.WriteLine("⚡ 触发了点击事件!(GP1 与 GP0 短接)");
        }
    };

    // 保持主线程运行,等待事件触发
    Thread.Sleep(Timeout.Infinite);
}

4. 最后

总的来说,nanoFramework 对 RP2040 的支持是一个非常令人兴奋的消息,虽然目前还处于初期阶段,但基础功能已经到位。未来随着官方对 PIO 等功能的支持,我们将能够在 Pico 上实现更多丰富的 .NET 应用,敬请期待!

相关推荐
zlinear数据采集卡1 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
ACP广源盛139246256731 小时前
蚂蚁百灵 Ling‑3.0‑flash 开源 + 昇腾 0‑Day 原生适配@ACP#GSV9001E 在国产算力矩阵中的机会与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
Rocktech_ruixun3 小时前
机器人端侧大模型部署对主板有哪些要求?瑞迅主控板分级方案对比
人工智能·嵌入式硬件·机器人
Rocktech_ruixun4 小时前
机器人数据采集能力取决于什么?瑞迅科技RK3588/3576核心板方案深度解析
人工智能·嵌入式硬件·机器人
恒锐丰科技韩生5 小时前
率能 SS6625E|3.0~20V 单通道 H 桥直流电机驱动 SOP8 电子锁玩具机器人分享
嵌入式硬件·硬件工程
zlinear数据采集卡5 小时前
D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Dr.kangder6 小时前
嵌入式面试总结(十八)——JTAG调试
嵌入式硬件·面试·职场和发展·架构·嵌入式
恒锐丰科技韩生7 小时前
率能 SS6226|2.4~7.2V 低压双通道双 H 桥电机驱动 SOP16 玩具小家电专用芯片
嵌入式硬件·硬件工程
萌新小白YXY10 小时前
SAE J1587/SAE J1708 协议笔记
笔记·单片机·嵌入式硬件
恒锐丰科技韩生11 小时前
率能 SS6635E|3.0~30V 直流双向 H 桥电机驱动 SOP8 玩具电子锁机器人分享
嵌入式硬件·硬件工程