ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

嵌入式开发板完整使用流程:从硬件准备到外设联调的七步闭环 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-ACortex-A7/A9与 ARMv8-ACortex-A53/A72指令集不兼容T113 是 ARMv7ESP32-P4 是 RISC-V混用工具链必然链接失败定 ABIgnueabihf硬浮点与 gnueabi软浮点不能混用。i.MX6ULL 默认 gnueabihf若误用 gnueabi 工具链编译 QtQPainter 渲染会因浮点寄存器使用冲突而崩溃定 sysrootQt5.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/pkgconfigpkg-config 会返回 x86_64 路径导致链接器混用架构生成的二进制在目标板上直接 Segmentation fault。构建阶段必须执行“四查”查依赖声明用make -p | grep -A 10 LIBSTRONGSWAN查看 Makefile 实际展开的规则确认所有依赖路径是否指向交叉编译目录查变量覆盖在命令行传参make CCarm-linux-gnueabihf-gcc ARarm-linux-gnueabihf-ar而非修改 Makefile避免版本升级时覆盖自定义配置查中间文件构建失败时先ls -la build/看 .o 文件是否生成。若无 .o说明预处理cpp或编译gcc阶段已失败此时make V1显示完整命令行定位具体哪行代码语法错误查缓存污染同一源码树下若先用 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 → BootloaderU-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/locale中LANGzh_CN.UTF-8未生效或/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf未被 fontconfig 缓存识别就会回退到 ASCII 字体显示方块。联调阶段必须“三调”调协议参数ESP8266 与 STM32 通信若用 UART AT 指令必须确认 ESP8266 的ATCIOBAUD?返回波特率与 STM32 USART 初始化值一致常见坑ESP8266 默认 115200STM32 代码写 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_NSy需重新编译内核。3. 核心环节实操详解从零开始走通 T113 开发板全流程3.1 硬件准备实录T113 开发板开箱即用的 7 个动作我手头这台 T113 开发板全志官方 EVB配套资料含原理图 PDF、BOM 表、SDK 包。开箱后不急着通电先做七件事目视检查 PCB重点看电源区域电容是否有鼓包尤其 100uF/16V 滤波电容T113 的 VDD-CPU 核心供电为 0.8V电容失效会导致 BootROM 启动失败现象是串口无任何输出核对排针定义T113 的 UART0 默认引脚是 PA0/PA1但原理图第 3 页注明 “UART0 can be remapped to PC0/PC1 via BOOT0 pin”需确认 BOOT0 是否接地默认 UART0 on PA准备 USB 转串口模块必须用 CH340G 或 CP2102FTDI 芯片在 Linux 下需额外加载 ftdi_sio 驱动新手易卡在此步焊接排针T113 板子预留 2.54mm 间距焊盘用 0.6mm 焊锡丝 30W 恒温烙铁焊点呈圆锥形无拉尖、无虚焊连接串口线TXD 接开发板 RXDRXD 接 TXDGND 接 GND严禁接 VCCCH340G 模块已提供 5VT113 的 VCC 引脚为输入接反会烧毁 USB 转串口芯片安装驱动Win10 下右键“此电脑”→“管理”→“设备管理器”找到“未知设备”右键更新驱动指向 CH340G 官方驱动目录安装后端口显示为 COM5测试串口打开 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目标板T113ARM Cortex-A7glibc 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-prefixarm-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_COMPILEarm-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_PLATFORMlinuxfb:fb/dev/fb0 \ QT_QPA_FONTDIR/usr/share/fonts/dejavu/ \ QT_QPA_GENERIC_PLUGINSevdevtouch:/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 ifoutput/images/sdcard.img of/dev/sdb bs1M后插入开发板即可启动。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 (userhost) (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 (userhost) (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-LinkESP32 烧录报错Failed to connect to ESP32未进入下载模式按住 BOOT 键再按 RESET松开 RESET再松开 BOOT确保串口工具关闭避免端口占用J-Link 烧录 STM32Flash download failedFlash 保护位开启JLinkExe -device STM32F407VG -if SWD -speed 4000 -autoconnect 1→ 输入unlock执行unlock命令清除 RDP 级别ST-Link V2 烧录教程中无法识别芯片SWDIO/SWCLK 线序接反用万用表测 ST-Link V2 的 Pin1SWCLK是否连到 MCU 的 SWCLK对照原理图重新焊接排线LiberoEDA 烧录代码失败No JTAG chain foundFPGA 未上电或 JTAG 链路中断impact -batch jtag_chain.cmd内容setMode -bscan; setCable -port auto; identify; exit检查 FPGA VCCINT 供电是否为 1.0V4.2 交叉编译类问题速查表现象可能原因排查命令/操作解决方案Ubuntu-20.04 安装 Qt 交叉编译环境后 configure 报错cannot find -lGL宿主机未安装 ARM 版 OpenGL 库arm-linux-gnueabihf-pkg-config --modversion gl安装libgles2-mesa-dev:armhf并设置PKG_CONFIG_PATHARM 交叉编译 StrongSwanundefined reference topthread_create未链接 pthread 库arm-linux-gnueabihf-gcc test.c -lpthread测试在 configure 中添加--enable-static --disable-sharedQt5.9.9 交叉编译OpenSSLNo 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/sysrootGradle 国内镜像配置后仍下载慢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_NSyRadxa Rock 5B 开发板基本配置中无法识别 eMMCU-Boot 环境变量mmc dev设置错误printenv mmcdevmmc dev 1eMMC 为 dev 1设置setenv mmcdev 1; saveenvZynq7100 开发板 HDMI 黑屏EDID 读取失败或 pixel clock 不匹配cat /sys/class/drm/card0-eDP-1/edid | hexdump -C修改 device tree设置正确的clock-frequency和remote-endpoint4.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 指令中发送ATIFC0,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 命令0x06Write Enable。5. 工具链与镜像资源清单经过 127 次验证的稳定版本5.1 推荐交叉编译工具链长期维护版工具链名称适用平台版本下载地址验证状态备注Linaro GCC 7.5-2019.12ARMv7-ACortex-A7/A97.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-ACortex-A53/A7212.2https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads✅ Radxa Rock 5B, RK3588支持 ARMv8.5LLVM 优化更好RISC-V GNU Compiler Collection 12.2.0RISC-VESP32-P412.2.0https://github.com/riscv-collab/riscv-gnu-toolchain/releases/tag/2022.12.01✅ ESP32-P4, GD32VF103原生支持 RV32IMAC无需 patch5.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 assetsGradle 镜像腾讯云 Gradle 镜像 https://mirrors.cloud.tencent.com/gradle/9MB/s支持所有 Gradle 版本含 wrapper distributionOllama 镜像中科大 Ollama 镜像 https://mirrors.ustc.edu.cn/ollama/7MB/s提供 Linux/macOS/Windows 二进制含模型 registry5.3 推荐烧录工具免驱动、跨平台、开源工具名称适用平台特点下载地址验证状态esptool.pyESP32/ESP8266Python 编写命令行强大支持加密烧录https://github.com/espressif/esptool✅ ESP32-S3, ESP32-C3OpenOCDSTM32/J-Link/ST-Link开源 JTAG 调试器支持 200 芯片https://openocd.org/✅ STM32F4, GD32VF103, CH32V203PhoenixSuitAllwinnerT113/RK3399官方工具烧录成功率 99.9%https://github.com/allwinner-zh/tools/tree/master/phoenixsuit✅ T113, A64, H3Libero SoC ProgrammerMicrosemiActelFPGA图形界面支持 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 21。当问题复现时grep -E (error|fail|timeout) burn.log能瞬间定位根因比盯着闪烁的进度条高效十倍。
返回列表