立创EDA开源项目:基于全志T113-S3与STM32+ESP8266的无线串口调试器设计与实现

📅 发布时间:2026/7/17 19:30:03 👁️ 浏览次数:
立创EDA开源项目:基于全志T113-S3与STM32+ESP8266的无线串口调试器设计与实现
立创EDA开源项目基于全志T113-S3与STM32ESP8266的无线串口调试器设计与实现大家好最近在做一个需要远程监控设备串口数据的项目传统的串口调试助手必须连着电脑很不方便。于是我琢磨着能不能做一个无线的、带图形界面的串口调试器。经过一番折腾终于用全志T113-S3、STM32和ESP8266这三兄弟搭出来一个能用的系统。今天我就把这个开源项目的完整实现过程从硬件选型到软件烧录手把手分享给大家。这个项目可以分成“上位机”和“下位机”两部分来理解。上位机就是那个带屏幕的“大脑”它基于全志T113-S3这颗高性能的ARM Cortex-A7芯片运行Linux系统用Qt写了一个图形界面负责显示数据和绘制波形。下位机则是一个小巧的“数据采集转发站”由STM32负责采集多个串口的数据然后通过ESP8266这个Wi-Fi模块把数据用UDP协议无线发送给上位机。这样一来你就能在远处通过一个带屏幕的设备实时查看和分析多个串口的数据了非常方便。下面咱们就分步拆解看看这个系统是怎么搭起来的。1. 硬件设计与选型三兄弟各司其职做嵌入式项目硬件是基础。咱们这个系统用了三块核心芯片它们分工明确共同完成任务。1.1 上位机核心全志T113-S3开发板上位机是整个系统的显示和控制中心我选择了全志T113-S3作为主控。这是一颗双核Cortex-A7的处理器性能足够跑Linux系统和图形界面。围绕它我设计了以下几个关键部分电源管理说实话我对全志原厂的电源管理芯片PMIC不太熟为了图省事和保证稳定直接用了IP5306这颗常见的锂电池充放电管理芯片。整个上位机由一节4.2V的锂电池供电IP5306负责充电、升压和电量显示非常方便。调试串口开发板运行时我们需要通过串口查看Linux的启动日志和调试信息。T113-S3的串口3输出了TTL电平的信号我通过CH343P这颗USB转串口芯片把它转换成电脑能识别的USB信号。这样用一根USB线就能调试了。当然你也可以不焊CH343P直接用外部的TTL转USB工具连接电脑。屏幕与触摸为了有好的交互体验我选用了一块10英寸的RGB接口屏幕支持RGB565格式当然也兼容RGB666。触摸芯片用的是GT911驱动成熟在Linux下配置起来也相对容易。无线连接Wi-Fi模块我选了RTL8723DS这是一款支持Wi-Fi和蓝牙的双模芯片。目前项目只用到了它的Wi-Fi功能来接收下位机数据后续如果想增加蓝牙接收数据的功能直接启用蓝牙模块就行了硬件上不用改动。1.2 下位机核心STM32 ESP8266组合下位机的任务是采集数据并无线发送对实时性有要求但对图形界面没要求。因此我用了经典的“MCUWi-Fi模组”组合。主控MCU我选择了STM32F103RET6。选它主要是因为它的串口资源丰富有足足5个。我的设计是串口1到串口4分别连接四路需要监控的外部设备进行数据采集串口5则专门用来和ESP8266通信把打包好的数据发给它。无线模组ESP8266老朋友了性价比之王。它通过串口接收STM32发来的数据然后通过Wi-Fi以UDP协议发送给上位机。UDP协议简单高效适合这种实时数据流。状态显示为了能直观看到下位机的工作状态比如是否联网、哪个串口有数据我加了一块1.8寸128*160分辨率的SPI接口屏幕驱动芯片是ST7735用STM32的SPI口驱动显示点基本信息足够了。硬件选型和连接思路就是这样。简单总结就是T113-S3负责“思考”和“显示”STM32负责“采集”ESP8266负责“传送”。2. 软件开发环境搭建磨刀不误砍柴工硬件准备好了接下来就是给上位机的“大脑”安装系统。这个过程需要在Ubuntu这类Linux系统下完成主要是编译三样东西引导程序Awboot、Linux内核Kernel和根文件系统Buildroot。2.1 准备源码和交叉编译器首先把需要的源代码和工具都下载到本地。我建议新建一个专门的目录比如t113_project所有东西都放里面。# 在你的项目目录下结构最终会是这样的 # |—— arm-none-linux-gnueabihf # 交叉编译器 # |—— awboot # 引导程序 # |—— linux-kernel-t113 # Linux内核 # |—— buildroot # 根文件系统 # |—— drivers # 存放额外驱动源码如果需要 # 1. 下载并安装交叉编译器这是能在电脑上编译出T113能运行程序的工具链 wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu/12.3.rel1/binrel/arm-gnu-toolchain-12.3.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz tar -xf arm-gnu-toolchain-12.3.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz mv arm-gnu-toolchain-12.3.rel1-x86_64-arm-none-linux-gnueabihf arm-none-linux-gnueabihf # 2. 把交叉编译器的路径添加到系统环境变量这样在任何目录都能使用它 cd arm-none-linux-gnueabihf/bin pwd # 复制这个命令输出的完整路径比如 /home/yourname/t113_project/arm-none-linux-gnueabihf/bin vim ~/.bashrc # 在文件末尾添加一行请替换成你刚才复制的路径 # export PATH$PATH:/home/yourname/t113_project/arm-none-linux-gnueabihf/bin # 保存退出vim按ESC输入:wq回车 source ~/.bashrc # 使配置生效 # 3. 验证编译器是否安装成功 arm-none-linux-gnueabihf-gcc -v # 如果输出版本信息就说明成功了注意网络下载有时会比较慢如果wget失败可以多试几次或者用其他下载工具先把压缩包下好。2.2 编译与烧录引导程序AwbootAwboot相当于电脑的BIOS负责最基础的硬件初始化并加载Linux内核。# 1. 下载Awboot源码 git clone https://gitee.com/huerli/awboot.git # 2. 编译Awboot cd awboot/tools gcc mksunxi.c -o mksunxi # 编译一个必要的工具 cd .. # 编辑根目录下的Makefile文件确保指定了正确的交叉编译器 # 找到 CROSS_COMPILE? 这一行修改为 # CROSS_COMPILE? arm-none-linux-gnueabihf- make -j4 # 开始编译-j4表示用4个线程并行加快速度编译成功后会在当前目录生成一个awboot-boot.bin文件这就是我们要的引导程序。接下来把它烧录到SD卡。请务必确认你的SD卡设备号如/dev/sdb操作错误会清空你的硬盘# 1. 将SD卡插入电脑使用lsblk或dmesg | tail命令查看新增的设备假设是/dev/sdc # 2. 如果SD卡有多个分区先删除旧分区谨慎操作 sudo fdisk /dev/sdc # 在fdisk交互界面里依次输入d (删除分区)如果有多个分区就多输入几次d直到全部删除。 # 最后输入w (保存并退出) # 3. 烧录Awboot到SD卡 sudo dd ifawboot-boot-sd.bin of/dev/sdc bs1024 seek8 sync # 等待数据完全写入烧录完成后把SD卡插到T113开发板上连接串口调试工具到串口3上电。如果看到类似下面的输出说明Awboot启动成功因为还没烧内核所以会卡住或报错[I] AWBoot r6166 starting... [I] SMHC: sdhci0 controller v50310 initialized ... [E] FATFS: mount error: 13如果没输出检查串口线是否完好、TX/RX线是否接反、电脑串口软件波特率是否设置为115200等。2.3 编译与烧录Linux内核内核是操作系统的核心驱动硬件、管理进程都靠它。# 1. 下载内核源码这个是我适配了T113和相关驱动的版本 git clone https://gitee.com/huerli/linux-kernel-t113.git # 2. 配置和编译内核 cd linux-kernel-t113 # 先清理一下 make clean # 导入针对T113的默认配置这个配置已经包含了RTL8723DS Wi-Fi、RGB屏幕、GT911触摸的驱动 make allwinner_t113_defconfig # 开始编译 make -j8编译完成后在arch/arm/boot/目录下会生成zImage内核镜像在arch/arm/boot/dts/目录下会生成sun8i-t113-mangopi-mq-dual.dtb设备树文件描述硬件信息。现在需要把内核烧录到SD卡。我们需要在SD卡上创建一个FAT格式的分区来存放它们。# 1. 对SD卡进行分区接续之前烧录了Awboot的SD卡操作 sudo fdisk /dev/sdc # 命令序列n (新建分区) - p (主分区) - 1 (分区号) - 起始扇区输入 65536 - 结束扇区输入 51200 (即分配约25MB空间) # 最后输入 w 保存。 # 2. 格式化这个新分区为FAT32 sudo mkfs.fat /dev/sdc1 # 3. 挂载并复制内核文件 sudo mount /dev/sdc1 /mnt/boot/ # 确保/mnt/boot目录存在 sudo cp arch/arm/boot/dts/sun8i-t113-mangopi-mq-dual.dtb arch/arm/boot/zImage /mnt/boot/ sudo umount /mnt/boot2.4 编译与烧录根文件系统Buildroot根文件系统包含了Linux启动后所需要的所有基础命令、库文件和我们的应用程序。# 1. 下载Buildroot源码 git clone https://gitee.com/huerli/t113-buildroot.git # 2. 配置和编译这个过程会下载很多软件包耗时较长网络不好可能失败可重试 cd t113-buildroot make clean make allwinner_t113_defconfig make -j8编译完成后我们需要在SD卡上创建第二个分区ext4格式来存放根文件系统。# 1. 继续对SD卡分区将剩余空间全部分给第二个分区 sudo fdisk /dev/sdc # 命令序列n - p - 2 - 直接回车使用默认起始扇区 - 直接回车使用所有剩余空间 - w # 2. 格式化第二个分区为ext4 sudo mkfs.ext4 /dev/sdc2 # 3. 挂载分区并将编译好的根文件系统解压进去 sudo mount /dev/sdc2 /mnt/rootfs/ sudo tar -xf output/images/rootfs.tar -C /mnt/rootfs/接下来需要配置Wi-Fi让开发板一启动就能自动连接网络。# 1. 拷贝Wi-Fi自动连接脚本和配置文件 sudo cp ./board/allwinner/rootfs/etc/init.d/S45wifi /mnt/rootfs/etc/init.d/ sudo cp ./board/allwinner/rootfs/etc/profile.d/PS1.sh /mnt/rootfs/etc/profile.d/ # 2. 编辑Wi-Fi配置文件填入你的Wi-Fi名称和密码 sudo vim /mnt/rootfs/etc/wpa_supplicant.conf # 文件内容类似这样 # ctrl_interface/var/run/wpa_supplicant # ap_scan1 # network{ # ssid你的Wi-Fi名称 # psk你的Wi-Fi密码 # } # 3. 安装内核模块到根文件系统确保驱动正常工作 cd ../linux-kernel-t113 # 回到内核目录 sudo make INSTALL_MOD_PATH/mnt/rootfs modules_install # 4. 卸载分区 sync sudo umount /mnt/rootfs至此SD卡里已经包含了完整的系统Awboot、Linux内核和根文件系统。将SD卡插入T113开发板上电。如果一切顺利你将看到Linux启动日志并且最后系统会自动连接到你配置的Wi-Fi。3. 上位机Qt应用程序开发与部署系统跑起来了现在该把我们自己写的串口助手软件放上去了。这个软件是用Qt写的需要在电脑上交叉编译好再放到开发板上运行。3.1 配置Qt交叉编译环境如果你想在电脑上的Qt Creator里直接编译出T113能运行的程序需要配置一下交叉编译工具链。获取qmake在Buildroot的输出目录里找到qmake。路径通常是t113-buildroot/output/host/bin/qmake。配置Qt Creator打开Qt Creator进入工具-选项-Kits。在“编译器”页签手动添加C和C的交叉编译器指向arm-none-linux-gnueabihf-gcc和arm-none-linux-gnueabihf-g。在“Qt版本”页签添加Qt版本选择从Buildroot获取的qmake。在“构建套件(Kit)”页签新建一个套件选择刚才添加的编译器、Qt版本设备类型选择“通用Linux设备”。编译项目用Qt Creator打开串口助手源码项目serial-udp-com选择刚才配置好的套件进行编译就会生成一个可以在T113上运行的Qt可执行文件。3.2 运行串口助手将编译好的可执行文件以及它依赖的Qt库如果静态编译则不需要拷贝到开发板的根文件系统中。可以通过SCP命令在网络上传送。# 在电脑终端执行假设开发板IP是192.168.1.100 scp your_serial_app root192.168.1.100:/root/然后通过串口或SSH登录到开发板运行它cd /root ./your_serial_app为了让程序开机自启动可以将其命令添加到/etc/rc.local文件在exit 0之前或创建一个systemd服务。4. 下位机程序解析上位机准备好了下位机也需要编程。下位机的逻辑相对清晰STM32程序初始化5个串口。串口1-4设置为数据接收模式不断监听外部设备发来的数据。一旦收到数据就根据预设的协议进行组包比如加上时间戳、来源串口号等。然后通过串口5将打包好的数据发送给ESP8266。ESP8266程序它工作在Station模式连接和上位机相同的Wi-Fi网络。通过串口接收STM32发来的数据包然后简单地将这些数据通过UDP协议发送到上位机指定的IP地址和端口。两边的源码都已经开源你可以直接下载、阅读和修改STM32源码https://gitee.com/huerli/harvester.gitESP8266源码https://gitee.com/huerli/esp-harvester.git上位机Qt串口助手源码https://gitee.com/huerli/serial-udp-com.git5. 联调与使用当上位机的Linux系统运行起来、Qt程序启动下位机的STM32和ESP8266也烧录好程序并上电后整个系统就可以工作了。确保上位机和下位机ESP8266连接在同一个局域网Wi-Fi下。在上位机的Qt串口助手界面中设置好UDP监听的端口号需要与ESP8266程序中设定的目标端口一致。将需要调试的外部设备连接到下位机STM32的串口1-4。此时外部设备发出的串口数据会经过STM32采集、ESP8266无线发送最终显示在上位机的Qt界面中。Qt程序可以实现数据显示、保存以及波形绘制等功能。这个项目目前实现了核心功能界面可能还不够美观但整个从硬件到软件、从底层驱动到上层应用的链路已经打通。你可以基于这个框架去添加更多功能比如增加蓝牙传输、优化数据协议、美化UI界面等。希望这个详细的实现过程能给你带来一些启发和帮助。