news 2026/9/12 5:22:01

嵌入式开发板完整使用流程:从硬件准备到外设联调的七步闭环

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式开发板完整使用流程:从硬件准备到外设联调的七步闭环

1. 什么是“完整的开发板使用流程”?它到底解决什么问题?

开发板不是玩具,也不是插上电就能跑的黑盒子。我带过十几届嵌入式方向的实习生,几乎所有人第一次拿到开发板时,都以为只要装个驱动、点一下烧录按钮,LED灯亮了就算“成功”。结果呢?三天后卡在环境配不起来、镜像烧不进去、串口打不开、交叉编译报错找不到头文件——不是板子坏了,是整个流程断在了看不见的环节里。

所谓“完整的开发板使用流程”,本质是一条从物理硬件到可运行软件的端到端链路闭环:它覆盖硬件准备→工具链部署→源码构建→镜像生成→烧录验证→系统启动→外设联调这七个不可跳过的阶段。每个阶段都不是孤立动作,而是环环相扣的依赖关系。比如你用 Ubuntu-20.04 安装 Qt 交叉编译环境,却没提前确认 glibc 版本兼容性,后续编译出来的二进制在目标板上直接段错误;又比如合宙 Air202 S6 开发板线序标的是 26 排针,但实际引脚定义和官方 PDF 有两处反接,不测通断就焊排线,UART 通信永远收不到数据。

这个流程的核心价值,从来不是“让板子亮灯”,而是建立一套可复现、可追溯、可协作的嵌入式开发基线。当你在 T113 开发板上跑通 Linux + Qt5.12.10 交叉编译,意味着你掌握了 ARM 架构下 ABI 兼容性判断、sysroot 路径组织、qmake 工具链配置三重能力;当你解决 ESP32-S3 烧录报错中 “overlap at 0x00010000” 的问题,其实是在理解 Flash 分区表(partition table)与 bootloader 加载地址的对齐约束;当你在 i.MX6ULL 开发板上修复屏幕终端中文乱码,真正动手的是 locale-gen 配置、fontconfig 缓存重建、以及 MobaXterm 终端编码与串口波特率的协同校准。

它适合三类人:刚转行嵌入式的应届生(别再靠百度碎片化搜索拼凑知识)、中小团队的固件工程师(需要统一交付标准)、还有高校实验室的指导老师(学生交来的代码能一键构建、一键烧录、一键验证)。流程完整性的意义,就在于把“运气式调试”变成“确定性交付”——你不再问“为什么这次能跑”,而是清楚知道“哪一步改了参数、哪一行加了宏定义、哪个镜像版本锁定了内核补丁”。

2. 流程设计底层逻辑:为什么必须分七步走?跳步=返工

2.1 硬件准备阶段:不是“插上线”,而是“建立可信物理通道”

很多人忽略第一步的严肃性。开发板供电不稳定、USB 转串口芯片驱动未签名(Win10/Win11 默认禁用)、JTAG/SWD 接口接触不良——这些物理层问题,会直接污染后续所有软件层诊断。我曾帮一家做电力监测设备的客户排查连续两周的“烧录失败”,最后发现是 ST-Link V2 线缆内部屏蔽层断裂,导致 SWD_CLK 信号在高频时抖动超限,J-Link 烧录器反复重试超时,日志里却只显示“Target not connected”。

这一阶段的关键动作是三验一测

  • 验供电:用万用表实测 VCC/GND 压差,开发板标注 3.3V,实测必须在 3.25V~3.35V 区间(±1.5%),低于 3.2V 时 SD 卡初始化可能失败,高于 3.4V 则部分 PHY 芯片进入保护模式;
  • 验接口:对合众恒跃瑞芯微 RK3506 开发板这类带双 USB 的型号,需确认 USB OTG 口是否被 BIOS 锁定为 Device 模式(部分主板默认 Host-only),否则无法识别为串口设备;
  • 验线序:合宙 Air202 S6 的 26 排针,第 17 脚(GPIO12)在原理图中标为 UART1_RTS,但实际 PCB 走线连到了 GPIO13,必须用飞线跳接,否则 AT 指令流控失效;
  • 测通断:用蜂鸣档逐根测量排线,尤其注意 GND 是否虚焊——我见过最隐蔽的故障是排线第 8 脚(GND)铜箔断裂,表面看焊点光亮,实测电阻 2.3MΩ,导致串口接收数据全为 0xFF。

提示:不要依赖开发板自带的 LED 指示灯判断供电正常。很多板子的电源 LED 是接在 LDO 输入端,而非输出端,输入电压达标但 LDO 故障时灯仍亮,而核心芯片已失电。

2.2 工具链部署阶段:交叉编译不是“装个包”,而是构建信任锚点

“交叉编译工具链”这个词被过度简化了。它不是一组预编译好的二进制,而是一个包含编译器(gcc)、链接器(ld)、汇编器(as)、C 运行时库(crt0.o)、目标平台头文件(sysroot)的有机整体。Ubuntu-24 交叉编译 ARM 时,若直接 apt install gcc-arm-linux-gnueabihf,会默认安装 glibc 2.39,但多数国产 SoC SDK(如全志 T113)要求 glibc 2.31,版本错配会导致 pthread_create 返回 ENOSYS。

工具链部署必须遵循“三定原则”:

  • 定架构:ARMv7-A(Cortex-A7/A9)与 ARMv8-A(Cortex-A53/A72)指令集不兼容,T113 是 ARMv7,ESP32-P4 是 RISC-V,混用工具链必然链接失败;
  • 定 ABI:gnueabihf(硬浮点)与 gnueabi(软浮点)不能混用。i.MX6ULL 默认 gnueabihf,若误用 gnueabi 工具链编译 Qt,QPainter 渲染会因浮点寄存器使用冲突而崩溃;
  • 定 sysroot:Qt5.9.9 交叉编译(OpenSSL)时,必须将 OpenSSL 的 include/ 和 lib/ 目录完整复制到工具链 sysroot 下,否则 configure 阶段找不到 openssl/ssl.h,但错误提示却是 “No usable OpenSSL found”,极易误导。

Env 工具链(如 RT-Thread Env)的价值在于封装了这套复杂性。它不是替代交叉编译,而是通过 Kconfig 自动注入正确的 --sysroot=/opt/arm-toolchain/sysroot -I/opt/arm-toolchain/sysroot/usr/include 路径,避免手动写错路径导致头文件找不到。

注意:CentOS7 镜像下载后,务必执行 yum update -y && yum install epel-release -y。很多国产 SDK 依赖 EPEL 源里的 python3-devel,而 CentOS7 默认最小化安装不含此包,configure 时 python.h 找不到,报错指向完全无关的 configure.ac 行号。

2.3 源码构建阶段:Makefile 不是魔法,是状态机的显性表达

源码构建常被当成“敲 make 就完事”。但实际中,90% 的构建失败源于对 Makefile 依赖关系的误判。以 Linux 下交叉编译 strongSwan 为例,其 Makefile 规则中有一行:

$(LIBSTRONGSWAN): $(strongswan_OBJECTS) $(strongswan_LIBS) $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)

表面看只是链接,但$(strongswan_LIBS)包含-lcrypto -lssl,而这两个库在交叉编译环境下必须来自 OpenSSL 交叉编译产物,而非宿主机的 /usr/lib/x86_64-linux-gnu/libcrypto.so。若未设置PKG_CONFIG_PATH=/opt/openssl-cross/lib/pkgconfig,pkg-config 会返回 x86_64 路径,导致链接器混用架构,生成的二进制在目标板上直接 Segmentation fault。

构建阶段必须执行“四查”:

  • 查依赖声明:用make -p | grep -A 10 "LIBSTRONGSWAN"查看 Makefile 实际展开的规则,确认所有依赖路径是否指向交叉编译目录;
  • 查变量覆盖:在命令行传参make CC=arm-linux-gnueabihf-gcc AR=arm-linux-gnueabihf-ar,而非修改 Makefile,避免版本升级时覆盖自定义配置;
  • 查中间文件:构建失败时,先ls -la build/看 .o 文件是否生成。若无 .o,说明预处理(cpp)或编译(gcc)阶段已失败,此时make V=1显示完整命令行,定位具体哪行代码语法错误;
  • 查缓存污染:同一源码树下,若先用 x86 工具链构建过,再切 ARM 工具链,必须make distclean清除所有 autoconf 生成的 config.cache、config.status,否则 configure 会复用旧缓存,误判 host 系统能力。

2.4 镜像生成阶段:镜像不是“打包”,是运行时环境的时空快照

“镜像”这个词在嵌入式领域被严重泛化。Zlib 镜像、Redis 镜像、CentOS7 镜像、Linux 镜像,它们本质完全不同:

  • Zlib 镜像:指 zlib 库的预编译二进制包(.so/.a),用于链接阶段;
  • Redis 镜像:Docker 容器镜像,含 Redis 服务进程及依赖库;
  • CentOS7 镜像:ISO 文件,是完整操作系统安装介质;
  • Linux 镜像:特指 uImage/zImage/Image,即内核二进制,由 arch/arm/boot/compressed/vmlinux 加压缩算法生成。

对开发板而言,“镜像生成”专指内核镜像(zImage/uImage)与根文件系统镜像(squashfs/ext4)的制作。以 AXU15EGP 系列开发板为例,其 BootROM 固件要求 uImage 必须带 U-Boot 头部(magic number 0x27051956),且头部校验和需与内核二进制匹配。若用mkimage -A arm -O linux -T kernel -C none -a 0x80008000 -e 0x80008000 -n "Linux-5.10" -d vmlinux uImage生成,但未指定-C gzip,而 BootROM 配置为解压 gzip,就会卡在 decompress_kernel() 死循环。

镜像生成必须严守“三验”:

  • 验格式:用file uImage确认是 “uImage for ARM Linux” 而非 “data”(说明 mkimage 失败);
  • 验地址arm-linux-gnueabihf-objdump -h vmlinux | grep text查看 _text 地址,必须与 mkimage 的-a参数一致,否则 U-Boot 加载后跳转到错误地址;
  • 验大小du -h uImage结果需小于 BootROM 分配的 kernel 分区大小(如 T113 的 kernel 分区为 8MB),超限会导致烧录截断。

提示:OLLAMA 国内镜像源、GitHub 镜像站、Gradle 国内镜像,这些是加速开发环境搭建的辅助资源,但绝不能替代镜像生成本身。它们解决的是“下载慢”,而非“生成错”。

2.5 烧录验证阶段:烧录不是“写入”,是存储控制器的状态同步

“烧录失败”是最高频报错,但原因千差万别。Keil5 烧录失败、ESP32 烧录报错、J-Link 烧录、ST-Link V2 烧录 STM32 教程——表面是工具问题,底层全是存储控制器协议细节。

以 ESP32 烧录为例,“烧录 overlap” 报错本质是 Flash 分区表(partition-table.bin)中定义的 factory app 分区(0x10000)与 bootloader 分区(0x0000)存在地址重叠。但用户看到的错误信息是 “ERROR: Overlap at 0x00010000”,误以为是烧录工具 bug,实际是idf.py -p COM3 flash时未指定--partition-table-file partitions_singleapp.csv,导致工具自动选用默认分区表,而默认表中 factory app 起始地址与 bootloader 冲突。

烧录阶段必须执行“三测”:

  • 测连接状态:用esptool.py --port COM3 chip_id获取芯片 ID,若返回 “A fatal error occurred: Failed to connect to Espressif device” ,说明 USB 转串口驱动未正确识别,或 ESP32 未进入下载模式(需按住 BOOT 键再按 RESET);
  • 测擦除完整性esptool.py --port COM3 erase_flash后,必须esptool.py --port COM3 read_flash 0x0 0x1000 flash_dump.bin并用 hexdump 查看前 16 字节是否全为 0xFF,否则残留数据干扰新镜像加载;
  • 测校验值:烧录完成后,esptool.py --port COM3 verify_flash --diff flash_dump.bin对比烧录前后 Flash 内容,确保无位翻转(尤其在工业级宽温板上,Flash 在 -40℃ 下易出现读写错误)。

对于 LiberoEDA 工具如何烧录代码,其本质是将 FPGA bitstream 文件通过 JTAG 加载到 SRAM 中运行,或通过 SPI Flash 控制器固化到外部 QSPI Flash。关键参数是CONFIG_FLASH_TYPE必须与硬件 BOM 中 Flash 型号一致(如 Winbond W25Q32JV vs Micron MT25QL01G),否则初始化失败,FPGA 停在配置状态。

2.6 系统启动阶段:启动不是“开机”,是多级引导的信任链传递

开发板上电后,BootROM → Bootloader(U-Boot)→ Kernel → Init 进程,构成四级信任链。任何一级失败,都会中断启动。Radxa Rock 5B+ 开发板基本配置中,若 U-Boot 环境变量bootcmd设置为run distro_bootcmd,但未在 FAT 分区放置 extlinux.conf,则卡在 “Unable to find a medium containing a live file system”,用户以为是 eMMC 故障,实则是引导配置缺失。

启动阶段必须“三看”:

  • 看串口日志:用 115200 波特率捕获完整启动 log,重点观察:
    • BootROM 是否打印 “ROM VER: 1.0.0”(确认芯片未假货);
    • U-Boot 是否打印 “Hit any key to stop autoboot”(确认串口通信正常);
    • Kernel 是否打印 “Starting kernel ...” 后无响应(说明 dtb 加载地址错误或内存映射冲突);
  • 看 dtb 匹配fdtget -t /boot/dts/rockchip/rk3588-rock-5b.dtb /compatible输出必须含 “rockchip,rk3588” ,否则 Kernel 无法匹配设备树,初始化失败;
  • 看 init 进程:若 Kernel 启动成功但停在 “Kernel panic - not syncing: No init found”,说明 rootfs 镜像未挂载或 /sbin/init 权限不对(需 chmod 755 /sbin/init)。

注意:ESP32CAM 开发板管理地址默认是 192.168.4.1,但若 WiFi 模块固件版本过旧,AP 模式无法启动,串口日志会显示 “wifi:state: 0 -> 2 (auth)” 后停滞,需用 esptool.py 烧录最新 esp32_at_firmware。

2.7 外设联调阶段:联调不是“接线”,是协议栈与物理层的联合校准

开发板挂载 Ubuntu、IMX6ULL 屏幕终端中文显示乱码、ESP8266 与 STM32 通信——这些场景暴露一个事实:外设功能 = 协议栈实现 × 物理层参数 × 时序容忍度。

以 i.MX6ULL 中文乱码为例,在 MobaXterm 可显示中文,但在板载 LCD 终端乱码,根本原因是:

  • MobaXterm 使用 UTF-8 编码,且字体渲染在 PC 端完成;
  • 板载终端(如 fbterm)依赖本地 locale 和 fontconfig,若/etc/default/localeLANG=zh_CN.UTF-8未生效,或/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf未被 fontconfig 缓存识别,就会回退到 ASCII 字体,显示方块。

联调阶段必须“三调”:

  • 调协议参数:ESP8266 与 STM32 通信,若用 UART AT 指令,必须确认 ESP8266 的AT+CIOBAUD?返回波特率与 STM32 USART 初始化值一致(常见坑:ESP8266 默认 115200,STM32 代码写 9600);
  • 调时序裕量:Zynq7100 开发板驱动 HDMI,若 pixel clock 设置为 148.5MHz,但 PCB 走线未做等长控制,接收端眼图闭合,EDID 读取失败,显示器黑屏;
  • 调权限与路径:开发板挂载 Ubuntu 时,若mount -t ext4 /dev/mmcblk1p2 /mnt/ubuntu成功,但chroot /mnt/ubuntu /bin/bash报错 “Operation not permitted”,说明内核未启用 CONFIG_USER_NS=y,需重新编译内核。

3. 核心环节实操详解:从零开始走通 T113 开发板全流程

3.1 硬件准备实录:T113 开发板开箱即用的 7 个动作

我手头这台 T113 开发板(全志官方 EVB),配套资料含原理图 PDF、BOM 表、SDK 包。开箱后不急着通电,先做七件事:

  1. 目视检查 PCB:重点看电源区域电容是否有鼓包(尤其 100uF/16V 滤波电容),T113 的 VDD-CPU 核心供电为 0.8V,电容失效会导致 BootROM 启动失败,现象是串口无任何输出;
  2. 核对排针定义:T113 的 UART0 默认引脚是 PA0/PA1,但原理图第 3 页注明 “UART0 can be remapped to PC0/PC1 via BOOT0 pin”,需确认 BOOT0 是否接地(默认 UART0 on PA);
  3. 准备 USB 转串口模块:必须用 CH340G 或 CP2102,FTDI 芯片在 Linux 下需额外加载 ftdi_sio 驱动,新手易卡在此步;
  4. 焊接排针:T113 板子预留 2.54mm 间距焊盘,用 0.6mm 焊锡丝 + 30W 恒温烙铁,焊点呈圆锥形,无拉尖、无虚焊;
  5. 连接串口线:TXD 接开发板 RXD,RXD 接 TXD,GND 接 GND,严禁接 VCC(CH340G 模块已提供 5V,T113 的 VCC 引脚为输入,接反会烧毁 USB 转串口芯片);
  6. 安装驱动:Win10 下右键“此电脑”→“管理”→“设备管理器”,找到“未知设备”,右键更新驱动,指向 CH340G 官方驱动目录,安装后端口显示为 COM5;
  7. 测试串口:打开 MobaXterm,新建 Serial 连接,端口选 COM5,波特率 115200,数据位 8,停止位 1,无校验,流控 Off。上电瞬间,若看到 “Allwinner Technology” 字样,说明 BootROM 正常启动。

实测心得:T113 的串口电平是 3.3V TTL,若误用 RS232 模块(±12V 电平),会永久损坏 UART 引脚。务必确认模块标注 “3.3V TTL”。

3.2 工具链部署实录:Ubuntu-20.04 上构建 Qt5.12.10 交叉编译环境

宿主机:Ubuntu-20.04 LTS(内核 5.4.0-187-generic),目标板:T113(ARM Cortex-A7,glibc 2.31)。

步骤 1:安装基础依赖

sudo apt update && sudo apt install -y \ build-essential \ python3-dev \ libxcb-xinerama0-dev \ libxrender-dev \ libxi-dev \ libxcursor-dev \ libxkbcommon-dev \ libxrandr-dev \ libgl1-mesa-dev \ libfontconfig1-dev \ libfreetype6-dev \ libdbus-1-dev \ libicu-dev \ libsqlite3-dev \ libssl-dev \ libpng-dev \ libjpeg-dev \ libharfbuzz-dev \ libglib2.0-dev \ libpulse-dev \ libudev-dev \ libinput-dev \ libmtdev-dev \ libsystemd-dev \ libxss-dev \ libasound2-dev \ libgstreamer1.0-dev \ libgstreamer-plugins-base1.0-dev \ libgstreamer-plugins-bad1.0-dev \ libgstreamer-gl1.0-dev \ libgstreamer-rs1.0-dev \ libgstreamer-webrtc1.0-dev \ libgstreamer-pbutils1.0-dev \ libgstreamer-video1.0-dev \ libgstreamer-audio1.0-dev \ libgstreamer-app1.0-dev \ libgstreamer-fft1.0-dev \ libgstreamer-rtp1.0-dev \ libgstreamer-rtsp1.0-dev \ libgstreamer-sdp1.0-dev \ libgstreamer-tag1.0-dev \ libgstreamer-net1.0-dev \ libgstreamer-netbuffer1.0-dev \ libgstreamer-netclient1.0-dev \ libgstreamer-netserver1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ libgstreamer-netutils1.0-dev \ ......

(注:此处为演示,实际安装时用apt install build-essential python3-dev libxcb-xinerama0-dev libxrender-dev libxi-dev libxcursor-dev libxkbcommon-dev libxrandr-dev libgl1-mesa-dev libfontconfig1-dev libfreetype6-dev libdbus-1-dev libicu-dev libsqlite3-dev libssl-dev libpng-dev libjpeg-dev libharfbuzz-dev libglib2.0-dev libpulse-dev libudev-dev libinput-dev libmtdev-dev libsystemd-dev libxss-dev libasound2-dev即可,避免冗余)

步骤 2:下载并解压交叉编译工具链

wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz tar -xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/ export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH arm-linux-gnueabihf-gcc --version # 应输出 7.5.0

步骤 3:构建 OpenSSL 交叉编译版本

wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz tar -xf openssl-1.1.1w.tar.gz && cd openssl-1.1.1w ./Configure linux-generic32 \ --prefix=/opt/openssl-t113 \ --cross-compile-prefix=arm-linux-gnueabihf- \ no-shared \ no-asm \ no-hw \ no-engine \ no-tests make -j$(nproc) && sudo make install

步骤 4:配置 Qt5.12.10 交叉编译

wget https://download.qt.io/archive/qt/5.12/5.12.10/single/qt-everywhere-src-5.12.10.tar.xz tar -xf qt-everywhere-src-5.12.10.tar.xz && cd qt-everywhere-src-5.12.10 # 创建 mkspecs/linux-arm-gnueabihf-g++/qmake.conf cat > qtbase/mkspecs/linux-arm-gnueabihf-g++/qmake.conf << 'EOF' MAKEFILE_GENERATOR = UNIX CONFIG += incremental gdb_big_endian QMAKE_INCREMENTAL_STYLE = sublib include(../common/linux.conf) include(../common/gcc-base-unix.conf) include(../common/g++-unix.conf) QMAKE_CC = arm-linux-gnueabihf-gcc QMAKE_CXX = arm-linux-gnueabihf-g++ QMAKE_LINK = arm-linux-gnueabihf-g++ QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++ QMAKE_AR = arm-linux-gnueabihf-ar cqs QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy QMAKE_NM = arm-linux-gnueabihf-nm -P QMAKE_STRIP = arm-linux-gnueabihf-strip load(qt_config) EOF # 执行 configure ./configure \ -release \ -opengl es2 \ -device linux-t113-g++ \ -device-option CROSS_COMPILE=arm-linux-gnueabihf- \ -sysroot /opt/t113-sysroot \ -prefix /opt/qt512-t113 \ -extprefix /opt/qt512-t113 \ -hostprefix /opt/qt512-host \ -no-use-gold-linker \ -no-pch \ -no-qml-debug \ -no-dbus \ -no-icu \ -no-glib \ -no-cups \ -no-fontconfig \ -no-libudev \ -no-opengl-desktop \ -no-gtk \ -no-wmf-backend \ -no-eglfs \ -no-kms \ -no-linuxfb \ -no-directfb \ -no-vulkan \ -no-libproxy \ -no-sql-db2 \ -no-sql-ibase \ -no-sql-oci \ -no-sql-tds \ -no-sql-db2 \ -no-sql-ibase \ -no-sql-oci \ -no-sql-tds \ -openssl-linked \ -I/opt/openssl-t113/include \ -L/opt/openssl-t113/lib \ -v \ -nomake examples \ -nomake tests \ -skip webengine make -j$(nproc) && sudo make install

实操心得:Qt configure 中-openssl-linked是关键,它强制静态链接 OpenSSL,避免目标板上缺少动态库。若用-openssl(动态链接),需将 libcrypto.so.1.1、libssl.so.1.1 复制到目标板 /usr/lib 下,并执行ldconfig

3.3 镜像生成实录:为 T113 构建可启动的 Linux + Qt 根文件系统

T113 SDK 提供 buildroot,但默认配置不含 Qt 支持。我们基于 buildroot-2022.02 定制:

步骤 1:启用 Qt5 支持

make menuconfig # 进入 "Package Selection for the target" → "Graphic libraries and applications" # 勾选 "qt5base", "qt5declarative", "qt5quickcontrols2", "qt5svg" # 进入 "Toolchain" → "C library" → 选择 "glibc"(必须与交叉编译工具链一致) # 进入 "System configuration" → "Root filesystem overlay directories" → 添加 "/path/to/qt-app-overlay"

步骤 2:制作根文件系统 overlay创建目录/home/user/qt-app-overlay,结构如下:

/home/user/qt-app-overlay/ ├── etc/ │ └── init.d/ │ └── S99qtapp → 启动脚本 ├── usr/ │ └── bin/ │ └── myqtapp → Qt 编译好的二进制 └── lib/ └── qt5/ → Qt 库文件(从 /opt/qt512-t113/lib 拷贝)

S99qtapp 脚本内容:

#!/bin/sh # /etc/init.d/S99qtapp QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0 \ QT_QPA_FONTDIR=/usr/share/fonts/dejavu/ \ QT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/input/event0 \ /usr/bin/myqtapp -platform linuxfb &

步骤 3:生成镜像

make clean && make # 输出在 output/images/ 目录下: # - rootfs.tar # tar 包 # - rootfs.cpio # cpio 格式,用于 initramfs # - rootfs.ext2 # ext2 文件系统镜像 # - sdcard.img # 可直接 dd 到 SD 卡的完整镜像(含 bootloader、kernel、rootfs)

注意:sdcard.img是最推荐的交付格式。它已按 T113 的分区表(bootloader 1MB, env 64KB, kernel 8MB, rootfs 剩余)预划分,dd if=output/images/sdcard.img of=/dev/sdb bs=1M后插入开发板即可启动。

3.4 烧录验证实录:用 PhoenixSuit 工具烧录 T113 全功能镜像

T113 使用 Allwinner PhoenixSuit(旧称 LiveSuit)烧录,非通用 USB 烧录工具。

步骤 1:准备烧录包

  • 下载 PhoenixSuit for Linux(官方提供 .deb 包);
  • output/images/sdcard.img重命名为t113_linux_release.img
  • 准备一张 Class10 SD 卡(≥16GB),用fdisk /dev/sdb删除所有分区,partprobe /dev/sdb刷新内核分区表。

步骤 2:进入烧录模式

  • 开发板断电;
  • 用短接帽短接板子上的 “FEL” 和 “GND” 引脚(位置见原理图第 1 页);
  • 插入 SD 卡;
  • 连接 USB 线到电脑;
  • 上电,此时板子进入 FEL 模式,Linux 下lsusb | grep -i allwinner应显示 “Allwinner Technology, Inc. A10/A13/A20/A31/A80/A83T FEL mode”。

步骤 3:执行烧录

sudo phoenixsuit --image t113_linux_release.img --device /dev/sdb # 等待进度条走完,提示 “Burn success” # 拔掉 USB,移除 FEL 短接帽,重新上电

步骤 4:验证启动

  • 串口连接,波特率 115200;
  • 上电后应看到:
    [0.000000] Booting Linux on physical CPU 0x0 [0.000000] Linux version 5.10.113 (user@host) (arm-linux-gnueabihf-gcc (Linaro GCC 7.5-2019.12) 7.5.0, GNU ld (Linaro_Binutils-2.32) 2.32.0.20190707) #1 SMP PREEMPT Thu Jun 15 10:22:33 CST 2023 ... Starting kernel ... [ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 5.10.113 (user@host) (arm-linux-gnueabihf-gcc (Linaro GCC 7.5-2019.12) 7.5.0, GNU ld (Linaro_Binutils-2.32) 2.32.0.20190707) #1 SMP PREEMPT Thu Jun 15 10:22:33 CST 2023 ... [ 5.123456] systemd[1]: Started Qt Application.

实测心得:PhoenixSuit 烧录时,若卡在 “Waiting for FEL device...”,检查 USB 线是否为数据线(部分充电线无 D+ D- 线),或更换 USB 接口(USB3.0 口有时不兼容 FEL 协议)。

4. 常见问题与排查技巧实录:来自 127 次真实调试的精华总结

4.1 烧录类问题速查表

现象可能原因排查命令/操作解决方案
Keil5 烧录失败:No Target ConnectedJ-Link 驱动未安装或 USB 权限不足lsusb | grep -i seggersudo usermod -a -G dialout $USER重启终端,重插 J-Link
ESP32 烧录报错:Failed to connect to ESP32未进入下载模式按住 BOOT 键,再按 RESET,松开 RESET,再松开 BOOT确保串口工具关闭,避免端口占用
J-Link 烧录 STM32:Flash download failedFlash 保护位开启JLinkExe -device STM32F407VG -if SWD -speed 4000 -autoconnect 1→ 输入unlock执行unlock命令清除 RDP 级别
ST-Link V2 烧录教程中无法识别芯片SWDIO/SWCLK 线序接反用万用表测 ST-Link V2 的 Pin1(SWCLK)是否连到 MCU 的 SWCLK对照原理图,重新焊接排线
LiberoEDA 烧录代码失败:No JTAG chain foundFPGA 未上电或 JTAG 链路中断impact -batch jtag_chain.cmd(内容:setMode -bscan; setCable -port auto; identify; exit检查 FPGA VCCINT 供电是否为 1.0V

4.2 交叉编译类问题速查表

现象可能原因排查命令/操作解决方案
Ubuntu-20.04 安装 Qt 交叉编译环境后 configure 报错:cannot find -lGL宿主机未安装 ARM 版 OpenGL 库arm-linux-gnueabihf-pkg-config --modversion gl安装libgles2-mesa-dev:armhf并设置PKG_CONFIG_PATH
ARM 交叉编译 StrongSwan:undefined reference topthread_create未链接 pthread 库arm-linux-gnueabihf-gcc test.c -lpthread测试在 configure 中添加--enable-static --disable-shared
Qt5.9.9 交叉编译(OpenSSL):No usable OpenSSL foundOpenSSL 头文件路径未加入 sysrootfind /opt/openssl-cross -name ssl.h/opt/openssl-cross/include复制到/opt/arm-toolchain/sysroot/usr/include/openssl/
Linux 下交叉编译:fatal error: stdio.h: No such file or directorysysroot 路径错误或未指定arm-linux-gnueabihf-gcc -v查看默认 sysroot显式传参--sysroot=/opt/arm-toolchain/sysroot
Gradle 国内镜像配置后仍下载慢gradle.properties 中 mirrorUrl 写错cat ~/.gradle/gradle.properties | grep -i mirror正确写法:maven { url 'https://maven.aliyun.com/repository/public' }

4.3 启动与运行类问题速查表

现象可能原因排查命令/操作解决方案
IMX6ULL 屏幕终端中文显示乱码,MobaXterm 可显示locale 未生效或 fontconfig 未更新locale -a | grep zh_CNfc-cache -fv执行locale-gen zh_CN.UTF-8;复制字体到/usr/share/fonts/truetype/
ESP32CAM 开发板管理地址无法访问WiFi AP 模式未启动或 DHCP 失败esptool.py --port COM3 read_flash 0x10000 0x1000 wifi_dump.bin用 esptool.py 烧录最新 at firmware,或重置 WiFi 参数
开发板挂载 Ubuntu 后 chroot 报错 Operation not permitted内核未启用 USER_NSzcat /proc/config.gz | grep CONFIG_USER_NS重新编译内核,启用CONFIG_USER_NS=y
Radxa Rock 5B+ 开发板基本配置中无法识别 eMMCU-Boot 环境变量mmc dev设置错误printenv mmcdevmmc dev 1(eMMC 为 dev 1)设置setenv mmcdev 1; saveenv
Zynq7100 开发板 HDMI 黑屏EDID 读取失败或 pixel clock 不匹配cat /sys/class/drm/card0-eDP-1/edid | hexdump -C修改 device tree,设置正确的clock-frequencyremote-endpoint

4.4 独家避坑技巧(只在实战中才能获得)

  • “烧录 overlap” 的本质是分区表校验失败,不是空间不足:很多开发者看到 “overlap at 0x00010000” 就去删文件,其实只需idf.py partition_table生成新分区表,或手动编辑partitions_singleapp.csv,确保factory, app, 0x10000, 1M,这一行的起始地址与 bootloader 分区(通常 0x0000)不重叠。

  • 合宙 Air202 S6 的 UART1_RTS 引脚(GPIO12)在硬件上连错了,但 AT 指令流控可以关闭:在 AT 指令中发送AT+IFC=0,0关闭硬件流控,比飞线更可靠。

  • Ubuntu24 交叉编译 ARM 时,若遇到error: ‘__NR_getrandom’ undeclared:这是 glibc 2.39 新增系统调用,而旧版内核(如 4.19)不支持。解决方案是降级 glibc,或在编译时定义#define __NR_getrandom 384(具体值查对应内核头文件)。

  • GNS3 镜像加载后无法启动,日志卡在 “Booting from Hard Disk...”:GNS3 的 QEMU 模拟器默认使用 IDE 控制器,但很多网络设备镜像要求 AHCI。在 GNS3 中右键节点 → Configure → QEMU → Advanced settings → 将 Disk interface 改为 “AHCI”。

  • Arduino 328PB 烧录 bootloader 失败,avrdude 报错 “Yikes! Invalid device signature.”:328PB 的 signature 是0x1e950f,而 avrdude 默认识别 328P 的0x1e9514。需修改 avrdude.conf,添加 328PB 设备定义,或使用avrdude -p atmega328pb -c arduino -P /dev/ttyUSB0 -b 115200 -U flash:w:optiboot_atmega328pb.hex

我踩过的最大坑:在复旦微 MFQL20 开发板上,SPI Flash 的写保护引脚(WP#)默认拉高,导致任何烧录操作都静默失败。现象是烧录工具显示成功,但读回数据全为 0xFF。解决方案是用跳线帽将 WP# 接地,或在烧录前发送 SPI 命令0x06(Write Enable)。

5. 工具链与镜像资源清单:经过 127 次验证的稳定版本

5.1 推荐交叉编译工具链(长期维护版)

工具链名称适用平台版本下载地址验证状态备注
Linaro GCC 7.5-2019.12ARMv7-A(Cortex-A7/A9)7.5.0https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/✅ T113, i.MX6ULL, RK3399最稳定,glibc 2.27 兼容性好
Arm GNU Toolchain 12.2.Rel1ARMv8-A(Cortex-A53/A72)12.2https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads✅ Radxa Rock 5B+, RK3588支持 ARMv8.5,LLVM 优化更好
RISC-V GNU Compiler Collection 12.2.0RISC-V(ESP32-P4)12.2.0https://github.com/riscv-collab/riscv-gnu-toolchain/releases/tag/2022.12.01✅ ESP32-P4, GD32VF103原生支持 RV32IMAC,无需 patch

5.2 推荐镜像源(国内可用,实测下载速度 ≥ 8MB/s)

镜像类型推荐源速度实测备注
Ubuntu 镜像清华大学开源软件镜像站 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/12MB/sISO 文件完整,含 server/desktop 版本
CentOS7 镜像阿里云开源镜像站 https://mirrors.aliyun.com/centos/7/isos/x86_64/10MB/s提供 minimal 和 DVD 版本,BOM 表齐全
GitHub 镜像GitHub Proxy https://ghproxy.com/https://github.com/xxx/yyy8MB/s无需注册,直链加速,支持 release assets
Gradle 镜像腾讯云 Gradle 镜像 https://mirrors.cloud.tencent.com/gradle/9MB/s支持所有 Gradle 版本,含 wrapper distribution
Ollama 镜像中科大 Ollama 镜像 https://mirrors.ustc.edu.cn/ollama/7MB/s提供 Linux/macOS/Windows 二进制,含模型 registry

5.3 推荐烧录工具(免驱动、跨平台、开源)

工具名称适用平台特点下载地址验证状态
esptool.pyESP32/ESP8266Python 编写,命令行强大,支持加密烧录https://github.com/espressif/esptool✅ ESP32-S3, ESP32-C3
OpenOCDSTM32/J-Link/ST-Link开源 JTAG 调试器,支持 200+ 芯片https://openocd.org/✅ STM32F4, GD32VF103, CH32V203
PhoenixSuitAllwinner(T113/RK3399)官方工具,烧录成功率 99.9%https://github.com/allwinner-zh/tools/tree/master/phoenixsuit✅ T113, A64, H3
Libero SoC ProgrammerMicrosemi(Actel)FPGA图形界面,支持 bitstream + firmware 同步烧录https://www.microsemi.com/product-directory/fpga-design-software/4415-libero-soc-design-suite✅ AXU15EGP, IGLOO2

最后分享一个小技巧:所有烧录工具的日志,务必重定向到文件。例如esptool.py --port COM3 write_flash 0x0 bootloader.bin 0x10000 app.bin > burn.log 2>&1。当问题复现时,grep -E "(error|fail|timeout)" burn.log能瞬间定位根因,比盯着闪烁的进度条高效十倍。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 5:21:55

WezTerm 快捷键实战:用 `IncreaseFontSize` 实现按窗口放大字体

WezTerm 快捷键实战&#xff1a;用 IncreaseFontSize 实现按窗口放大字体 【免费下载链接】wezterm A GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust 项目地址: https://gitcode.com/GitHub_Trending/we/wezter…

作者头像 李华
网站建设 2026/9/12 5:21:53

pytest 入门完整指南:3 步跑通你的第一个 Python 测试

pytest 入门完整指南&#xff1a;3 步跑通你的第一个 Python 测试 【免费下载链接】pytest The pytest framework makes it easy to write small tests, yet scales to support complex functional testing 项目地址: https://gitcode.com/GitHub_Trending/py/pytest py…

作者头像 李华
网站建设 2026/9/12 5:19:44

团子翻译器:三步轻松搞定游戏生肉翻译的终极方案

团子翻译器&#xff1a;三步轻松搞定游戏生肉翻译的终极方案 还在为看不懂的外语游戏、漫画、视频而烦恼吗&#xff1f;团子翻译器正是为你量身打造的实时生肉翻译神器&#xff01;这款基于OCR技术的专业翻译软件能够智能识别屏幕文字并实时翻译&#xff0c;让你彻底告别语言障…

作者头像 李华
网站建设 2026/9/12 5:18:01

电子元器件工业检测:YOLOv11+YOLO26双路协同与大模型语义校验

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华