上个月朋友拿了一块 ESP32-CAM 给我看,说照着教程把代码烧进去以后,摄像头画面死活出不来。我拿过来第一件事不是接电脑,而是翻到板子背面看 GPIO0 那个按键的位置——因为他用的烧录线并没有把 DTR 和 RTS 引出来,自动下载电路根本没生效。这块板子本身没问题,问题出在“默认教程默认了硬件”,而真实硬件千差万别。
开发板使用流程这件事,听起来像一篇说明书,但绝大多数人卡住的地方,恰恰是说明书里一句话带过的部分。不管是 ESP32、ESP8266、STM32,还是 T113、瑞芯微这类 Linux 开发板,底层逻辑其实是同一套:验板、供电、通信、环境、烧录、调试、再往项目上靠。这篇文章我就按自己这些年经手各种板子的顺序,把每一步里真正影响成败的细节摊开讲,适合刚拿到板子不知道怎么下手的新手,也适合已经能点灯但遇到疑难杂症想回头查流程的开发者。
1. 开箱之后别急着上电:先把板子“读”一遍
1.1 验货清单:不只确认“缺不缺件”
开发板开箱以后,第一反应是找数据线插上,这个动作我劝你忍一忍。硬件产品在运输过程中可能产生的问题,远比你想象的多。我习惯按一套固定顺序检查:先看板面有没有明显物理损伤,尤其是排针、晶振、天线座、USB座这些容易被磕碰的地方;再查排针有没有弯针、歪针,很多二手板或者发货时包装不到位的板子,排针被压歪后插杜邦线时就会接触不良,之后所有排查都会被带偏。
然后是配件清点。以最常见的 ESP32 DevKitC 为例,出厂一般带板子、说明书、可能有一根 USB 线。但很多国产板子会带排针需要自己焊,这时候就要检查焊盘有没有氧化,焊台温度别上去就焊,先用助焊剂走一遍。像合宙 Air202 S6 这种 26 排针的板子,排针间距、线序定义都要和卖家页面核对一遍,曾经有批板子把 GND 和 VCC 丝印印反了,不看原理图直接按丝印接线,上电就短路的案例我不是没见过。
验板时还有一样容易被忽略:板载天线区域。ESP8266、ESP32 这类板子的 PCB 天线区域一般会有一小块白漆,这个区域上方不要覆盖金属,也不要用手摸。很多 Wi-Fi 信号弱的问题不是硬件坏了,而是天线被外壳螺丝、铜柱遮挡了。开箱检查时看到天线区域是否有异物、划伤,比通电测试更优先。
1.2 读懂丝印和跳线的信息量
开发板上密密麻麻的丝印不是装饰,是你能拿到的第一份“非官方文档”。正面丝印看板型、GPIO编号、供电输入范围;背面丝印看版本号、生产日期、认证标识。版本号这一点特别重要,同型号板子 Rev.A 和 Rev.B 的引脚定义可能完全不同,尤其是国产低成本板,改版后不一定更新教程。我一次用 ESP32-S3 开发板做项目,参考的老版本原理图把某个外设接到了 GPIO4,新版板子 GPIO4 已经接到 PSRAM 的 CS 上了,折腾半天查出来,后悔没先看板背面的版本丝印。
跳线和拨码开关是更直接的“硬件配置”。STM32 最小系统板上的 BOOT0/BOOT1 跳线帽,决定了芯片从哪启动;正点原子、野火等 Linux 板卡上的拨码开关,通常用来选择启动介质是 eMMC、SD 卡还是 USB 烧录模式。拿到板子第一件事,找到原理图里标着 BOOT、MODE、S1/S2 这些关键词的部分,搞清楚当前出厂状态在哪个档位,再决定要不要动它。
对于 Linux 开发板,比如 T113、瑞芯微 RK3506 这类,板上可能还有串口调试排针、电源跳线、RTC 电池座。串口调试排针的 TX/RX 丝印是从芯片视角标注的,和 USB 转串口模块连接时要交叉连接,也就是板子的 TX 接模块的 RX,这个基础但致命的问题,后面会详细讲。读板阶段培养的习惯是:把看到的丝印、跳线位置、版本号拍照存档,后面写文档或排查问题时能省一大半时间。
2. 供电与通信:插上USB没反应,到底卡在哪一步
2.1 供电的三种来源,很多新手栽在“供电不足”
开发板供电看着简单,实际上坑最多。按来源分三类:USB 供电、外部直流电源供电、电池供电。USB 供电是最常用的,但 USB 口能提供的电流取决于电脑接口、数据线、以及板上电源芯片的转换能力。一个典型场景:ESP32 开发板通过 USB 连电脑,能识别串口,但一旦打开 Wi-Fi 就反复重启。原因就是 Wi-Fi 发射瞬间电流可达 300mA 以上,劣质数据线线阻大,压降直接把 3.3V 电源拉垮。
判断线材优劣有个笨办法:把板子只接 USB 但不运行程序,用万用表量板上 3.3V 测试点,如果读数明显低于 3.3V,基本可以断定线阻问题或 USB 口供电能力不足。这时候换一根短而粗的数据线,或者用带外部供电的 USB Hub,问题一般就消失了。
外部直流电源供电要注意电源电压和板子输入范围匹配。很多开发板标注 5V 输入,但板载稳压芯片的压差决定了实际可用电流。比如 AMS1117-3.3 这类 LDO,输入输出压差要 1V 以上才能稳定输出 3.3V,如果输入只有 4.5V,输出就可能掉到 3.2V 甚至更低。所以给开发板供电时,别只看“标称 5V”,实际的电源纹波和带载能力也要考虑。我习惯在手边备一个可调电源,上电前先把电流限制在 500mA,再逐步放开,这样即使板子有短路也不会烧芯片。
2.2 串口芯片:开发板和电脑之间的“翻译官”
插上 USB 没反应,除了供电,还可能因为板子上的 USB 转串口芯片没工作。这块芯片的作用是把电脑的 USB 信号翻译成 UART 串口信号,常见的有 CH340、CP2102、FT232、CH9102 等。不同芯片在电脑上呈现为不同的虚拟串口号,驱动没装或者装错,电脑就识别不到设备。
识别方法很简单:插上 USB 后打开设备管理器(Windows)或者 ls /dev/ttyUSB* /dev/ttyACM*(Linux),看有没有新的设备出现。如果出现一个带着黄色感叹号的未知设备,就是驱动问题。CH340 在 Windows 下比较容易遇到驱动被其他软件覆盖的情况,安装官方驱动后如果还是感叹号,把它卸载再重插,让系统重新枚举设备,很多“驱动装不上”的诡异问题其实是端口冲突。
Linux 下还要注意用户权限。Ubuntu 等发行版默认情况下普通用户访问串口设备可能需要 dialout 组权限,否则打开串口会报 Permission denied。一条 usermod -a -G dialout $USER 就能解决,但要重新登录才生效。macOS 下 CH340 的新旧驱动版本之间也偶尔有兼容问题,遇到打不开串口,优先去芯片厂商官网下载对应系统的最新驱动,而不是在第三方驱动站随便下。
2.3 复位、BOOT和下载模式:这三个按键/跳线决定你能不能烧录
几乎每块开发板都有 RESET(复位)按键,很多还有 BOOT 按键或跳线。本质上,复位和 BOOT 是进入下载模式的控制手段。以 ESP32 系列为例,下载模式需要在上电或复位时让 GPIO0 保持低电平。开发板上的自动下载电路可以省略手动操作,但它依赖 DTR/RTS 信号线的正确连接,如果换成只连了 TX/RX/GND 的三线串口,就必须手动按住 BOOT 键再按一下 RESET。
STM32 的 BOOT0 跳线帽则决定了启动地址:BOOT0 拉低是从用户 Flash 启动,拉高进入系统存储器引导程序,这时才能通过串口下载。很多 STM32 最小系统板出场默认 BOOT0 接低,用户用串口下载时发现连不上,把 BOOT0 拉高再复位一下,问题就解决了。下载完记得把 BOOT0 跳回低电平,否则程序不运行。
Linux 开发板则更复杂一些。T113、RK3506 这类板子的启动模式通常由拨码开关或烧录按键控制,不同 SDK 要求进入 maskrom 模式还是 loader 模式,操作方式不同。拿到板子后要单独看引导说明。我的建议是:把“进入下载模式”这个动作单独记一张笔记,写下按键顺序、LED 状态变化、串口打印的特征信息,因为你不可能每次都记得住,而这恰恰是开发中最频繁重复的动作。
3. 搭建开发环境:从驱动、SDK到交叉编译链
3.1 串口驱动:CP210x和CH340的安装陷阱
上一节提到了串口芯片,具体到安装,不同芯片有各自的坑。CH340 在 Windows 下比较皮实,但有个问题:如果电脑同时插了多个 CH340 设备,Windows 可能给它们分配不同的 COM 口,下一次插拔后 COM 口会漂移。解决方式是在设备管理器里为每个设备指定固定 COM 口,避免烧录脚本里写死 COM3 却找不到设备。
CP210x 系列(如 CP2102、CP2104)在 Windows 和 Linux 下的驱动相对稳定,但要注意新版本驱动默认启用了“低功耗模式”,某些开发板上如果串口芯片的供电设计不标准,会导致设备间歇性掉线。这个不太好排查,因为看起来像是接触不良。如果你的板子在传输数据时经常断连,且换线换口都无效,可以试着在驱动设置里关掉电源管理里的“允许计算机关闭此设备以节约电源”选项。
Linux 下还有一个更隐蔽的问题:内核自带的 cdc_acm 驱动和板子的 USB 转串口芯片冲突,导致设备枚举成 ttyACM0 而不是 ttyUSB0,某些开发工具只识别 ttyUSB*,这时需要手动把 /dev/ttyACM0 链接过去,或者在 IDE 里选自定义端口。我自己跑 ESP32 时遇到过这个情况,后来在 udev 规则里加了一条固定映射,一劳永逸。
3.2 选官方SDK还是Arduino生态:按目标和排查成本来
环境搭建的下一步是选开发框架。这里最容易让人迷茫的是:到底用官方 SDK 还是 Arduino?网上教程一半一半。我的建议是,按你的目的分:如果是快速验证传感器、做 prototype、参加比赛,Arduino 生态无疑效率最高;如果是做产品原型、需要深度定制底层、研究低功耗,那必须上官方 SDK。
Arduino 生态对 ESP32、ESP8266、STM32 都支持得不错。以 ESP32 为例,在 Arduino IDE 里添加开发板管理器地址,安装 esp32 核心包,选好开发板型号,就能写代码烧录了。优点是不用管交叉编译链、不用写 Makefile,串口监视器还自带波特率选择。缺点是屏蔽了太多细节,程序跑飞了你不知道是堆栈溢出还是芯片复位,因为 Arduino 内核的默认日志级别可能没开。
官方 SDK 的学习曲线陡峭,但可控性强。ESP-IDF 使用 CMake 构建系统,第一次需要按文档安装工具链和 Python 依赖。国内开发者尤其注意:官方下载服务器在海外,下载速度可能很慢,所以可以配置国内的镜像源,这不是什么高深的操作,在 pip 和 git 层面做一下替换就行。STM32 的官方生态则推荐 STM32CubeMX + HAL 库,图形化配置引脚和时钟,生成基础工程后再写业务逻辑,对新手非常友好。
3.3 交叉编译工具链:用Linux开发板时躲不开的一步
用 T113、瑞芯微这类 Linux 开发板,你面对的就不再是单片机 SDK,而是一个完整的嵌入式 Linux 系统。这时候你的开发机通常是 x86 架构,而板子是 ARM 架构,不能直接在本机编译可执行文件,需要用到交叉编译工具链。
搭建过程看起来繁琐,其实就是三步:下载和解压工具链、设置环境变量、用工具链前缀替代 gcc。例如 arm-linux-gnueabihf-gcc 编译出的程序只能在 ARM 板上运行。很多官方 SDK 会自带一套构建脚本,你只需要 source 一下环境变量,然后进入应用目录执行 make。但手动搭过一遍才能理解里面的逻辑,否则遇到“编译出来运行报 Exec format error”都不知道是架构不匹配。
还有一类开发板支持直接在板子上编译,比如树莓派、香橙派这类跑完整 Linux 的板子,但这种板子的 CPU 性能相对有限,编译大型项目会很慢。更合理的工作流是在 Ubuntu 上用交叉编译链构建,再通过 scp/NFS/网络挂载的方式把文件传到开发板上运行。关于“开发板挂载 ubuntu”,本质上就是把一个网络共享目录挂到开发板的某个路径下,这样电脑上编译完的文件在板上立即可见,省去反复拷贝的痛苦。具体方式包括 NFS 和 Samba,NFS 更适合 Linux 到 Linux,Samba 适合 Windows 共享。
4. 点灯实验:跑通完整开发流程的主链路
4.1 点灯不是目的,验证链路才是
所有开发板教程的第一个实验都是点灯,很多人觉得无聊,但点灯实验验证的是整条开发链路:代码编写、编译、烧录、复位运行、GPIO 控制、外设电路。任何一个环节有问题,灯都不会按预期亮。第一次点灯时,建议不要急着改代码效果,而是保持官方例程,确认这一套流程基线是通的。
我观察过不少新手,拿到板子第一件事就是把例程改成“呼吸灯”“RGB 循环变色”,一旦灯不亮,根本无法判断是自己改坏了,还是板子/烧录/环境的问题。正确方式是先让出厂例程亮起来,再一行行修改代码,做一次改动验证一次。这个理念在嵌入式开发里叫“最小化变更”。
点灯代码本身很简单,但要注意引脚号。ESP32 DevKitC 板载 LED 通常接 GPIO2,ESP32-S3 某些开发板接 GPIO48,ESP8266 NodeMCU 接 GPIO1(也是 TX 引脚)。在不看原理图的情况下,库函数里默认的引脚和实际板子不一定一致。STM32 则要看原理图中 LED 接在哪个端口,有些板子的 LED 是低电平点亮,代码里要写 digitalWrite(LED_PIN, LOW)。所以点灯实验,本质上是让你学会查阅原理图并匹配引脚定义。
4.2 烧录方式怎么选:串口、SWD/JTAG、还是OTA
点灯要跑起来,必须先烧录。烧录方式主要看芯片和板子类型。
单片机类常用:串口下载,通过 USB 转串口芯片连接芯片的 UART 引导程序,比如 ESP32、ESP8266 大部分场景都用这种方式;STM32 除了串口 ISP,还有 SWD,ST-Link/J-Link 这类调试器通过 SWD 接口直接访问芯片,支持在线调试、断点单步,效率比串口高很多。
Linux 类开发板烧录则复杂得多:有些是烧写固件到 eMMC/SD 卡,有些是更新单独的 bootloader、内核、设备树、根文件系统分区。瑞芯微平台烧录工具一般要求进入 loader 模式,通过 USB OTG 连接电脑烧录;全志 T113 平台则经常用 PhoenixSuit 烧录镜像。
OTA(Over-The-Air)是后期产品化最常用的升级方式,不是必备但值得了解。ESP32 支持 OTA 分区,你要在编译的时候把分区表改成支持双 OTA 分区,然后通过网络把固件传给设备,设备写入备用分区后切换启动。这个机制在开发阶段不常用,但在真实项目中几乎是标配。
具体选择逻辑:追求快速验证选串口或 USB 烧录;需要调试追 bug 用 SWD/JTAG;要模拟量产更新用 OTA。三种方式对应不同场景,不能说哪个更好,只能说哪个更适合当前阶段。
4.3 常见烧录失败报错与根因对照
烧录失败是劝退新手的第一大原因。这里列几个高频报错和真实根因:
| 报错特征 | 常见根因 | 排查方向 |
|---|---|---|
| 一直在“Connecting…” | 未进入下载模式或串口选错 | 检查 GPIO0/BOOT 状态,确认 COM 口号 |
| 烧录过程中设备断开 | 供电不足或线材问题 | 换线,外接供电,关闭电脑USB节能 |
| 报错“A fatal error occurred: Failed to connect to ESP32” | 串口被占用或波特率不对 | 关闭串口监视器,降低波特率到 115200 |
| STM32 串口连接失败 | BOOT0 跳线不对或 TX/RX 接反 | 拉高 BOOT0,检查串口交叉接线 |
| Linux 板烧录工具找不到设备 | 驱动未装或没有进入烧录模式 | 安装对应 USB 驱动,确认按住了烧录键 |
一个隐藏很深的问题:部分开发板的自动下载电路依赖 DTR/RTS 信号,但有些 USB 转串口线并没有把这两根线接出来,只接入 TX/RX/GND。看起来三根线完全够用,但自动下载电路就不工作了。这时候要么换一根九线的 USB 转串口模块,要么手动进入下载模式。
排查烧录失败的核心思路,是把链路拆成三段:电脑能不能识别串口,串口能否和芯片引导程序握手,芯片是否有足够供电完成擦写。逐段验证,永远比反复拔插有效率。
5. 调试三板斧:串口日志、表笔和最小系统
5.1 串口日志:先把print用起来
程序烧进去以后,形形色色的运行问题只能靠调试手段定位。第一板斧是串口日志,也就是 printf 或 Serial.println 输出的信息。但很多新手不知道的是,串口日志本身需要初始化,包括波特率、引脚、日志级别。
以 ESP-IDF 为例,ESP_LOGI 宏输出的日志分错误、警告、信息、调试、冗长五个级别,默认编译只保留某个级别以上。如果看不到输出,先确认 monitor 的波特率是否与工程配置的 CONFIG_ESP_CONSOLE_UART_BAUDRATE 一致,而不是凭感觉换波特率。还有一点,ESP32 的日志默认从烧录串口输出,但如果代码里初始化了其他 UART 作为日志输出,那就要重新指定端口。
STM32 的串口日志更看硬件接线。HAL_UART_Transmit 是阻塞发送,如果波特率或时钟配置不对,会输出乱码。建议在 CubeMX 里生成工程时,就把 UART1 作为调试串口初始化,然后重定向 printf 到该串口。Windows 下用串口助手,Linux 下用 minicom 或 screen,只要波特率、数据位、停止位和代码一致即可。
时刻记住:没有日志,嵌入式开发就像闭着眼睛开车。所以不管什么板子,第一步先把日志通道打通,再做业务逻辑。
5.2 万用表量供电和短路
第二板斧是万用表。一个我没有给任何一块板子上电时,都会先用万用表的蜂鸣档测板子电源输入端的 VCC 和 GND 是否短路。别嫌麻烦,很多板子在焊接或运输过程中可能产生锡渣、毛刺,导致电源短路,直接上电轻则板子发烫,重则烧芯片。
正常工作电流也可以作为判据。USB 供电时,很多开发板静态电流在 60~100mA 左右,如果明显偏大,说明某处漏电或外设异常。用万用表串联测电流比较麻烦,更好的方法是使用带电流显示的可调电源。知道每块板子的“正常电流范围”很重要,我一般在拿到新板子的第一天就把这个数值记下来,之后排查问题有了基线。
测电压也有讲究。量 3.3V 和 5V 测试点时,表笔要接触稳定,避免表笔同时碰到两个相邻引脚造成短路。量 SPI/I2C 信号看不出来,但量 GPIO 高低电平是有效的。比如 GPIO 配置为输出高,但量出来一直低,那就要怀疑引脚是不是被复用、硬件是否短路、代码是否没跑起来。
5.3 最小系统排查法应对外设全挂
最头疼的情况是程序本来好好的,加了某个外设后整个系统崩了。这时候最小系统排查法能保命:把代码改回点灯例程,确认板子本身正常;然后逐步恢复外设驱动和外设连接,每次只加一个变量。
我经历过一次 ESP8266 和 STM32 通信的场景,板子一接上对方串口就重启。最小系统排查后才发现是两边 GND 没有共地,串口通信时电位差导致电流倒灌。这个问题在实际项目中非常常见,尤其在两个板子由不同电源供电时。解决方案很简单:把两块板的 GND 用杜邦线连起来。
另外,如果外设供电不足导致系统反复重启,可以给外设单独供电,但注意共地。如果外设通信失败,先确认设备地址对不对、上拉电阻装没装、电平是否匹配。I2C 总线要接上拉电阻,很多模块板上自带了,但如果自己用面包板搭电路,漏掉上拉电阻是必然引入的问题。最小系统排查法,看起来笨重,实际是最快的定位方式。
6. 从点灯到做项目:开发板工程化的最后一公里
6.1 外设驱动开发的通用套路
当你熟悉了点灯、串口、中断这些基础,就该进入真实项目状态。外设驱动开发的套路往往是相通的:初始化、读/写、中断/事件处理。不管是传感器、屏幕、电机驱动,第一步永远是看 datasheet 和示例代码,确定通信接口(UART/SPI/I2C/GPIO/ADC/PWM)和寄存器或命令格式。
一个更重要的思路:不要重复造轮子。ESP32 生态有大量成熟的组件库,比如在 ESP-IDF 里用 component manager 拉取传感器驱动;STM32 有 STM32Cube 扩展包;Linux 开发板更多依赖内核自带的设备驱动。设备树是什么?说白了就是描述硬件资源怎么连接到内核的一张“映射表”,比如哪个 I2C 总线上挂了哪个传感器、地址是多少。你写设备树节点时,实际上是在告诉内核:这个地址上有一个设备,请加载对应的驱动。
初始化和读写只是第一步,真正的项目难点是错误处理和低功耗。传感器读数据偶发超时,是重试还是报错?串口通信在电磁干扰下出现帧错误,如何处理?这些问题没法靠某一条经验解决,但对于新手,我的建议是:先把流程跑通,再一遍遍做异常注入,把能想到的失败场景都用代码兜住。项目级代码和例程最大的区别,不是功能多,而是面对异常时足够健壮。
6.2 把开发板变成工作环境的一部分
到项目后期,开发板往往不是孤立存在的,它会和 Ubuntu 或其他开发机形成一套协同工作流。前面提到网络挂载、串口连接,这里再补充几种常见方式。
第一种是 SSH 连接。Linux 开发板连上路由器后,从电脑通过 SSH 登录板子,可以很方便地执行命令、修改文件、看日志。前提是知道板子的 IP 地址。可以用路由器的管理页面查,也可以扫一下局域网,或者直接在串口终端里 ifconfig。
第二种是网络文件系统挂载。开发机开一个 NFS 服务,把某个目录共享出来,开发板 mount 这个目录后,就能直接运行电脑上编译好的程序。这样省去反复 scp 的过程,特别适合嵌入式 Linux 开发。不过要注意挂载时加 nolock 参数,否则某些架构下会报锁问题。
第三种是日志服务。开发板的串口日志量大了以后,可以直接通过网络发送到电脑统一的日志平台进行检索和分析。对于单片机项目,也可以用第三方串口服务端或自己写一个简单的日志转发工具。
这些工作流的核心目的都一样:缩短“修改代码到验证效果”的反馈链路,让开发板成为开发循环里顺手的一部分,而不是一个需要反复拔插卡、重启、等待的设备。
6.3 笔记、版本管理和硬件迭代
最后一公里,往往是“软素质”。嵌入式开发如果把所有注意力放在板子上,很容易忽略整理和沉淀。我的个人习惯是,每一块开发板建一个目录,按日期记录:
- 开箱照片、丝印版本、关键跳线位置
- 烧录方式、进入下载模式的步骤
- 串口参数、默认登录账号
- 测试过的外设型号、接线图、驱动配置
- 踩过的问题和解决过程
这个习惯在同时玩多块板子时尤其有价值。半年后重新拿起一块板子,翻一下笔记比重新翻几十页文档快得多。
版本管理也不只包括代码,还包括硬件连接图和固件版本。用 Git 管理代码时,每次固件版本号要同步更新。如果改了硬件连接,务必在代码注释里写明是哪个版本,否则这个项目会逐渐失控。我在 Linux 板卡上踩过设备树版本的坑,代码没改,但板子的设备树版本变了,导致外设引脚失效,所以硬件和软件版本信息必须联动维护。
硬件迭代时,不要每次重画一块完整的新板子。先用杜邦线、面包板把核心链路验证清楚,再考虑做小板或转接板。等到了打样阶段,又需要回到“最小系统排查法”去逐个验证新板上的功能。这个过程没有捷径,但可以通过结构化的笔记和版本管理,让每一次迭代都站在上一次的基础上,而不是重新踩一遍。
开发板使用流程,说到底就是一套建立可控反馈的方法。看似是一个点灯的小事,背后却包含了对硬件、工具链、调试手段的完整理解。你可能不会马上用到所有东西,但把基础流程走扎实了,任何一块新板子到你手上,都能快速变成可用的工具。