同一段程序,换块板为什么不一样?|单片机动画课 12

课程插图

走到这里,你已经认识了 GPIO、消抖、PWM、ADC、UART、I²C、中断、定时器和存储。于是很自然地想:这些概念都有了,Arduino 程序换到 ESP32 或 Blue Pill,是不是只要换一个引脚数字?

有时候改动确实很少,但不能把“函数名字一样”当成所有条件一样。抽象接口帮助复用思路,具体芯片、开发板和软件核心仍然决定实际行为。

本文比较 Uno R3(ATmega328P)、使用 ESP32-WROOM-32E 的经典 ESP32 开发板,以及装有 STM32F103C8T6 的 Blue Pill 类板。GIF 为概念比较,非三块实物的仿真、跑分或实测。市场上同名板的芯片和接线可能不同。

第一层:引脚名字不是物理位置

代码里的 8,需要经过当前开发板定义,才能对应到芯片引脚。Uno 的 D8、ESP32 的 GPIO 编号、STM32 的 PA/PB 端口命名,不能靠“看起来都是八号”来对应。

相同的函数调用,经过不同板级定义对应到不同硬件

LED_BUILTIN 也要看所选板型是否定义、定义到哪里,以及灯的驱动方式。有些灯是低电平点亮,有些板上是可寻址 RGB LED;不能因为第一课采用高电平点亮,就把所有板载灯一概这样理解。

同样,一个引脚能做普通输入,不一定能输出;能输出,也不一定能映射到你想用的 ADC、PWM 或通信外设。查引脚功能图比不断尝试数字更可靠。

第二层:高电平和量程会变化

Uno R3 的常用数字 I/O 工作在 5V 逻辑环境;经典 ESP32 和常见 STM32F103 Blue Pill 的 I/O 通常是 3.3V 环境。

逻辑上的 HIGH 相通,实际电气条件要看板子

HIGH 这个逻辑词可以保留,实际电压、输入门限和允许电压却需要重查。不能把 5V 信号直接当作所有 3.3V 输入都能接受;个别 STM32 引脚的容忍能力也有条件,不意味着整块板每个引脚都支持同样电压。

ADC 也类似。Uno R3 常见 10 位原始读数;另外两类芯片具备不同的 ADC 能力和配置方式。第 06 课已经解释:返回多少位、有效输入范围、怎样校准,是不同问题。更换板子后,直接复用旧换算系数可能得到看似正常却错误的数值。

PWM 的频率和分辨率也不一定跟着同一函数名保持一致。ESP32 的 LEDC、STM32 的定时器通道、AVR 的计数器,各有资源共享与配置限制。

第三层:代码要由正确的工具链解释

同一个 digitalWrite(),在不同 Arduino 核心中会调用不同的实现。你写的上层意图相似,最终机器指令、寄存器操作和时钟配置却不相同。

源码经过对应核心和编译工具链,生成目标芯片的固件

可以用几个明确数字建立尺度,但别把它们直接当成性能排名:

比较对象 CPU 时钟尺度 这里应记住什么
Uno R3 / ATmega328P 16MHz AVR,板级定义与资源相对固定
ESP32-WROOM-32E 最高 240MHz 经典 ESP32;不代表所有 ESP32 家族型号
STM32F103C8T6 最高 72MHz Cortex-M3;实际时钟取决于配置

不同架构每条指令、外设和软件开销不同,MHz 比值不是程序速度比值。一个在等待通信的程序,也不会因为 CPU 主频提高就按比例完成得更快。

软件版本同样重要。ESP32 的旧教程可能使用已迁移的 LEDC API;STM32duino 的当前安装说明也有 IDE 版本要求。复用代码时,要把核心版本与教程版本一起对照,而不是看到函数报错就判断芯片坏了。

下载接口也不相同

Uno R3 常见上传路径经过 USB 串口转换和引导程序。ESP32 通常还涉及下载模式与复位控制。Blue Pill 类板则要根据实际配置选择 ST-Link/SWD、串口引导或已安装的 USB 引导程序等方式。

板上有 USB 插座,不等于里面已经有能配合当前工具上传程序的引导程序。这个区别解释了很多“电脑看到了板,但上传失败”的情况。

看完再猜

把第一课的 digitalWrite(8, HIGH) 原样搬到另一块板,能够保证同一个位置的灯点亮吗?

不能。还要确认引脚映射、输出配置、灯的接法和有效电平,以及固件是否正确编译并运行在目标芯片上。

这十二课的价值,就是让你能把一个现象拆成可理解的问题:电平从哪里来,何时读取,谁在计时,数据怎样编码,程序怎样执行,状态又保存在哪里。以后开始动手时,就可以带着这些问题观察,而不必只靠复制代码碰运气。

资料:Uno R3 官方资料、ESP32-WROOM-32E 数据手册、STM32F103x8 数据手册、STM32duino 入门、Espressif LEDC。

发现更多好玩的开源项目

专注 Arduino、开源硬件、端侧 AI 和值得收藏的开发者工具。

课程插图

长按二维码关注「GitStar」

所有动画为教学原理示意,非芯片仿真、非硬件实测。网页发布:2026-09-21。