网站设计理论wordpress 建的网站
网站设计理论,wordpress 建的网站,wordpress返回最新文章,礼品网站制作1. 环境准备#xff1a;认识你的T113开发板与调试串口
大家好#xff0c;我是老李#xff0c;一个在嵌入式圈子里摸爬滚打了十多年的老工程师。今天咱们不聊那些虚头巴脑的理论#xff0c;直接上手干点实在的——给一块全新的T113开发板#xff0c;比如市面上常见的小智板…1. 环境准备认识你的T113开发板与调试串口大家好我是老李一个在嵌入式圈子里摸爬滚打了十多年的老工程师。今天咱们不聊那些虚头巴脑的理论直接上手干点实在的——给一块全新的T113开发板比如市面上常见的小智板卡把调试串口给配通。这绝对是拿到新板子后要做的第一件事就像给新电脑装系统一样基础但要是没弄好后面的所有开发工作都无从谈起。调试串口就是我们常说的Console口或者Debug UART。它有多重要呢简单说它就是开发板和你的电脑之间的一座“生命线”。系统上电后U-Boot的启动信息、内核的打印日志、甚至系统启动失败后的错误提示全都得通过这个口子吐出来给你看。要是它不工作你的板子就成了“哑巴”你根本不知道它内部在发生什么是卡在哪儿了还是已经跑飞了。所以配置调试串口是让板子“开口说话”的第一步。这次我们实战的平台是全志的T113芯片这是一颗性价比很高的双核Cortex-A7芯片在工控、物联网网关等领域用得很广。我手边这块是小智的T113开发板软件环境用的是原厂提供的Tina5.0 SDK基于Buildroot。无论你用的是哪家的板子只要核心是T113今天这套配置流程基本都是通用的。我们的目标很明确让UART3对应PB6和PB7这两个引脚成为系统默认的调试控制台从U-Boot阶段到Linux内核阶段所有的日志都能稳定、清晰地打印出来。在开始动手前你需要准备好基本的开发环境一台Linux主机Ubuntu 20.04或22.04比较推荐已经拉取并编译过Tina SDK有一根USB转TTL串口线CH340、CP2102这些芯片的都行以及板子的原理图PDF文档。别怕整个过程我会一步步拆开讲就算你是刚接触嵌入式Linux的新手跟着做也能搞定。2. 第一步读懂原理图找准“命脉”引脚很多新手朋友一上来就急着改代码、改配置结果折腾半天发现引脚配错了事倍功半。我的经验是硬件开发“原理图先行”。这就像打仗前先看地图搞清楚敌人在哪儿。对于调试串口配置原理图会明确告诉我们两个关键信息用的是哪个UART控制器以及这个UART对应芯片的哪两个物理引脚。打开小智T113板卡的原理图通常文件名里带“SCH”的就是我们需要找到标注了“DEBUG_UART”、“CONSOLE”或者“UART3”的网络标签。以我手头这份原理图为例很快就能找到相关部分。图上清晰地画着调试串口使用的是芯片的UART3这个功能模块具体连接到芯片的PB6和PB7这两个引脚上。PB6通常用作UART3的TX发送端数据从芯片发往电脑PB7用作RX接收端数据从电脑发往芯片。你的USB转TTL串口线就需要将它的RX线接到板子的PB6TX上TX线接到板子的PB7RX上地线GND对接。这里千万注意TX和RX要交叉连接这是串口通信的基本规则。为什么是PB6和PB7这不是随便选的。在全志T113的芯片手册里每个引脚都是“多面手”专业术语叫引脚复用Pin Multiplexing, 简称Pinmux。一个物理引脚可以通过内部配置扮演GPIO、UART、I2C、SPI等不同角色。PB6和PB7这两个引脚其复用功能7Function 7就是UART3的TX和RX。我们的全部配置工作本质上就是告诉芯片“请把PB6和PB7这两个引脚从默认的普通GPIO模式切换到UART3功能模式上来。”所以看完原理图我们得到了黄金信息目标UART3 引脚PB6 (TX) PB7 (RX)。把这个记在小本本上或者用注释写在配置文件中接下来的所有操作都将围绕这个核心信息展开。如果原理图上看不到明确的调试串口你也可以查阅板卡供应商提供的用户手册或快速入门指南里面一般会标明。3. 配置U-Boot让引导程序先“开口”系统上电后第一个跑起来的程序是U-Boot相当于电脑的BIOS。如果U-Boot阶段的调试串口没配好那你连“Press any key to stop autoboot”这样的提示都看不到更别说打断启动进入命令行去烧写系统了。所以我们的配置之旅先从U-Boot开始。在Tina SDK中U-Boot的引脚复用配置集中在一个关键文件里sys_config.fex。这个文件位于你的SDK目录下具体路径通常像这样device/config/chips/t113/configs/你的板子方案名/sys_config.fex。比如我的小智板卡路径就是device/config/chips/t113/configs/xiaozhi/sys_config.fex。用你喜欢的编辑器比如vi或nano打开这个文件然后搜索“uart”或者直接翻到有关UART配置的部分。你可能会看到很多以port:开头的行这些就是配置具体引脚功能的。我们需要找到对应PB6和PB7的配置行。它们可能长这样port:PB0600defaultdefault port:PB0700defaultdefault这里的配置格式port:PB06muxpulldrv_leveldata需要解释一下PB06引脚名称。mux复用功能选择数字0-7。我们需要查T113的用户手册找到UART3对应的复用编号。根据手册UART3_TX和UART3_RX在PB6和PB7上的复用功能号是7。pull上下拉电阻配置。0表示禁止上下拉1表示上拉2表示下拉。对于串口引脚通常配置为1上拉或者保持default都可以上拉有助于稳定空闲状态的电平。drv_level驱动电流强度一般保持default即可。data初始输出电平一般保持default。所以我们要把PB6和PB7的配置修改为UART3功能port:PB0671defaultdefault port:PB0771defaultdefault修改完成后保存文件。但这还没完sys_config.fex是一个对人类友好的文本配置文件U-Boot真正读取的是它编译后生成的二进制文件sys_config.bin。因此修改完文本配置后必须重新编译U-Boot让改动生效。进入SDK根目录执行source build/envsetup.sh lunch # 选择你对应的方案例如 t113_xiaozhi-tina make uboot编译过程会调用脚本自动将sys_config.fex转换并打包进U-Boot镜像。编译成功后将新的U-Boot烧写到板子上具体烧写方式取决于你的板子可能是通过全志的PhoenixSuit工具或者SD卡启动更新。重新上电如果一切顺利你应该能在串口终端软件如MobaXterm、PuTTY、minicom里看到U-Boot的启动日志滚滚而来了这就证明U-Boot阶段的调试串口已经配置成功。4. 配置Linux内核打通内核日志的通道恭喜你U-Boot已经能说话了但系统启动的“重头戏”——Linux内核的启动过程其日志输出是由内核自己管理的。如果内核的设备树Device Tree没有正确配置你可能会发现U-Boot日志打印完后屏幕就一片漆黑内核的日志出不来。这就是我们接下来要解决的问题配置内核的设备树启用UART3驱动并正确映射引脚。在Tina SDK中内核设备树源文件.dts或.dtsi通常位于kernel/linux-版本号/arch/arm/boot/dts/目录下。我们需要找到对应T113芯片和你的板型的设备树文件名字可能类似sun8iw20p1-t113-板型名.dts。设备树的配置主要做两件事启用UART3节点确保UART3这个设备在设备树中是“okay”启用状态。解决引脚冲突确保PB6和PB7这两个引脚没有被其他设备比如某个GPIO按键、LED或另一个外设占用。首先找到UART3的设备节点。在设备树文件中搜索“uart3”或“serial3”。你会找到类似这样的节点uart3 { pinctrl-names default; pinctrl-0 uart3_pins_a; status disabled; };关键参数是status。如果它是disabled说明这个UART被禁用了。我们需要把它改成okayuart3 { pinctrl-names default; pinctrl-0 uart3_pins_a; status okay; };接下来也是最容易踩坑的一步检查引脚冲突。pinctrl-0 uart3_pins_a;这行代码引用了名为uart3_pins_a的引脚配置组。我们需要找到这个组的定义通常在同文件或sun8iw20p1-pinctrl.dtsi这样的公共引脚定义文件中。找到它确认它正确地指向了PB6和PB7uart3_pins_a: uart30 { pins PB6, PB7; function uart3; drive-strength 10; bias-pull-up; };这个定义看起来没问题它指定了PB6和PB7用作uart3功能并且配置了上拉bias-pull-up。但是问题往往不在这里。我们需要在整个设备树文件中搜索“PB6”和“PB7”看看它们是否还在其他地方被定义了。例如你可能发现PB6和PB7被另一个节点占用了pio { some_device_pins: some_device0 { pins PB6, PB7; function gpio_in; }; }; some_device { pinctrl-names default; pinctrl-0 some_device_pins; status okay; };如果存在这样的冲突内核在初始化时就会困惑PB6和PB7到底该给谁用结果往往是后初始化的设备失败或者直接导致串口无法工作。解决冲突的原则是“一山不容二虎”一个引脚在同一时间只能有一个功能。既然我们要用UART3就必须把其他占用PB6/PB7的设备节点禁用掉。将上面例子中some_device节点的status改为disabled或者直接注释/删除相关的pinctrl配置。修改完设备树后同样需要重新编译内核make kernel编译完成后将新的系统镜像通常包含内核和根文件系统打包并烧写到板子上。这次上电你应该能看到一个完整的启动流程U-Boot日志之后紧接着是Linux内核解压、初始化硬件、加载驱动、挂载根文件系统等一系列信息最后成功进入登录提示符。至此从U-Boot到内核的完整调试串口通道就彻底打通了。5. 实战测试与深度排错指南配置完成重新烧写系统激动人心也可能是揪心的测试时刻到了。打开你的串口终端软件我习惯用minicom或者picocom确保端口号、波特率T113通常是115200、数据位8、停止位1、校验位无都设置正确。给板子上电。理想情况从第一行U-Boot信息开始到内核启动完毕日志流畅输出最后出现rootTinaLinux:/#这样的登录提示。这证明你一次成功但现实往往更骨感下面是我和同事们常遇到的几种“坑”以及排查方法现象一完全没输出一片空白检查硬件连接这是第一嫌疑。确认USB转TTL线的TX/RX是否与板子交叉连接GND是否接好。用万用表量一下板子串口引脚电压TX引脚在空闲时应该是高电平3.3V左右。检查终端软件确认选择的串口端口号是对的比如/dev/ttyUSB0波特率等参数无误。可以尝试拔插USB线看看系统是否识别出新串口。确认U-Boot配置生效检查编译时是否真的用了你修改的sys_config.fex。可以查看编译日志或者直接去out目录下找到生成的sys_config.bin用unpack工具如果有反解析看看PB6/PB7的配置是否正确写入了。现象二U-Boot有输出但内核没输出这是典型的设备树配置问题。首先再次确认内核设备树中uart3节点的status okay。重点排查引脚冲突使用grep -r PB[67] kernel/linux-版本号/arch/arm/boot/dts/命令在所有设备树文件中搜索PB6/PB7仔细检查是否有其他节点也引用了它们。这是最常见的坑。检查内核配置执行make kernel_menuconfig进入内核配置界面。确保Device Drivers - Character devices - Serial drivers - Allwinner SoC serial port support被选中并且其子项里确认UART3支持是启用的通常默认是编入内核的。现象三输出乱码几乎可以肯定是波特率不匹配。确认你的终端软件波特率设置与系统配置一致。T113平台U-Boot和内核默认的调试串口波特率通常是115200。如果乱码可以尝试其他常见波特率如9600、57600、115200、921600等。检查时钟源极少数情况下如果芯片的APB总线时钟配置异常会导致串口时钟不准从而产生乱码。这通常需要检查U-Boot中关于时钟的初始化代码但对于标准SDK一般不会出问题。现象四输出一段后停止或时有时无可能是电源问题板子供电不足在大电流负载时导致系统不稳定。尝试使用额定电流更大的电源适配器。可能是驱动加载问题内核在初始化某个依赖的驱动如时钟、pinctrl时失败导致后续包括串口在内的设备初始化卡住。可以尝试在内核命令行中添加loglevel8或ignore_loglevel参数让内核打印出更早期的调试信息看看卡在哪儿。修改U-Boot环境变量中的bootargs即可。为了更系统地对比问题现象和解决思路我整理了一个简单的排查表问题现象最可能的原因排查步骤按顺序完全无输出1. 硬件连接错误2. 串口软件配置错误3. U-Boot引脚复用未生效1. 检查TX/RX交叉连接测量引脚电压2. 核对端口号、波特率(115200)3. 确认sys_config.fex修改并重新编译烧写仅U-Boot有输出1. 内核设备树UART3未启用2. 设备树引脚冲突3. 内核驱动未编译1. 检查设备树uart3节点status是否为okay2. 全局搜索PB6/PB7排除冲突3. 检查kernel_menuconfig中串口驱动配置输出乱码1. 波特率不匹配2. 时钟源异常罕见1. 尝试切换终端软件波特率(115200, 921600等)2. 检查U-Boot时钟初始化代码输出不稳定/中断1. 电源供电不足2. 系统崩溃或死锁1. 更换更大功率电源2. 通过JTAG或添加早期打印调试6. 进阶技巧让调试更得心应手基础功能通了咱们再来点“锦上添花”的配置让你的调试体验更上一层楼。自定义内核启动参数有时候默认的内核日志级别可能过滤掉了一些有用的调试信息。我们可以在U-Boot中修改传递给内核的启动参数bootargs。进入U-Boot命令行在启动时按任意键打断自动启动设置setenv bootargs consolettyS3,115200 loglevel8 saveenvconsolettyS3,115200这里明确指定控制台设备为ttyS3在Linux内核中UART3通常对应ttyS3波特率115200。这能确保内核信息定向到我们的串口。loglevel8将内核日志打印级别设为最高0-88为最详细这样所有内核信息包括很多调试信息都会打印出来对排查深层次问题非常有帮助。saveenv保存环境变量到存储介质下次启动依然生效。配置稳定可靠的串口终端在Linux主机上我推荐使用picocom或minicom。以picocom为例安装后一个简单的连接命令是picocom -b 115200 /dev/ttyUSB0如果经常使用可以写一个简单的脚本或设置别名alias来快速连接。避免使用图形化工具时不小心关闭窗口导致连接终止在终端里运行这些命令行工具更稳定。处理系统启动后的串口登录默认情况下Tina系统可能不会在调试串口上自动启动登录shellgetty。如果你想在系统完全启动后还能通过这个串口登录系统需要修改根文件系统的配置。在Tina SDK中通常是修改target/allwinner/方案名/base-files/etc/inittab文件添加一行ttyS3::respawn:/sbin/getty -L ttyS3 115200 vt100这表示在ttyS3即UART3上启动一个getty进程用于管理登录。修改后需要重新打包和烧写根文件系统。利用串口进行系统调试串口不仅仅是看日志。当系统启动后你可以通过它进入Linux命令行执行各种命令查看进程、内存、加载驱动这比网络调试在某些阶段比如网络还没起来时更直接。结合内核的kgdboc功能甚至可以通过串口进行内核级别的源码调试这对于分析内核崩溃Oops或死机问题至关重要。配置调试串口的过程本质上是对嵌入式系统硬件资源管理和软件配置的一次深刻理解。它串联起了原理图、芯片数据手册、U-Boot、内核设备树等多个层面的知识。成功配置的那一刻看到日志如约而至那种“掌控感”是非常美妙的。希望这篇详细的实战指南能帮你少走弯路快速让你的T113板子“开口说话”为后续更复杂的开发工作铺平道路。如果在实际操作中遇到新的问题不妨多查阅芯片的官方手册多在社区里和同行交流嵌入式开发的乐趣就在这不断的探索和解决问题之中。