news 2026/10/21 20:05:37

零成本入门STM32:纯软件仿真跑通GPIO、串口与定时器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
零成本入门STM32:纯软件仿真跑通GPIO、串口与定时器

很多想入门 STM32 的朋友,第一反应就是先去买一块开发板。开发板几十到几百不等,再加上各种模块、下载器、杜邦线,还没开始学,钱包先瘦了一圈。更麻烦的是,不少人是看了几集视频、收藏了一堆资料才决定入坑的,板子到手之后才发现自己其实连环境都没配好,热情瞬间被浇灭。我自己也经历过这个阶段,后来因为要验证一些想法,又不想每次都折腾硬件,就干脆琢磨出一套“纯软件”的 STM32 学习路线:不花钱买板子,也能把 GPIO、串口、定时器、ADC 这些外设一个个跑通。

这篇文章就把这套“纯软件仿真版”的完整思路分享出来。它适合完全没接触过 STM32 的小白,也适合已经有板子但想快速验证代码逻辑的老手。核心就是:用仿真工具模拟出一块虚拟的 STM32 芯片,把常用的外设实验在电脑上跑起来,省掉硬件的等待和接线成本,先把“软件逻辑”和“寄存器操作”这两块基本功练扎实。

1. 我为什么要把 STM32 入门改成“纯软件”版本

做这个决定不是因为我反对买板子,而是我见过太多人死在“硬件准备”这一步。我自己最早学单片机的时候,就曾经因为下载器驱动装不上,折腾了两天没跑通第一个点灯程序。后来换了台电脑、换了根数据线才解决问题——跟代码本身一毛钱关系都没有,纯粹被硬件环境卡住了。

仿真的价值在于把“环境问题”和“学习问题”拆开。你在电脑上跑仿真,不需要关心 USB 转串口芯片型号、不需要担心杜邦线接触不良、不需要怕烧坏引脚。你只需要关心一件事:代码逻辑对不对,外设的寄存器配置对不对。当点灯不亮、串口没输出的时候,问题一定在你的代码里,这在学习阶段其实是件好事——它能逼着你把每个寄存器的每一位都搞清楚,而不是甩锅给“板子坏了”。

另一个很实际的原因是成本和学习效率的平衡。一块正经的开发板加下载器,再怎么省也要几十块钱,但几十块钱可能只是你实验环境的一部分。如果你还想试试 OLED 屏、温湿度传感器、蓝牙模块,每个模块又是一笔开销。而在仿真环境里,这些外设都是虚拟的,随便你怎么折腾都不心疼。你可以同时开好几个工程,换不同的外设组合来验证思路,这种“随便造”的自由度,是物理硬件给不了的。

不过我也得说句公道话:纯软件仿真不能完全替代实物。它最大的价值是在“入门阶段”和“逻辑验证阶段”帮你把成本降到接近零,让你用最低的门槛先把 STM32 的编程模型、外设工作机制、调试流程吃透。等你真的把仿真的实验都跑通了,再买一块板子上手,会顺畅得多——因为你已经知道代码该怎么写,剩下的只是熟悉一下真实硬件的手感而已。

2. 仿真方案选型:主流的 STM32 模拟环境到底怎么选

说到 STM32 仿真,很多人的第一反应是 Keil 自带的那种“软件仿真”功能。确实,MDK 里可以不用接硬件,直接点 Debug 按钮进入仿真模式,这种模式适合观察寄存器变化和执行流程。但你很快会发现,它的外设模拟能力比较有限,GPIO 翻转还能看,串口输出要配置虚拟终端,ADC 的输入电压模拟更是麻烦。如果你只是想验证一段 UART 发送逻辑,它确实够用;但想“把外设一个个跑通”,体验就有点局促了。

我做这套纯软件版本的时候,实际比对了几个主流的仿真环境,这里直接把我自己的使用感受列出来:

仿真环境平台上手难度外设模拟程度适合场景
Keil MDK 内置仿真Windows低一般,以外设寄存器模拟为主快速验证逻辑、查看寄存器变化
ProteusWindows中较高,配合虚拟仪器电路级仿真,能看波形、LCD 显示
Wokwi浏览器极低较高,支持常见外设和库零安装快速入门、分享项目
QEMU + 自家固件Linux/Windows高取决于移植的板级支持跑完整 RTOS 工程、自动化测试

如果你是完全的新手,我建议优先试 Wokwi。它不需要安装任何东西,浏览器打开就能写代码、看运行结果,而且对 STM32 的支持做得不错。我试过在 Wokwi 上跑 GPIO 点灯、UART 打印、定时器中断这些实验,体验非常流畅,特别适合用来做“入门的第一课”。

如果你打算把仿真当作长期的开发验证工具,Proteus 是更专业的选择。它不仅能仿真 MCU,还能在电路里加虚拟示波器、函数发生器、LED 阵列这些东西。很多工科生在学校里用过它,上手没什么障碍。不过它的元件库和操作习惯需要一点时间适应,并且它对 STM32 的时钟配置和外设模拟细节要求比较高,有时候一个设置不对,仿真结果跟实际预期差得很远。

我的建议是:入门选 Wokwi,深入选 Proteus,Keil 内置仿真作为偶尔查看寄存器的辅助工具。三个方案各有各的用武之地,不必纠结选哪个最好,先跑起来再说。后续如果要做更复杂的系统级验证,也可以考虑 QEMU 那条路线,但那就超出“入门”的范畴了,属于进阶内容。

3. 搭建零成本仿真环境:以 Wokwi 为例跑通第一个工程

我选择用 Wokwi 作为这套“纯软件”学习环境的起点,因为它的门槛真就是“零”——不用装驱动、不用配编译器、不用管下载器。你只需要一个浏览器,打开官网,新建一个 STM32 项目,就能开始写代码了。

3.1 创建项目和选型芯片

Wokwi 的工程创建界面很直观。新建项目的时候,你会看到一个芯片选择的弹窗,里面列出了常见的 STM32 型号。我个人的建议是选 STM32F103C8,也就是大家常说的“蓝板”那颗芯片。为什么选它?因为 STM32F103 系列的资料最多,教程满天飞,你遇到任何问题都能搜到答案。学习阶段选一种“资料密度”最高的芯片,永远是效率最优解。

工程创建完之后,你会看到左侧是代码编辑器,右侧是虚拟的电路板。第一次打开的时候可能有点懵:一颗芯片的图形躺在画布上,旁边什么都没有。别急,这个画布是给你“接外设”用的。比如你想跑点灯实验,就从元件库里拖一个 LED 出来,再拖一个电阻,把 LED 的正极通过电阻接到某个 GPIO 引脚,负极接地,一个虚拟的点灯电路就接好了。

这套操作跟你用真板子接线的逻辑一模一样,只不过杜邦线变成了鼠标拖拽,面包板变成了画布。这种“所见即所得”的方式对新手特别友好——你不光能看懂代码,还能看到代码跑起来之后电路的实时反应。

3.2 配置芯片时钟和 GPIO 输出模式

如果你之前接触过 STM32 的开发,一定知道早期教程里那种“直接操作寄存器”的写法又长又容易出错。Wokwi 的示例工程默认是支持 HAL 库的,代码结构跟你在 Keil 里建工程时看到的差不多。我强烈建议初学者从一开始就走 HAL 库路线,虽然它帮你封装了很多寄存器操作,但你还是能通过阅读库函数的实现,慢慢理解底层到底发生了什么。

一个典型的 GPIO 输出点灯代码是这样的:

#include "stm32f1xx_hal.h" int main(void) { HAL_Init(); __HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); while (1) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // LED 亮 HAL_Delay(500); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // LED 灭 HAL_Delay(500); } }

这段代码的逻辑非常好理解:先把 GPIOC 的时钟打开,然后把 PC13 配置成推挽输出模式,最后在一个死循环里交替让它输出低电平和高电平,配合延时实现 LED 闪烁。在 Wokwi 里运行这个工程,你会看到虚拟的 LED 真的在那里一亮一灭。

速度这个参数可能有人会忽略。在 STM32 里,GPIO 的输出速度决定了引脚翻转的压摆率,低速模式下波形边沿更缓,高速模式下边沿更陡。点灯这种低频场景用低速度就够了,但如果你后面要做 SPI、PWM 之类的通信,就得根据外设的要求选择合适的 GPIO 速度,否则可能出现信号质量不过关的问题。

3.3 用串口打印来验证程序运行状态

跑通了点灯,下一步就是串口。为什么我把它排在第二位?因为串口是所有调试手段里最基础、最直观的。你可以在代码里任何地方加一条打印语句,把变量的值、程序的执行状态输出出来,这比单纯看 LED 闪烁要丰富得多。

在仿真环境里做串口实验,Wokwi 提供的虚拟串口终端(Serial Monitor)让我觉得特别顺手——代码里调用printf或者 HAL 的串口发送函数,虚拟终端就能直接显示输出内容。你需要做的就是在画布上添加一个虚拟终端组件,然后把它连到芯片的 TX、RX 引脚上。

这里有一个非常关键的细节:STM32 的默认时钟源是内部高速时钟(HSI),频率精度一般,而且 HAL 库初始化的时候会按照 HSE 外部晶振的频率来配置系统时钟。如果你用的是 8MHz 的外部晶振配置,但仿真环境默认没有给外部晶振,串口波特率就会算错,打印出来全是乱码。解决方法是把工程的时钟配置改成使用内部时钟,或者在 Wokwi 的画布上添加一个外部晶振组件。这类问题在实际硬件上同样存在——板子的晶振频率和代码里的配置不匹配,串口通信就会失败。在仿真里提前踩一次这个坑,比到真板上抓耳挠腮强得多。

4. 把外设一个个跑通:我推荐的实验路线与核心要点

“把外设一个个跑通”这句话听起来简单,但实际展开的时候,需要一条合理的路线。我的建议是遵循从“简单输出”到“复杂交互”的顺序,每个实验都以前一个为基础,层层递进。

4.1 从 GPIO 到定时器:理解中断和时间的来源

GPIO 实验解决了“如何让芯片输出高低电平”的问题,但你会发现一个尴尬的现状:用HAL_Delay做延时,CPU 其实是“傻等”的。如果你一边点灯一边还想扫描按键,或者想控制舵机,浪费在延时里的 CPU 时间就太可惜了。这时候就该引入定时器和中断了。

定时器的核心价值在于“让芯片自己计时”,时间到了自动触发中断,CPU 不用时刻盯着。用定时器实现 LED 闪烁跟用延时实现,代码风格完全不同:

// 定时器中断方式翻转 LED void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); } }

感兴趣的话,你可以仔细研究一下定时器的预分频系数(PSC)和自动重装值(ARR)这两个寄存器是怎么配合出想要的定时时间的。公式是定时时间 = (PSC + 1) * (ARR + 1) / 定时器时钟频率。比如定时器时钟是 36MHz,想让定时时间为 500ms,你可以设置 PSC = 35999,ARR = 499,这样每一秒触发一次中断——这个计算过程在仿真和真板上完全一致,在仿真环境里多算几次,你就能形成对时间参数的直觉。

4.2 用外部中断处理按键:轮询和中断的取舍

按键输入这个实验特别能体现仿真环境的价值。在真板上做按键实验,你得处理机械按键的抖动问题,还要留意引脚上拉下拉的配置。在仿真里虽然不用考虑物理抖动,但你仍然要做消抖的逻辑处理,因为真实世界的按键物理触点就是会“抖”的。

轮询方式写按键扫描逻辑简单,但缺点是想兼顾多任务时代码会变得很乱;外部中断方式让芯片在被按下时立刻响应,逻辑清晰,但要注意中断函数里不能做耗时操作。两种方式我都推荐你在仿真里各写一遍。写完之后你会真切理解,这两种方案的取舍不光是代码风格问题,背后是硬件资源(中断通道数量)和实时性要求之间的权衡。

外部中断实验还要注意一个容易出错的点:STM32 的多个 GPIO 引脚可能共享同一个中断线。比如 PA0、PB0、PC0 都对应 EXTI0,你如果同时用了两个引脚的 EXTI0,中断回调里必须判断是哪个引脚触发的,否则程序行为会很诡异。这种问题在仿真里也能复现,属于“不踩不知道、一踩吓一跳”的典型坑。

4.3 ADC 采样:仿真里的模拟电压从哪来

ADC 实验是比较容易让大家困惑的一个。真实硬件上,你可以用滑动变阻器分压给 ADC 引脚一个可变的模拟电压,ADC 采样后输出数字量。但在仿真环境里,“可变电压”从哪儿来?

Wokwi 里有个滑动变阻器组件(Potentiometer),把它的一端接到 VCC,另一端接地,中间抽头接到 ADC 输入引脚,然后用鼠标拖动滑条,就能实时改变输入电压。你可以在代码里循环读取 ADC 的值,然后把采集到的数据通过串口打印出来。这个实验做完,你对“模拟电压到数字量”的转换过程会有非常清晰的理解。

特别值得强调的是 ADC 的参考电压和分辨率这两件事。STM32F103 的 ADC 是 12 位的,意味着满量程对应 4095。如果参考电压是 3.3V,那么读取到的值N对应的电压就是N * 3.3 / 4095伏。很多初学者在真板上很容易忽略参考电压的精度对采集结果的影响,但在仿真里你可以随意改参考电压值来观察结果的变化,直观得多。

4.4 打通通信外设:I2C 和 SPI 的虚拟外设玩法

最后这一层是最有意思的:I2C 和 SPI 这种通信接口,在仿真环境里也能跑通。你可以拖一个虚拟的 I2C 设备(比如 EEPROM 或 OLED 屏)连接到芯片的 I2C 引脚上,然后通过代码往里写数据、读数据。我当时用仿真环境成功驱动了一个虚拟 OLED,看到屏幕上显示出自己通过 I2C 写入的字符串时,那种成就感甚至比在真板上点亮还强烈。

SPI 同理,Wokwi 里也支持常见的 SPI 设备。如果你正好有传感器模块的库代码,可以把它编译进工程里,跑起来看看能不能正确读到传感器数据。学过通信协议之后你会发现,I2C 和 SPI 的差异不只是引脚数量:I2C 用两根线靠地址区分设备,适合低速、多设备的场景;SPI 一主多从靠片选线区分设备,速度更快,但占用引脚也更多。仿真环境的好处是,你可以把同样的传感器分别用 I2C 和 SPI 各驱动一次,对比两套代码的差异,这种“实验对照”在实物上往往要准备两块不同接口的模块,成本和时间都高得多。

5. 仿真和真实硬件的差异:这些坑迟早要知道

仿真再方便,它终究是对真实芯片的模拟。我在这套纯软件路线里跑得很开心,但也得诚实地说说它的局限。如果你打算以后转真板开发,下面这几个差异你越早了解越好。

5.1 引脚电气特性和驱动能力

仿真里,你拉一根线把 LED 接到 GPIO 上,它能亮,看起来似乎完美。但真实芯片的 GPIO 有最大输出电流限制,STM32 单个 GPIO 典型输出电流也就 20mA 左右,如果你直接驱动一个工作电流很大的负载(比如继电器、电机),芯片根本扛不住,甚至会烧毁。仿真环境不会模拟这种电气极限,所以你必须在真板上做实验前,养成先查阅数据手册的习惯——这种习惯在仿真里是练不出来的,却是嵌入式开发的必备素养。

5.2 时钟树配置的“误差”被隐藏了

仿真环境的时钟模型是理想化的——那些分频、倍频的计算都是精确的,不会有时钟漂移问题。真实芯片上的 HSI 内部时钟精度有限,HSE 外部晶振也会受温度、电压影响,这就导致同一个代码在仿真里串口打印一切正常,到了真板上数据偶尔会出错。这也是为什么真板上的串口通信往往需要接受一定程度的波特率误差。我的建议是,在仿真里练手的时候,就有意识地使用外部晶振配置(如果仿真环境支持),并把芯片的数据手册关于时钟精度的说明读一遍,这样转真板的时候,你遇到问题不会一脸懵。

5.3 中断实时性:指令时序无法完全还原

仿真环境的核心是模拟逻辑行为,很难精确还原指令周期。比如你用定时器做了非常精确的 PWM 输出,仿真里波形看起来没问题,但到了真板上,波形沿的抖动、中断响应的延迟都会细微不同。真板调试遇到“现象时好时坏”的问题往往跟这种实时性差异有关,仿真时很难暴露这类问题。对于入门学习来说这不是大问题,等你做到电机控制、高速采集这类依赖精确时序的项目时,就必须回到真板上验证了。

5.4 仿真不会烧芯片,但也不会告诉你烧芯片的风险

这大概是“纯软件”路线最大的双刃剑。仿真环境里你随便接错线、配错寄存器,最多程序不工作,不会造成硬件损坏。但正因为这样,你少了一种“敬畏感”——真实开发中,一组寄存器配错了可能让芯片直接锁定,一个电源接反可能让整块板子报废。我见过有同学在仿真里养成了“先乱试再说”的习惯,转到真板后继续保持这种习惯,结果烧了好几个传感器模块。所以我的建议是:仿真阶段就把“查数据手册、确认引脚复用功能、注意电气参数”当成一种固定流程来练习,当你有一天拿到真实板子的时候,你已经是一个有安全意识的开发者了。

6. 进阶扩展:从纯软件仿真走向系统级验证

外设一个个跑通之后,你的学习曲线会进入一个平台期。这个阶段如果还是停留在“写个点灯、写个串口”的实验,收获会越来越小。更值得做的,是用仿真环境去验证一些系统级的设计思路。

6.1 用仿真跑通一个小型嵌入式系统

比如,你可以给自己设定一个“模拟项目X”的小目标:用按键切换 LED 的闪烁模式,用 ADC 读取环境亮度,然后自动调节 LED 亮度,同时把状态信息用串口输出。这个项目放在真板上做,你需要准备按键、LED、光敏电阻、滑动变阻器,一堆杜邦线,接线至少折腾半小时。在仿真里,它的电路搭建和代码调试几乎是即时完成的。做完之后再回头想,你对“状态机”“事件驱动”“传感器数据融合”这些概念的理解,已经跟照着教程抄代码完全不是一个层次了。

6.2 结合 CI 自动化做代码回归测试

另一个很有价值的玩法是把仿真跑在命令行里,集成到自动化构建流程中。如果你手头有 Linux 环境,Wokwi 有一些命令行工具可以配合 CI 系统,这样每次改了代码,系统自动拉起来跑仿真,检验外设行为是否符合预期。这种方式对做开源项目或者在团队里做固件开发的场景尤其有用——先跑完仿真测试,再刷到真板,可以省掉大量无谓的硬件调试时间。当然,这件事需要对 Linux 和命令行比较熟悉,不是入门阶段必须做的事情,可以作为进阶方向了解一下。

6.3 回顾一下我自己的仿真实践心得

做完整套“纯软件学习路线”之后,我自己最大的感受是:仿真工具真正改变的不是成本,而是学习的“试错频率”。在真板上,一次错误操作可能要花几分钟甚至更久去排查连线、驱动、电源的问题;在仿真里,你可以在很短的时间内完成“改代码、跑仿真、看结果、再修改”的完整循环。这种高效反馈正是新手最需要的东西——你要的不是一块贵板子,而是足够多次数的正确反馈和错误纠正。

我还想强调一个细节:仿真可以让你放心大胆地写代码,但绝不能让你养成“记不住寄存器名字也没关系”的惰性。我在实操中习惯的做法是:每次实验之前,先在参考手册里找到对应外设章节,把要用到的寄存器和关键位置标记出来,然后才开始写代码。仿真方便了验证,让“大胆假设”变得低成本,但之后还是要“小心求证”,这样才能真的把知识转化为能力。

7. 从仿真到真板的过渡:如何零挫折地完成第一次实物开发

如果你顺着我上面的路线,把 GPIO、定时器、串口、ADC、I2C 这些外设在仿真里都跑通了,那我强烈建议你购板后做一次有准备的过渡。这个阶段,你已经有能力区分“这是我的代码问题,还是硬件配置问题”了。

第一块板子的选择,我推荐继续用 STM32F103C8T6 的核心板。不单是因为它便宜,更重要的是你对这颗芯片已经足够熟悉——仿真阶段你用的就是它,外设寄存器、HAL 库的行为习惯你都了解,换成真板之后,环境差异带来的变量最少,成功率最高。别一上来就买一个功能复杂的新款芯片,那样仿真阶段积累的优势会被新芯片的学习成本抵消掉大半。

上板之前,花半天时间把之前跑过的每个仿真实验,逐个用真板复现一遍。我的动手顺序是:先点灯、再串口打印、然后按键中断、再定时器、最后是 ADC。每复现一个实验,就在笔记本上记录仿真和真板的差异点——这些记录就是你从“仿真玩家”升级为“嵌入式开发者”的原始积累。等这些实验全部复现成功之后,你才有资格说自己是真正入门了 STM32。

前面这些经验看起来琐碎,但每一个都是我实际踩过之后才总结出来的。最后给你一个小建议:仿真环境里所有实验代码,建议用 Git 管理起来,每次实验一个小 commit。等积累了几十个 commit 之后回头翻翻,你一定会惊讶于自己的成长速度。学习嵌入式开发本来就是一条耐力赛跑的路,一个好环境、一套合理的路线、一个高效的习惯,能让你在这条路上走得更轻松、更稳妥。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 20:01:52

AD5689R双通道16位DAC选型、驱动与实战避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/21 19:58:31

读懂HCU控制模块说明书:状态机、标定与故障码排查

简介:《HCU控制模块使用说明书》是一份中文PDF版技术手册,面向MD880和HE系列变频器的调试与维护人员,系统讲解HCU控制模块的选型、安装、接线及扩展方法。文档按基本整流(HCU-20)、回馈整流(HCU-30&#xf…

作者头像 李华
网站建设 2026/10/21 19:57:34

基于SpringBoot+Vue的学习交流平台管理系统开发实践

最近帮某单位做了一套面向内部人员的学习交流平台管理系统,技术栈选了SpringBoot Vue MyBatis MySQL这套非常成熟的组合。项目本身并不算多复杂,核心就是“学习资源管理 在线学习过程记录 交流互动 后台权限管理”这类常见业务,但正因为…

作者头像 李华
网站建设 2026/10/21 19:57:33

调光玻璃接棒天幕:三条技术路线与量产避坑指南

简介:这是一份汽车汽配行业深度报告《调光玻璃接棒天幕,前景可期》,聚焦汽车玻璃智能化升级路径,面向证券研究员、汽车产业链从业者及关注智能座舱的投资者,系统梳理调光玻璃的技术演进与市场空间。资源为单份PDF文件&…

作者头像 李华
网站建设 2026/10/21 19:56:37

图表设计方法论:从需求拆解到视觉编码的完整指南

1. 从"diagram-design"这个标题能读出什么 第一次看到"diagram-design"这个标题,我脑子里蹦出来的第一个念头是:这大概率不是一个单纯的"画图工具推荐",而是一套关于 图表设计方法论 的沉淀。为什么这么说&a…

作者头像 李华
网站建设 2026/10/21 19:56:01

ANSYS不同单元连接实战:自由度匹配、耦合约束方程与MPC方法

简介:关于ANSYS中不同单元之间连接问题的PDF文档,重点梳理梁、壳、体等单元类型在结构分析与有限元模拟中的自由度匹配规则。内容源自工程分析实例,明确总结了杆-梁-壳-体不同组合的连接受限条件:公共节点可直接连接的情况&#x…

作者头像 李华