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 应用,敬请期待!

相关推荐
Net_Walke19 分钟前
【Linux系统】静态链接库与动态链接库
linux·嵌入式硬件
努力小周2 小时前
STM32智能安防系统
c语言·stm32·单片机·嵌入式硬件·物联网·计算机网络·pcb工艺
华科大胡子4 小时前
在STM32上跑通TinyML
stm32·单片机·嵌入式硬件
编程圈子5 小时前
电机驱动开发学习2. 直流无刷电机工作原理
驱动开发·学习
zhaoshuzhaoshu7 小时前
嵌入式开发之IIC接口详解-STM32
嵌入式硬件·软件工程
iCxhust8 小时前
MTK8088单板机制作(一)时钟电路
汇编·单片机·嵌入式硬件·微机原理·8088单板机
2601_958352908 小时前
双麦 DSP 音频拾音模块 A-68:多场景远场语音交互的声学解决方案
嵌入式硬件·音视频·降噪·回音消除·音频处理模块
崇山峻岭之间8 小时前
单片机直流有刷电机速度环PID控制实验
单片机·嵌入式硬件
xiangw@GZ9 小时前
智能锁浮空系统指纹头金属环ESD防护技术分析
单片机·嵌入式硬件
ACP广源盛139246256739 小时前
IX7008 PCIe 交换芯片@ACP#RTX Spark 经济型 8 口扩展芯片(对比 ASM1806)
大数据·人工智能·分布式·嵌入式硬件·gpt·spark·电脑