十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

嵌入式开发板使用全流程:从选型、交叉编译到设备树与串口调试

嵌入式开发板使用全流程:从选型、交叉编译到设备树与串口调试 做嵌入式开发这几年我经手过的开发板少说也有二十来块。从几十块钱拿来学4G通信的合宙Air202 S6到正点原子阿尔法IMX6ULL再到带FPGA的AXU15EGP系列每一块板子到手之后我基本都会按同一套流程走一遍选型、开箱、看原理图、搭环境、烧录、调外设、排错。这套流程走顺了换新板子也能很快上手。今天就把这条完整的开发板使用流程拆开聊一聊适合刚拿到第一块板子的新手也适合被各种奇怪问题卡住的老手参考。整篇会覆盖硬件连接、交叉编译、系统挂载、设备树、通信调试和问题排查照着走一遍多数板子都能在半天之内跑起来。1. 拿到开发板之前先想清楚你要干什么1.1 板卡选型不是越贵越好很多新手买开发板第一反应是“贵的肯定好”但实际用过之后会发现选型的关键不是价格是你要做的场景和手上已有的工具链。比如你只是想学串口、GPIO、低功耗通信那合宙Air202 S6这类4G Cat.1模组开发板绰绰有余你要做图像识别、跑Linux系统那正点原子IMX6ULL、粤嵌GEC6818、T113开发板这类嵌入式Linux板卡更合适要是碰上了FPGAARM异构的需求就得看Zynq7100或者AXU15EGP系列。我自己踩过的最大的坑就是高估了板卡的性能需求低估了资料成熟度的重要性。复旦微MFQL20开发板这种国产化平台芯片本身没问题但如果你手头没有任何可参考的教程遇到问题连问的地方都少学习成本会直线上升。所以选型的优先级顺序应该是资料成熟度 社区活跃度 芯片性能 价格。1.2 常见板卡定位与上手难度对照我整理了一张自己对常见板卡的定位表不一定完全权威但可以帮助你在买之前快速判断“这块板子到底适不适合我”。板卡类型代表型号典型应用场景上手难度资料成熟度通信模组类合宙Air202 S6Cat.1 4G联网、MQTT上报、定位低高WiFi/摄像头类ESP32-CAM、ESP32-S3图像采集、物联网节点、AI语音中低高WiFi模块类ESP8266与STM32等主控联调、透传中低高嵌入式LinuxIMX6ULL、T113、RK3506、STM32MP157、GEC6818、小智开发板驱动开发、系统移植、工业控制中中高高性能/异构计算Zynq7100、AXU15EGP、Radxa Rock 5B、复旦微MFQL20FPGAARM异构、边缘计算、国产化替代高中Radxa Rock 5B这种板子的处理器定位很高跑桌面级Ubuntu也没问题适合当小主机、跑容器应用。如果你要做视频编解码、跑较大的模型Rock 5B值得考虑但如果只做点灯和串口那它大部分算力其实都是浪费的。选择开发板之前把“最终要交付什么”写下来再倒推选型比对着参数比来比去靠谱得多。2. 开箱后的第一件事别急着上电2.1 线序、排针和原理图很多人拿到开发板第一件事就是插USB线然后发现电脑没反应、屏幕不亮就开始到处问。我自己也干过这种蠢事。正确做法是先找原理图再碰硬件。比如合宙Air202 S6开发板板子上的26pin排针引出了电源、地、UART、SIM卡和GPIO等信号丝印非常密不戴放大镜很容易看错。你如果直接把杜邦线插上正负极一接反板子很可能当场烧掉。正确姿势是把官方规格书里的管脚定义表下载下来对照板子上的丝印先在纸上把排针编号标出来。像正点原子IMX6ULL开发板虽然引脚标注比较清楚但不同的排针接口对应的UART、I2C、SPI是不同的不查原理图想当然去接大概率没输出。ESP32开发板的原理图也要重点看电源网络和GPIO复用关系尤其是同一个引脚同时接了按键、LED和外部接口的情况必须确认引脚复用是否冲突。读原理图这件事是开发板使用流程里最容易被新手忽略的一步。我的建议是拿到板子先别上电花一个小时把电源树过一遍把串口、下载模式、启动模式相关的引脚在原理图里高亮出来。2.2 电源与串口最基礎也最影响体验开发板调试期间遇到最多的问题基本都是电源和串口引起的。ESP32-CAM是个典型例子它板载的3.3V稳压器输入电流有限如果你只有一个普通USB口供电拍照瞬间电流拉高板子就会重启。实测下来用5V 2A以上的电源单独给ESP32-CAM供电才能稳定跑摄像头应用。串口方面不管是什么板卡调试串口几乎都是TXD、RXD、GND三根线用USB转TTL工具连接时必须记得TX交叉接RX、RX交叉接TXGND共地。以IMX6ULL为例默认调试串口是UART1波特率通常为115200数据位8停止位1无校验。这里给出一个串口连接的最小检查清单USB转TTL模块的TXD接开发板的RXDRXD接开发板的TXDGND对GND。串口工具比如MobaXterm、minicom、PuTTY选择对应的COM口。波特率先按115200试如果全是乱码再试9600、57600、1500000等常见值。如果USB转TTL模块和开发板各自供电建议先共地再接信号线。2.3 无线板卡的管理地址WiFi初始化之后去哪里访问像ESP32-CAM、ESP32-S3这类自带WiFi的板卡很多都有默认的管理地址也就是板子自己开热点后的IP。ESP32-CAM的典型流程是烧录程序后板子启动一个名字类似“ESP32-CAM”的AP热点手机或电脑连上这个热点在浏览器里打开192.168.4.1就能进入摄像头预览页。这个地址在官方示例里基本是固定的但如果你改了NetworkServer配置就得看串口日志里打印的实际IP。如果板子配置成了STA模式连到路由器上管理IP就会由路由器分配这时候必须通过串口日志查看。我自己调ESP32-CAM时最常用的办法就是一开始在代码里固定一个静态IP比如192.168.1.99这样既能避免每次查IP又能减少WiFi连接不稳定的干扰。需要留意的是这类板卡的文件系统和配置参数很多保存在Flash里重新烧录程序不一定会清掉旧配置遇到连不上热点的情况先插上串口看日志不要直接怀疑硬件坏了。3. 搭建开发环境交叉编译、挂载与终端3.1 开发机与交叉工具链我强烈建议所有做嵌入式Linux开发的朋友主机直接装Ubuntu或者至少装一个Ubuntu虚拟机。开发板挂载Ubuntu这个需求本质上就是希望用主机上的交叉编译工具链来编译内核、设备树、驱动模块然后把编译产物放到开发板上运行。比如IMX6ULL属于ARM Cortex-A7架构用PC上的gcc编译出来的程序是不能直接跑的必须用arm-linux-gnueabihf-gcc这类交叉编译器。拿正点原子阿尔法IMX6ULL开发板举例最基本的编译流程是sudo apt install gcc-arm-linux-gnueabihf libncurses5-dev bison flex export ARCHarm export CROSS_COMPILEarm-linux-gnueabihf- make imx6ull_alientek_emmc_defconfig make zImage -j4 make dtbs编译完成后在arch/arm/boot目录下会生成zImage在arch/arm/boot/dts目录下会生成imx6ull-alientek-emmc.dtb。很多教程会让你直接下载别人编译好的镜像但自己编译一遍能帮你理解内核、设备树和根文件系统之间的关系排查问题时也更有底。3.2 开发板怎么挂载 UbuntuNFS 方式详解开发板挂载Ubuntu最常见的场景是让开发板通过网络文件系统NFS直接运行主机上的rootfs。也就是说根文件系统不在开发板的SD卡或EMMC里而是放在Ubuntu主机的某个目录下开发板启动时通过NFS去读取。这样做的好处是你在主机上改的代码能立即在开发板上生效不用反复烧写存储介质。我自己调驱动时一直用这种方式效率比每次打包镜像高很多。配置步骤大概是这样的在Ubuntu主机上安装NFS服务sudo apt install nfs-kernel-server编辑/etc/exports添加允许挂载的目录和权限/opt/nfsroot *(rw,sync,no_root_squash,no_subtree_check)重启NFS服务sudo systemctl restart nfs-kernel-server在开发板U-Boot里设置启动参数让内核挂载NFS根文件系统。常见配置如下setenv bootargs consolettyS0,115200 root/dev/nfs nfsroot192.168.1.100:/opt/nfsroot,tcp rw ip192.168.1.50:192.168.1.100::255.255.255.0::eth0:off saveenv这里的192.168.1.100是Ubuntu主机IP192.168.1.50是分配给开发板的IP。开发板和主机要在同一网段并且能互相ping通。挂载成功后你在主机/opt/nfsroot里放一个测试程序开发板上直接就能执行调试体验非常好。3.3 串口终端与编码设置MobaXterm 正常、屏幕终端乱码的原因用串口调试的时候很多朋友会碰到一个典型问题同一块IMX6ULL开发板接到电脑上用MobaXterm串口连上去中文显示正常但把开发板接到自带的屏幕终端上中文就变成乱码。问题通常出在两个地方字符编码和字体文件。MobaXterm这类终端软件默认或者手动设置了UTF-8编码和系统locale一致所以显示正常。但开发板本地屏幕终端跑的是另一个程序或服务它没有加载中文字体或者locale环境变量不对就会把UTF-8编码的中文按ASCII或其它编码显示成乱码。可以先在终端里执行export LANGzh_CN.UTF-8 export LC_ALLzh_CN.UTF-8如果还不行就检查系统里有没有安装中文字体比如fonts-wqy-zenhei。嵌入式Linux根文件系统为了精简经常把中文字体裁掉了这种情况下只能手动往rootfs里放字体文件。我自己处理过一个粤嵌GEC6818开发板的类似问题最终原因是rootfs里没有中文字体和串口软件完全无关。所以排查的方向别一直盯着终端也要检查开发板本地的locale和字体。4. 烧录固件与启动系统4.1 镜像烧录工具选型不同芯片平台的烧录方式差异很大。IMX6ULL这类NXP芯片最常见的是用SD卡启动把编译好的zImage、设备树、rootfs复制到SD卡上拨码开关拨到SD卡启动位置即可。也可以用USB烧录工具把镜像烧写到EMMC。ESP32系列则是用esptool.py工具或者Arduino IDE自动烧录关键点是在进入下载模式时把IO0引脚拉低。如果是瑞芯微方案的板卡比如合众恒跃的瑞芯微3506开发板、Radxa Rock 5B通常用瑞芯微官方的RKDevTool在Maskrom模式下烧写整个镜像。操作步骤一般是先安装驱动然后按住板上的Maskrom按键或RECOVERY键再上电USB连接电脑工具识别到设备后加载对应的update.img。这个流程第一次走会有点慌但核心就一句话进入烧录模式再连USB顺序错了就识别不到设备。Zynq7100和AXU15EGP系列的烧录不太一样这类板卡需要把FSBL、bitstream、U-Boot打包成BOOT.BIN再和image.ub一起放到SD卡里启动阶段由BootROM引导。如果只是拿它当ARM开发板用流程和普通Linux板卡差不多一旦涉及PL端逻辑就要先在Vivado里综合出bitstream再打包烧录。烧录工具的选型其实看的是平台拿到板卡先翻官方wiki找到“烧录/Download”那一页按官方工具走别自己在网上随机找工具容易把分区表搞坏。4.2 启动过程与串口日志一切调试的基础开发板上电后的第一手信息全部来自串口日志。以IMX6ULL为例正常启动时串口会依次输出U-Boot版本信息、内核启动日志最后是登录提示符。如果按下电源键后串口什么也不打印优先检查供电、串口接线、波特率以及启动拨码开关状态。U-Boot阶段还可以手动中断启动进入命令行用printenv查看环境变量用setenv临时修改启动参数。我自己的习惯是在正式调试外设前先把启动日志从头到尾读一遍重点关注内核有没有报I2C、MMC、网络相关的错误。启动过程中看到一个warning比如某个regulator初始化失败可能当前不影响跑系统但等你调某个外设时就会突然冒出来。举个例子我调一块T113开发板的以太网时发现日志里出现“mdio_bus: probe fail”查了半天最终发现是设备树里PHY的复位GPIO配置和原理图对不上。所以无论你用的是IMX6ULL、T113、RK3506还是STM32MP157只要看到串口能打印日志就先存档一份再干别的。这个日志在后续排查问题时特别关键。4.3 编译设备树点亮板载 LED流程里的第一个里程碑拿到任何一块Linux开发板我都建议把点亮板载LED作为第一个动手目标。这个任务能验证交叉编译环境、设备树、内核启动、GPIO子系统是否全部正常。以正点原子阿尔法IMX6ULL开发板为例板载LED一般接在某个GPIO上先把板子自带的设备树源文件打开找到LED节点。设备树里控制LED的方式通常是这样led { compatible gpio-leds; pinctrl-names default; pinctrl-0 pinctrl_led; led-gpios gpio5 3 GPIO_ACTIVE_LOW; default-state off; };其中led-gpios指定了LED接在哪个GPIOGPIO_ACTIVE_LOW表示低电平点亮。修改完设备树后重新编译make dtbs然后把新生成的imx6ull-alientek-emmc.dtb拷贝到SD卡的boot分区重启后在/sys/class/leds目录下就能看到对应节点用以下命令控制点亮和熄灭echo 1 /sys/class/leds/led/brightness echo 0 /sys/class/leds/led/brightness这一步跑通后说明你已经掌握了“改设备树-编译-部署-验证”的完整闭环后面的各种外设开发都是在这个基础上扩展的。5. 外设开发从数据手册到实际通信5.1 阅读开发板原理图的方法论很多朋友看到原理图就头大其实开发板原理图不需要全部看懂先学会“按模块找信号”就够了。比如你现在想找一个UART口就在原理图里搜索“UART”“TXD”“RXD”找GPIO就搜引脚编号或网络名。合宙Air202 S6的26pin排针定义就非常适合拿来练手你能在原理图上看到VBAT、GND、UART_TX、UART_RX、SIM_VCC这些网络一一对应到排针位置。Espressif家的ESP32开发板原理图更直观它会把芯片的每个引脚通过网络标签连接到排针或外设芯片上你要做的就是把芯片引脚名和物理位置对应起来。比如ESP32-S3开发板硬件上有一个USB转串口芯片原理图里会标注TX、RX连接到哪两个引脚这就是你调试串口的关键路径。在看原理图过程中我还习惯顺带确认每个引脚的默认上下拉有时候外设读不到数据不是代码问题而是引脚悬空导致电平不确定。读原理图还有一个作用就是确认电平转换。ESP8266开发板与STM32通信时如果STM32是5V电平直接接到ESP8266的3.3V引脚上是有风险的轻则通信异常重则烧毁模块。原理图上如果没看到电平转换芯片就要自己加或者用分压方式处理。5.2 ESP8266 开发板与 STM32 通信实录ESP8266开发板和STM32通信是物联网项目里非常常见的组合也是很多入门者第一个实际联调的项目。整体思路很简单STM32通过串口给ESP8266发AT指令ESP8266负责WiFi连接和数据传输STM32把收到的数据解析出来再执行逻辑。接线方面以STM32F103为例如果板子是5V供电ESP8266模块用3.3V供电信号线上最好加电平转换。实际很多开发板为了省事直接连也能工作但长时间运行不稳定。CH_PDEN引脚必须拉高模块才正常工作这个细节经常有人漏掉。典型AT指令流程如下AT ATCWMODE1 ATCWJAPMyWiFi,password ATCIPMUX0 ATCIPSTARTTCP,192.168.1.100,8080 ATCIPSEND5 hello每条指令结尾都要带回车换行如果把AT指令写进STM32的代码里发送时记得在字符串末尾加上“\r\n”。STM32端最好用串口中断去接收ESP8266的回显不要用delay等待因为网络响应时间不稳定阻塞等待很容易把整个程序卡死。通信数据量大的时候把缓冲区开大一点并且做好帧头帧尾解析。实测下来ESP8266和STM32通信踩坑最多的地方不是AT指令本身而是电源。ESP8266在WiFi发射瞬间电流可能到300mA以上如果STM32开发板的3.3V是由USB口直接提供的通信时很容易掉线或重启。建议给ESP8266单独一个AMS1117-3.3V供电或者用5V输入再稳压输入电压至少给到5V 1A以上。5.3 摄像头、屏幕和 AI 板卡的扩展玩法板卡的基础流程走通后基本就可以玩出花样了。ESP32-CAM是典型的低成本图像采集方案默认固件烧录后可以连上热点进入192.168.4.1页面实时预览摄像头画面。这个板卡有几个细节值得注意天线区域尽量不要被金属外壳遮挡否则WiFi信号衰减非常明显摄像头排线很脆弱插拔时最好断电操作避免把排线座弄坏。如果用的是Radxa Rock 5B这类性能更强的板卡就能直接跑Ubuntu桌面接HDMI屏幕后当一个迷你电脑。我上手测试过Rock 5B基本配置预装系统里自带桌面环境连接键鼠后使用体感接近普通PC跑轻量级开发环境完全没问题。对于这种板卡建议先跑一遍官方的系统安装工具确认固件OK再去折腾GPIO和PCIe外设。它的高性能虽然令人兴奋但散热问题也会随之而来不加散热片长时间高负载跑编译任务温度会明显上升。AI语音方向的小智开发板主打的是语音唤醒和自然语言交互本质上也是一个集成麦克风、喇叭、WiFi的嵌入式Linux设备。如果你已经能按前面几步烧录固件并通过串口查看日志再去看这种AI板卡就会轻松很多无非是多了一个音频链路和对应的识别引擎配置。开发板的玩法可以有很多但底层流程始终是同一套。6. 常见问题与排查技巧实录6.1 上电无打印和乱码问题的系统排查方法嵌入式开发中常遇到的问题其实就那么几类。我把这几年排查的经验整理成了一张速查表遇到问题可以对照着看。现象可能原因排查方法上电完全无输出电源没通、USB转TTL没接对、TX/RX接反、板卡没进入启动模式先量电压确认供电再短接模块TXD和RXD自发自收测试串口工具最后查启动模式串口全是乱码波特率不对、电平不匹配、接地不良逐个试波特率从115200和9600开始检查GND是否共地ESP32进入不了下载模式IO0未拉低、没有手动复位按住IO0按键再按一下复位最后松开IO0屏幕终端中文乱码但MobaXterm正常开发板本地缺少中文字体或locale不对执行export LANGzh_CN.UTF-8安装fonts-wqy-zenheiNFS挂载失败主机NFS服务未启动、网络不通、/etc/exports配置错在开发板上ping主机IP主机执行systemctl status nfs-kernel-server外设驱动probe失败设备树节点和实际硬件引脚不匹配回看原理图核对GPIO复用和引脚编号排查要讲究顺序先串口、再电源、再启动参数、再硬件连接。不要一上来就怀疑芯片坏了嵌入式系统绝大多数“坏掉”的板子最后都发现是某个接线细节没处理好。6.2 烧录失败与启动异常的经验复盘烧录失败是很多新手的噩梦但大部分都能从“模式、驱动、占用”这三个角度解决。先确认开发板是否进入了正确的烧录模式比如RK3506开发板要用Maskrom模式ESP32要拉低IO0IMX6ULL要拨对启动开关。然后确认电脑是否识别到设备CH340、CP2102这类USB转串口芯片需要安装驱动瑞芯微的工具也有自己的驱动步骤。一个很隐蔽的问题是串口被占用。你打开RKDevTool或某些串口助手时它会瞬间占用串口端口导致烧录工具无法访问。解决办法很简单把所有串口调试工具全部关掉再重新插拔USB线让设备重新枚举。还有一次我烧写ESP32-CAM失败卡在“Connecting…”原因是我一边用Arduino IDE烧录一边又开着串口监视器两个软件抢同一个串口。这种低级错误以后我都先关闭调试窗口再烧录。启动异常方面如果烧录成功但系统起不来最快的方法是看串口日志停在哪一步。卡在U-Boot说明boot分区引导文件有问题卡在内核启动早期可能是设备树不匹配卡在挂载根文件系统大概率是rootfs路径或文件系统类型写错了。日志里每一个关键词都可以去搜问题定位基本都能锁定在启动的某一个阶段。6.3 中文显示乱码的根源与一劳永逸的解决办法回到开头提到的IMX6ULL屏幕终端中文乱码问题这个问题的根源永远只有一个显示中文的一方所采用的编码和系统内部存储/传输的编码不一致。MobaXterm默认使用UTF-8编码能正常显示开发板console输出的UTF-8中文但开发板上直接接的屏幕终端程序要么用的locale不是UTF-8要么根文件系统里压根没有中文字体。处理方式分成两步。第一步确认开发板系统里中文字体是否存在很多精简rootfs会裁剪字体可以用命令找一下fc-list | grep -i wqy如果没有输出就需要安装或者拷贝中文字体文件到/usr/share/fonts目录。第二步在开机脚本或终端初始化里显式设置locale和编码把下面的内容添加到/etc/profile或者.bashrc里export LANGzh_CN.UTF-8 export LC_ALLzh_CN.UTF-8设置完以后重启开发板或者重新登录终端再执行中文程序屏幕终端就能正常显示了。如果是U-Boot阶段的菜单中文乱码那属于另一个层面通常和字体存储格式有关需要在U-Boot里配置中文字库支持这种需求一般比较少大多数情况下开发板的U-Boot界面用英文就好。顺手说一下如果只是开发板通过串口和电脑通信首要检查的还是波特率和编码这两个参数都对了中文乱码基本不会再出现。屏幕终端和串口工具显示结果不一致时先别怀疑终端软件重点看开发板本地的字体和locale这是我调过好几块板子之后总结出来的经验。这几年玩开发板我最深的体会是流程比型号重要。每一块板子看起来都不一样但使用流程极其相似先看原理图确认硬件再搭环境编译再烧录启动再通过日志验证最后才写业务逻辑。这个流程能不能走通直接决定了你拿到新板卡后的第一印象。很多朋友问我为什么上手新板子速度这么快其实不是我经验多而是我习惯了拿到板子先按流程走一遍哪怕是个完全陌生的平台也能在半天内定位到核心问题。如果只让我分享一条经验我会说遇到任何奇怪问题先回到串口日志和原理图别瞎猜也别轻易换硬件。开发板这东西绝大多数时候它都没坏只是你还没找到正确的打开方式而已。
返回列表