STM32CubeMx网络配置踩坑全记录:从时钟树到LWIP一网打尽

发布时间:2026/8/31 21:48:26
STM32CubeMx网络配置踩坑全记录:从时钟树到LWIP一网打尽 CubeMx Network configuration Issue 踩坑全记录从时钟树到LWIP一次讲清网络配置的来龙去脉最近调试一块STM32H743的板子需要跑以太网通信用的LAN8720A这颗PHY芯片。结果在CubeMx里配置完网络相关的选项之后生成代码一编译报错一堆烧进去之后ping也ping不通。折腾了整整两天终于把整个CubeMx网络配置的链路彻底捋顺了。这篇就把我踩过的坑、排查的思路、以及最终能稳定跑通的配置方法都整理出来给正在跟CubeMx Network configuration较劲的朋友一个参考。先说清楚一个事CubeMx里的网络配置严格来说涉及两个大的层面一个是以太网MAC外设的底层配置也就是F407、F427、H743这些芯片自带的MAC控制器需要配置模式MII还是RMII、时钟来源、引脚复用另一个是LWIP协议栈的配置也就是在中间件里把TCP/IP协议栈的宏参数、内存大小、网卡接口这些东西都设置好。很多新手包括我一开始以为网络配置就是打开ETH外设、开一下LWIP就能跑实际上这两个层面之间还有PHY芯片、DMA描述符、中断优先级这些环节任何一个地方不对最终表现就是代码能跑但网络不通或者一跑就HardFault。这篇文章适合以下读者手里有一块带以太网接口的STM32板子想用CubeMx快速把网络功能跑起来或者已经配好了一部分但是遇到编译报错、link up不了、ping不通这类问题无从下手。我会把配置的每一步、背后的原理、可复现的参数全部写清楚同时把那些文档里不会写的坑也一并抖出来。1. 项目整体思路拆解为什么CubeMx网络配置这么容易翻车1.1 CubeMx网络配置的三个层次缺一不可很多人在CubeMx里配置网络流程大概是选芯片型号打开ETH外设选个RMII模式然后在中间件里勾上LWIP生成代码编译下载然后就没有然后了。这个流程之所以翻车率高是因为在CubeMx的图形界面里它把很多关键配置藏在了看起来不起眼的选项里。你光打开ETH外设是不够的还需要把时钟树里的以太网时钟来源、PHY芯片的型号和地址、LWIP里的一堆宏定义全部配好生成出来的代码才是一个逻辑完整的网络工程。我把它拆成三个层次来理解底层硬件层ETH外设的时钟、引脚复用、DMA配置、中断优先级。这一层是你配置界面里能看到的也是最容易出错但最不容易被注意到的。PHY芯片适配层CubeMx帮我们生成的是调用HAL库通用API的代码但它并不知道你板子上挂的具体是哪颗PHY是LAN8720A还是DP83848地址是多少要不要复位脚。这部分需要在生成的代码基础上做适配官方代码模板里默认调用HAL_ETH_Init()但PHY的复位时序需要自己写。LWIP协议栈层生成代码使用的默认LWIP配置是能编译、能跑最小Demo级别的如果你的应用需要TCP并发连接、需要更大的接收缓冲不改内存配置就会遇到性能瓶颈甚至直接HardFault。理解了这个分层结构你就明白为什么按教程一步步来还会出问题很多教程默认的PHY芯片、默认的时钟来源跟你的实际情况不一致一个参数不对表象却是五花八门的网络故障。1.2 我这次的项目配置目标和选型依据先交代一下我的环境方便你对照主控是STM32H743VIT6PHY是LAN8720A接口用的RMII模式外部晶振25MHz用PA8输出50MHz参考时钟给PHY。LWIP版本是CubeMx自带的2.1.2没有开操作系统NO_SYS1只跑裸机的TCP服务器Demo。选RMII而不是MII的原因很实际RMII只需要7根信号线TXD[1:0]、RXD[1:0]、TX_EN、CRS_DV、REF_CLK而MII需要16根。对于板级设计来说省一半引脚布线和引脚分配都宽松很多。虽然RMII对参考时钟的精度要求更高必须精确50MHz但只要时钟源选对了稳定性完全没问题。我选LAN8720A也是因为它是市面上最便宜的百兆PHY之一资料多、例程多、好买。如果你用的是其他PHY比如DP83848、KSZ8081配置思路一模一样只需要改PHY地址和寄存器初始化部分的代码。2. 时钟树网络配置里最容易被忽视的地基2.1 以太网MAC的时钟来源与频率要求先问一个问题当你打开CubeMx的ETH外设时RCC配置里有一个Ethernet相关的时钟选项你选对了吗STM32的以太网MAC模块本身需要一个时钟这个时钟一般来自系统时钟的某个分频或者PLL。但在RMII模式下更关键的是PHY芯片那边的50MHz参考时钟。这个50MHz时钟有三个常见来源用STM32的MCO引脚比如PA8输出需要配置PLL输出一个精确的50MHz。用外部50MHz有源晶振直接给PHY提供REF_CLK。用25MHz晶振接PHY由PHY芯片内部通过PLL倍频到50MHz后输出给MAC。我这次的板子方案是第一种25MHz外部晶振经过STM32内部的PLL倍频到50MHz然后从PA8MCO1输出给PHY的REF_CLK引脚。这样做的优点是省一颗有源晶振缺点是如果PLL配置不对、输出频率不是50MHz网络直接起不来——RMII模式下PHY的REF_CLK必须是精确的50MHz偏差超过几十ppm就容易出现丢包。2.2 在CubeMx里正确配置MCO输出的实操步骤打开Clock Configuration页面之后注意观察System Clock Mux里有MCO1相关的选项。具体操作如下先把系统时钟和总线时钟配好。H743内部有复杂的时钟树我用的配置是外部25MHz晶振PLL1倍频到400MHz作为系统时钟AHB分频到200MHzAPB1到100MHzAPB2到100MHz。找到MCO1相关的时钟源选项选择PLL1Q或PLL2P之类能输出准确50MHz的时钟源。具体能选哪些取决于芯片型号H743里一般用PLL1Q经过分频得到。把MCO1的分频器设为合适值确保最终输出是50.000MHz。在Pinout视图里确认PA8被复用为MCO1功能。这里有个特别容易踩的坑你在CubeMx里无法直接输入50MHz到MCO分频器然后让它自动算你得在脑子里过一遍倍频和分频的关系。比如PLL1的VCO输出是400MHzPLL1Q经分频后某个值再经过MCO1寄存器分频最后得到50MHz。不同CubeMx版本这个界面的交互逻辑还有一些差异有的版本MCO1的时钟源选择下拉框是灰色的需要先点击一下才能激活我当时在这里卡了快一个小时。我的建议别依赖肉眼估算用CubeMx自动计算功能确认最终频率显示为50.000 MHz界面里会直接显示MCO1输出频率的具体数值只要不是精确的50.000就说明分频配置不对。2.3 一个隐蔽的时钟坑ETH外设时钟与RMII时序除了MCO给PHY的50MHzMAC控制器自己的时钟也别忘了。STM32H743的ETH外设时钟是从AHB总线时钟分频出来的一般就是系统时钟200MHz直接供给。如果AHB总线时钟不是200MHzETH的时序配置会出问题因为MAC内核内部有很多时序参数是跟时钟周期挂钩的。我在排查过程中就发现过一个问题当我把AHB总线时钟降到150MHz尝试降低功耗时ETH初始化虽然没报错但收发数据一直不正常。最后查资料才明白HAL库的以太网DMA初始化里有一些超时参数是按周期数写的总线时钟变了同样的周期数对应的实际时间就变了DMA描述符的轮询超时就会出问题。所以除非你非常清楚自己在干什么否则在配置网络功能时AHB时钟尽量用芯片的推荐默认值不要随意降频。3. 引脚分配与PHY芯片适配从RMII引脚到复位时序3.1 RMII模式下需要配置的引脚清单在CubeMx的Pinout视图里打开ETH外设后你会看到一堆需要分配的引脚。以RMII模式为例标准引脚如下ETH_RMII_TXD0发送数据0ETH_RMII_TXD1发送数据1ETH_RMII_TX_EN发送使能ETH_RMII_RXD0接收数据0ETH_RMII_RXD1接收数据1ETH_RMII_CRS_DV载波侦听/数据有效ETH_RMII_REF_CLK参考时钟100MHz速率时是50MHz这些引脚在H743上有两个可选映射组不同封装、不同板子的设计可能选不同的组。CubeMx会根据你手动分配的引脚自动帮你匹配可用映射但我建议先看原理图确认板子上PHY接到了哪个引脚下标再去CubeMx里分配而不是让CubeMx帮你自动选然后回来改板子。我当时就是没先看原理图直接让CubeMx自动分配结果它选了A组映射我的板子用的是B组映射生成的代码初始化后PHY的TX/RX信号完全对不上link状态能起来PHY的Link指示是通过LED或者寄存器读的跟引脚映射无关但数据收发完全废了。这个坑的隐蔽性极高因为link up了这个表象会给你一种PHY已经通了的错觉。3.2 PHY的复位引脚和中断引脚处理除了标准的RMII信号线PHY芯片通常还有复位引脚和中断引脚可选的。这两个脚在CubeMx里一般不需要配置成ETH功能的复用而是当成普通GPIO来用。以LAN8720A为例它的复位脚一般是NRST低电平有效需要至少保持一段时间低电平再释放复位时序不对会导致PHY芯片处于不确定状态典型现象是读PHY寄存器返回0xFFFF或者完全无响应。在生成代码之后我习惯在main()里、在MX_ETH_Init()调用之前手动加一段PHY复位的GPIO操作// 伪代码在MX_ETH_Init()之前执行 HAL_GPIO_WritePin(PHY_RESET_GPIO_Port, PHY_RESET_Pin, GPIO_PIN_RESET); HAL_Delay(100); HAL_GPIO_WritePin(PHY_RESET_GPIO_Port, PHY_RESET_Pin, GPIO_PIN_SET); HAL_Delay(100);这段代码的意思是拉低复位脚至少100ms让PHY彻底复位然后拉高释放再等100ms让PHY内部初始化完成。100ms是一个比较保守的值很多PHY其实几十毫秒就够了但宁多勿少毕竟这只是在启动阶段的一次性延迟。另外如果你打算监测PHY的中断比如Link状态变化还需要把PHY的中断脚配成外部中断输入并在中断回调里调用HAL库的相应处理函数。我当时为了省事没有接PHY的中断脚直接靠LWIP轮询PHY的Link状态也能工作但响应会有延迟。如果项目对网络断线重连的实时性有要求还是建议接上中断脚。3.3 PHY地址一个看似简单但坑多多的参数LAN8720A的PHY地址可以通过芯片的PHYAD0引脚硬件拉高拉低来配置默认是0x00。但不同厂家的PHY默认地址不同比如有的DP83848默认地址是0x01有的KSZ8081默认是0x00。如果你用的是STM32CubeMX里自带的LAN8742驱动代码模板默认的PHY地址可能是LAN8742_PHY_ADDRESS这个宏需要改成跟你实际芯片匹配的值。PHY地址错了最典型的症状初始化时HAL_ETH_Init返回成功但之后你想读取PHY的ID寄存器或者Link状态读回来的数据全是不正常的或者干脆无法得到Link up。所以在做网络调试的第一步就应该写一个简单的PHY寄存器读取函数读取PHY的ID寄存器确认能读到预期的芯片ID。比如LAN8720A的PHY IDR1寄存器地址2应该读到0x0007IDR2寄存器地址3应该读到0xA200或类似值。如果读不到先别急着调LWIP问题在PHY这一层。4. LWIP协议栈配置从默认参数到可用的TCP通信4.1 CubeMx里LWIP的关键配置项解读打开Middleware里的LWIP选项你会看到一大堆可配置的参数。对于刚入门的朋友不是所有参数都需要改但有几个不改必坑NO_SYS裸机跑必须设置为1。如果设为0LWIP会尝试调用操作系统相关的互斥锁、信号量、邮箱等机制而你没有移植FreeRTOS或者RT-Thread编译直接不过。LWIP_DHCP如果你想要动态获取IP设为1。但对于调试阶段建议先用静态IP减少变量。我用的静态IP是192.168.1.10子网掩码255.255.255.0网关192.168.1.1。MEM_SIZELWIP堆内存大小裸机默认值一般是1600字节左右实际在CubeMx里默认是约9KB左右对于稍微复杂一点的TCP应用这个值偏小我建议直接设到2倍以上比如20KB或者40KB前提是芯片RAM够用。H743有1MB RAM给到40KB完全没问题。PBUF_POOL_SIZE接收缓冲池的pbuf数量。默认10个左右收发压力大时建议加到20个以上。这个值太小在接收数据稍多时会出现丢包。LWIP_NETIF_LINK_CALLBACK建议设为1这样网卡接口会向上层回调Link状态变化你可以在应用层打印网络状态。这些参数听起来很抽象你可以把它们类比成一个快递仓库MEM_SIZE是仓库总面积PBUF_POOL_SIZE是仓库里的临时货架数量TCP_MSS是单个包裹的体积。仓库不够大、货架不够多、包裹太大都会导致快件被拒收——对应到网络就是丢包、接收失败、性能差。4.2 网卡驱动层的初始化顺序CubeMx生成的代码里LWIP初始化的调用顺序是这样的ETH底层初始化 - PHY初始化 - LWIP协议栈初始化lwip_init() - 网卡接口添加netif_add() - 设置默认网卡netif_set_default() - 调用netif_set_up()让网卡就绪。这个顺序一个都不能颠倒。我见过有人为了调试方便把netif_set_up()放到协议栈初始化之前结果后面怎么ping都不通因为网卡接口对象在netif_add之前还不存在直接调netif_set_up不知道在操作那个网卡。在实际生成的代码里MX_LWIP_Init()函数会帮你串起这些步骤。但有一点需要注意它生成的代码默认不会自动启动DHCP如果你DHCP没开它就是静态IP直接用也不会自动轮询PHY的Link状态。如果你用的PHY不支持自动协商或者Link状态检测不准确你需要在主循环里定期调用MX_LWIP_Process()或者HAL提供的PHY状态读取函数更新网卡的Link状态。我最终的主循环结构大致是while (1) { // 处理LWIP协议栈包括轮询网卡接收、超时计时等 MX_LWIP_Process(); // 其他业务逻辑比如检查是否有新的TCP数据可读 my_tcp_server_poll(); }注意MX_LWIP_Process()这个函数在CubeMx生成的代码里经常是一个空函数或者只调用了ethernetif_input()和sys_check_timeouts()之类的东西。如果你的PHY是中断驱动的接收逻辑在中断里做如果是轮询方式就在这里每轮检查。裸机环境下我推荐轮询方式简单、可靠、不容易踩中断上下文的问题。4.3 TCP Server Demo的实测经验配置完成并成功ping通之后我写了一个最简单的TCP Server测试PC端通过网络调试助手连接开发板的192.168.1.10:8080开发板收到数据后原样返回。这个测试跑通的要点有三个IP地址、端口号要配对PC和板子必须在同一个网段不然怎么都连不上。确认链路状态在while循环里加一个netif_is_link_up(gnetif)的判断如果为假打印提示信息。我当时就发现一个现象板子启动后PHY复位和初始化需要时间如果PC端在板子上电后1秒内就发起连接往往连不上因为PHY还没准备好。发送缓冲区管理LWIP的发送是异步的tcp_write()只是把数据复制到协议栈的发送缓冲区真正发送要靠tcp_output()触发。如果发送缓冲区满了tcp_write()会返回ERR_MEM这时候不能盲目重试要等协议栈的ACK回调空间释放出来。踩过一次最深的坑我在回调函数里直接调用了tcp_write()和tcp_output()没有检查返回值也没有等最后一个参数TCP_WRITE_FLAG_COPY是否设置。当发送量大时LWIP进入内存不足状态程序直接进入配置异常断言失败。后来在tcp_sent回调里继续发送下一包数据问题才算彻底解决。5. 常见问题排查与避坑实录5.1 编译报错与CubeMx生成代码的隐藏问题CubeMx网络配置最常见的一个编译报错是error: _HAL_ETH_ undeclared或者error: ETH_HAL_DMA undeclared之类这类问题往往是因为在CubeMx的Software Packs里没有正确勾选LWIP的依赖组件或者STM32Cube Firmware的版本和HAL库版本不匹配。我遇到过一次非常隐蔽的情况CubeMx升级到新版本之后生成的LWIP代码里的lwipopts.h文件里多了几个新宏而我的项目是从旧版本工程迁移过来的旧的lwipopts.h没覆盖掉新宏定义导致编译直接报macro redefined的警告虽然警告不一定报错但在某些编译选项严格的项目里警告也会被当成错误。解决思路很直接删除Core目录下旧版本的lwipopts.h让CubeMx重新生成一份。但注意如果你在新旧版本之间改过很多自定义配置删除前一定先备份diff的内容。另外如果你装了STM32CubeMX的某个扩展包提示this file is either corrupted or not a recognized package这属于固件包下载不完整或损坏的问题解决办法是去ST官网重新下载对应版本的固件包或者在CubeMx的Options里换一个本地存储路径也可以手动把下载好的固件包放到指定目录下然后在CubeMx里从本地加载。这种情况在你换电脑、换网络环境后特别容易出现。5.2 编译通过但ping不通的逐层排查法如果你编译通过、烧录成功但PC端ping不通别急着怀疑代码逻辑按这个顺序排查第一步查PHY Link状态。在程序里加一行打印输出HAL_GPIO_ReadPin或者读PHY的BSR寄存器看Link是否up。如果Link都不up检查PHY复位电路、RMII时钟是否到位、PHY地址是否正确、电源电压是否正常。硬件问题就别浪费时间看软件了。第二步查MAC和PHY之间的收发。初始化ETH后手动写测试代码给PHY发一帧数据看TX引脚有没有信号输出再用电脑发一个包看RX引脚有没有信号进来。这个需要示波器或者逻辑分析仪如果有条件一定要测这句话值千金。我的板子第一次ping不通就是因为我误以为PHY Link up 数据通结果示波器一看TX_REF_CLK完全没波形——MCO配置输出不是50MHz而是25MHz。第三步查LWIP配置。确认gnetif的IP地址、子网掩码、网关确实写进去了确认PHY的MAC地址不是全0全0在有些系统里会被当作非法地址。在netif_add之后打印一下gnetif.ip_addr看是不是你期望的192.168.1.10。第四步查接收中断和DMA。如果你用了ETH接收中断检查NVIC配置里ETH中断优先级是否被别的更高优先级的中断频繁抢占导致丢中断。裸机环境下建议把ETH中断优先级设为最高数字最小避免被定时器中断打断。5.3 高频率定时器与PWM占空比/频率测量踩坑顺带说一个我最近看到的热搜词CubeMx 测量 占空比 频率。很多人用CubeMx配置定时器做输入捕获去测PWM的频率和占空比然后把ETH和定时器放在同一个工程里。这块我遇到过一个问题TIM的输入捕获中断和ETH的收发中断抢优先级导致网络丢包。如果你要用CubeMx同时配网络功能和定时器输入捕获功能优先级分配原则是实时性要求高、中断持续时间短的任务优先比如定时器捕获中断可以设为最高ETH中断其次但要确保ETH中断不会被长时间屏蔽否则DMA接收描述符很快会被写满然后出现received frame overrun错误。另外输入捕获测量占空比时CubeMx里必须在定时器的Input Capture Mode里配置两个通道一个捕获上升沿、一个捕获下降沿或者在同一个通道上利用定时器的PWM输入模式自动测量周期和脉宽。这些配置本身不难难的是中断回调里读CCR寄存器的时机。经常有人配置完烧进板子读回来的占空比是0原因是中断里读的寄存器值不是最新捕获到的值或者在两个通道间没有加防抖处理。5.4 其他高频问题CMake工程、固件包损坏、芯片锁死最近这半年CubeMx对CMake的支持越来越完善了很多人包括我开始用CubeMx生成CMake工程然后用VS Code CMake构建来替代Keil。网络配置相关的工程如果用CMake构建有几个坑CubeMx生成的CMakeLists.txt里中间件源文件的路径跟Keil的工程文件结构略有不同如果手动添加过文件路径容易写错。编译选项里.c文件需要加上-Wno-address-of-packed-member之类的选项否则H743这种Cortex-M7核上以太网描述符对齐问题会报一堆警告。CMake构建因为out-of-source build机制生成的链接脚本路径如果配错会提示找不到FLASH.ld。另外很多人遇到的导入CubeMx固件包显示this file is either corrupted or not a recognized package通常是因为从非官方渠道下载的固件包哈希值不对或者文件结构不完整。优先从ST官网或者GitHub的STM32CubeMX仓库下载下载完先比对一下SHA256再导入。还有个让我记忆特别深刻的坑CubeMx配置完网络功能生成代码后编译烧录第二次烧录时提示No target connected或者芯片直接锁死。这是因为我开了ETH的DMA中断和调试器的SWD引脚冲突不对这个例子里真正的原因是PHY的复位引脚跟调试器的复位引脚共用了同一个GPIOPHY复位拉低了SWD复位导致调试器掉线。解决办法是把PHY复位引脚换到别的不冲突的GPIO上或者烧录时先拉高PHY复位脚。6. 一套能稳定跑通的CubeMx网络配置清单最后把我这次最终验证可用的配置步骤完整列一下供你直接参考。这就是一份作业模板只要你的芯片和PHY型号跟我的类似STM32H7系列 LAN8720A照抄基本能通。打开CubeMx选择芯片STM32H743VIT6在Pinout视图里找到ETH选择RMII模式。根据板子原理图手动分配RMII的7个引脚确保和PHY的走线一致。配置RCCHSE为Crystal/Ceramic Resonator外部25MHz晶振。打开Clock Configuration把系统时钟设为400MHzAHB设为200MHzAPB1设为100MHzAPB2设为100MHzMCO1输出设为50MHz引脚PA8复用为MCO1功能。配置PA8为MCO1输出在GPIO设置里把输出速率设为Very High。配置PHY复位引脚比如PB5为GPIO Output默认高电平。在中间件里勾选LWIP设置NO_SYS1MEM_SIZE设为一个合适的值比如40*1024PBUF_POOL_SIZE设20TCP_MSS设为1460IP地址设为静态192.168.1.10。生成代码在main()里、调用MX_ETH_Init()之前加PHY复位时序代码。编译、烧录打开串口打印确认PHY Link up然后在PC上ping 192.168.1.10。ping通之后再写TCP Server测试确认收发数据。这个清单我建议你做成一个自己的检查表每次配置网络工程都过一遍。我第一次调试的时候漏了第7步的MEM_SIZE设置用的是默认值结果TCP一建立连接收发几轮数据就HardFault排查了很长时间。设置到40KB之后问题再没出现过。7. 调试技巧与个人经验比配置更重要的是学会自己定位问题写到最后分享几个我这两年来调试网络配置问题最受用的经验。第一个经验是调试网络问题必须善用日志和指示灯。我自己的习惯是串口打印分级别错误级别红色、警告级别黄色、信息级别蓝色、调试级别灰色。网络初始化阶段每一步都打印日志比如“ETH init start”、“PHY reset done”、“PHY ID read: 0xXXXX”、“LWIP init done”、“Link up, IP: 192.168.1.10”。这样一旦出问题从日志能立刻定位到是哪一步失败了。别嫌日志多关键时刻比你猜来猜去快十倍。第二个经验是在读懂HAL库底层代码之前先学会用CubeMx重新生成干净的工程。很多时候你改乱了代码与其一行行找问题不如回到CubeMx里重新生成一份干净的再一步步把改动加回去。我踩过最惨的一次在某处临时调试代码里不小心覆盖了gnetif的IP地址导致无论怎么改CubeMx配置网络就是不通。复盘下来根本不是配置问题是我自己在代码里乱改了数据结构。用干净工程一票否决的方法很快就能查出来。第三个经验是网络配置调试要有强烈的分层排查意识。不要一上来就盯着LWIP的代码看先从底层往上看时钟有没有、PHY复位没有、Link up没有、PHY ID能不能读、裸MAC能不能收发、LWIP能不能ping通、TCP能不能连上。每一层都有明确的成功标准逐层验证永远不会迷茫。第四个经验也是最后的忠告数据手册和应用笔记永远优先于所有的教程。CubeMx只是一个配置工具它帮你生成的代码框架是固定的但它无法理解你具体的板级设计。LAN8720A的数据手册、STM32H7的参考手册里关于以太网MAC时钟和RMII时序的章节、ST官方的AN4666以太网设计指南这些文档你在调试时遇到任何问题都应该优先去翻。教程可以帮你入门但真正定位问题靠的是对文档细节的理解和实测数据。网络配置这条路说难也难说简单也简单。难的是所有环节都是串在一起的任何一个细节不对表象都是网络不通简单的是只要把每个环节的验证标准定好按顺序逐层排查问题一定找得到。希望这篇文章能帮你少走一些弯路早点点亮你板子上的Link灯。

相关新闻