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