一个消失的引脚,暴露了AI对单片机理解的边界

大约两年前,我让一个Claude模型帮忙处理ESP32项目,它让我用一个在那块ESP32上根本不存在的GPIO引脚。我看看答案,又看看引脚,对那种自信感到非常困惑——明明错得离谱,语气却笃定得很。其他部分都对,唯独引脚不对。

打开网易新闻 查看精彩图片

后来我发现,这是单片机和ESP32特有的问题。为了验证,我把同一个基础ESP32接线提示跑了十五次,分别用Sonnet 5和Opus 5模型。它们没有再凭空捏造引脚,每次也都给出了正确的引脚解释——除了一次。

同一个模型,前后说法互相矛盾

在ESP32上,GPIO2决定板子是启动正常固件,还是进入烧录模式。Opus 5和Sonnet 5给出的建议每次运行都不一样,其中关于启动模式的说法甚至完全错误,而且方向相反,同一个模型的不同运行结果互相打脸。更贵的Opus 5并没有明显更准确,它只是更倾向于选择更安全的引脚。

我主要关注Claude,但用GPT-5.6 Sol时,类似错误出现的频率也差不多。

34个GPIO引脚,有些编号根本不存在

ESP32-D0WD是经典款ESP32,所有WROOM-32模块和廉价DevKit克隆板里都是它。它有GPIO0到19、21到23、25到27,以及32到39,总共34个引脚,中间的空缺完全是空的。如果你只熟悉Arduino,引脚标签是有序的,板子上的编号和代码里的编号一致,那这些空缺确实会让人踩坑。

但空缺只是最不起眼的问题。GPIO6到11连接着SPI闪存芯片,使用它们会影响闪存访问。GPIO34到39只能输入,没有内部上拉,向它们输出完全没有任何效果。GPIO0、2、5、12和15是启动配置引脚,芯片启动时会读取它们的状态,从而改变启动方式。ADC2覆盖GPIO0、2、4、12到15以及25到27,它归Wi-Fi驱动所有,开启Wi-Fi时读取这些引脚,返回的是乱码而不是可用数据。

GPIO20的争议:存在还是不存在?

GPIO20的情况更奇怪:很多指南会告诉你它在ESP32上不存在,但事实并非完全如此。在ESP-IDF里,ESP32的有效GPIO掩码只排除了24和28到31,没有排除GPIO20,所以它是被接受的。原因在于部分PICO板可以使用它,但其他经典ESP32都不行。

公平地说,现在的模型大多能答对这一题。我测试了GPT-5.6 Sol、GPT-5.5 Instant、Opus 5和Sonnet 5,它们对GPIO20的处理基本正确。

三分之二正确,比一直错误更麻烦

问题在于,AI对ESP32引脚的判断处于一种“大部分时候对,偶尔错”的状态。这种间歇性错误比持续错误更危险,因为持续错误容易被识别和纠正,而偶尔的错误会混在大量正确信息里,让人放松警惕。当模型用同样自信的语气给出一个不存在的引脚时,你很难立刻发现。

对开发者来说,这意味着AI可以辅助单片机开发,但不能替代对芯片手册和引脚定义的核对。尤其是涉及启动配置、闪存访问和输入输出限制的引脚,任何一次轻信都可能让板子无法启动,或者让调试陷入混乱。