news 2026/9/28 4:13:57

GD32 Keil5开发环境搭建全攻略:从芯片包安装到烧录配置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GD32 Keil5开发环境搭建全攻略:从芯片包安装到烧录配置

1. 为什么GD32的Keil5环境总有人装不明白

GD32开发环境搭建这件事,说简单也简单,说折腾也真能折腾死人。我见过太多人卡在第一步——Keil5装好了,芯片包也下了,结果新建工程选不到GD32的型号;或者编译能过,一烧录就报错“No Algorithm found”;再或者J-Link连上了但下载速度慢得离谱。这些问题的根源往往不在技术难度,而在于信息差:GD32和STM32在Keil5里的配置逻辑有细微但致命的差异,而大多数教程默认你已经懂了这些差异。

这篇内容就是要把这些“默认你懂”的东西全部摊开讲清楚。从Keil5 MDK的安装、芯片包(DFP)的获取与安装、工程模板的建立,到烧录器配置、常见报错的排查链路,我会按实际操作的顺序一步步走一遍。适合刚接触GD32的嵌入式新手,也适合从STM32转过来、发现“怎么不太一样”的老手。你不需要事先了解GD32的底层架构,但最好对Keil5的基本界面和C语言工程结构有个模糊印象——没有也没关系,我会在关键节点补充说明。

先给一个核心结论:GD32在Keil5里的支持,本质上依赖于GigaDevice官方提供的DFP芯片包,而不是Keil自带的STM32支持。很多人装完Keil5发现器件列表里只有ST的芯片,就以为GD32用不了Keil,其实只是缺了那个包。这个包怎么找、怎么装、装完怎么验证,是整条链路里最关键的一环,也是坑最多的地方。下面我从头开始拆。

2. Keil5 MDK的安装与版本选择:别在第一步埋雷

2.1 选MDK-ARM还是MDK-C51,还是两个都要

Keil5这个叫法其实有点模糊。Keil的IDE产品线里,MDK-ARM是针对ARM Cortex-M内核的,MDK-C51是针对8051内核的。GD32全系是ARM Cortex-M内核(M3、M4、M23、M33等),所以你需要的是MDK-ARM。但网上很多教程标题写“Keil5安装教程”,配图却是C51的安装界面,这就导致有人装完发现新建工程时器件列表里全是AT89C52之类的51单片机,完全找不到ARM的影子。

如果你同时需要开发51和ARM,Keil官方支持将MDK-ARM和MDK-C51安装在同一目录下,共用同一个uVision5 IDE。安装顺序建议先装MDK-ARM,再装C51,这样C51的组件会挂载到已有的uVision5上。反过来先装C51再装MDK-ARM,有时会出现IDE版本冲突,打开工程时提示“Project requires a newer version of uVision”。我实测下来,先ARM后C51的顺序最稳。

注意:如果你只开发GD32,完全不需要装C51。多装一个组件不仅占空间,还会在器件列表里混入大量无关型号,增加选错芯片的概率。

2.2 安装路径里的中文和空格:一个老生常谈但总有人踩的坑

Keil5的安装路径绝对不要包含中文、空格或特殊字符。我见过有人装在D:\嵌入式开发\Keil_v5下面,结果编译时链接器报“cannot open file”之类的错误,排查半天发现是路径里的中文导致某些工具链组件解析失败。推荐直接用默认路径C:\Keil_v5,或者自定义为D:\Keil_v5这种纯英文无空格的路径。

另外,安装时建议以管理员身份运行安装程序。Keil5在安装过程中需要向系统目录写入驱动文件和注册表项,权限不足会导致后续J-Link、ST-Link等烧录器驱动装不上。这个坑在Win10/Win11上尤其常见,因为UAC默认会拦截。

2.3 Pack Installer的初始化:装完先别急着新建工程

Keil5装完后第一次打开,会自动弹出Pack Installer窗口,或者你可以通过菜单Pack→Pack Installer手动打开。这个工具是Keil5管理芯片包的核心组件,所有DFP(Device Family Pack)都通过它来安装、更新和卸载。

第一次打开Pack Installer时,它会尝试从Keil的服务器拉取最新的包列表。如果你发现列表是空的或者一直转圈,大概率是网络问题。这时候不用慌,可以先去GigaDevice官网手动下载DFP包,然后用Pack Installer的File→Import功能离线导入。这个离线导入的方法在后面讲芯片包安装时会详细展开。

提示:Pack Installer的在线列表加载失败不影响后续使用,只要你能手动导入DFP包,整个流程照样跑通。不要因为列表刷不出来就以为Keil装坏了。

3. GD32芯片包(DFP)的获取与安装:整条链路的核心

3.1 DFP包到底是个什么东西

DFP全称Device Family Pack,是Keil MDK的芯片支持包格式。它里面包含了什么?简单说,就是让Keil5“认识”某个芯片家族所需的一切:器件数据库(选型时显示的型号列表)、启动文件(startup_xxx.s)、外设寄存器定义头文件、Flash烧录算法(FLM文件)、以及一些示例工程和文档。

没有DFP,Keil5就不知道GD32是什么,器件列表里选不到型号,编译时找不到寄存器定义,烧录时找不到Flash算法。所以DFP是GD32在Keil5里能跑起来的前提,没有替代方案。

GD32的DFP包由GigaDevice官方维护,在Keil的Pack Index里有收录,但更新可能滞后于GigaDevice官网。我一般建议优先从GigaDevice官网下载最新的DFP包,因为官网版本通常支持更多新型号,且修复了一些已知问题。

3.2 从官网下载DFP的完整路径

打开GigaDevice官网,进入“开发工具”或“软件与工具”栏目,找到“GD32 Keil Pack”或类似名称的下载入口。注意要选对系列:GD32F10x、GD32F30x、GD32F4xx、GD32E23x等各有独立的DFP包,不要下错。如果你用的是GD32F103,就下GD32F10x系列的包;如果是GD32F450,就下GD32F4xx的包。

下载下来通常是一个.pack文件,比如GigaDevice.GD32F10x_DFP.1.0.0.pack。这个文件可以直接双击安装,也可以从Keil的Pack Installer里导入。

3.3 安装DFP的两种方式与验证方法

方式一:双击安装。直接双击.pack文件,Keil的Pack Installer会自动启动并执行安装。这种方式最简单,但前提是你的系统已经正确关联了.pack文件类型。如果双击没反应,说明关联丢失,可以用方式二。

方式二:Pack Installer导入。打开Keil5,菜单Pack→Pack Installer,然后File→Import,选择下载好的.pack文件。导入过程中Pack Installer会解析包内容并写入Keil的安装目录,通常几秒钟到几十秒不等,取决于包的大小。

安装完成后,验证方法:在Pack Installer的左侧器件树里展开GigaDevice节点,应该能看到对应的系列和型号。或者在Keil5新建工程时,器件选择对话框里搜索“GD32”,能出现型号列表就说明装好了。

注意:如果安装后器件列表里仍然没有GD32,先检查Pack Installer里GigaDevice节点下是否有黄色感叹号或红色叉号。有感叹号通常表示包版本与当前Keil版本不兼容,需要更新Keil或下载旧版DFP;有叉号表示包损坏,重新下载安装即可。

3.4 多个DFP版本共存时的选择逻辑

有时候你会在Pack Installer里看到同一个系列有多个版本的DFP,比如GD32F10x_DFP有1.0.0和1.0.1两个版本。Keil5允许同时安装多个版本,新建工程时可以在“Device”选择页面的“Pack”下拉框里指定用哪个版本。

我的建议是:新工程用最新版本,老工程保持原版本不动。因为DFP版本升级有时会改动启动文件或寄存器定义,导致老工程编译报错。如果你维护着多个GD32项目,最好在工程文档里记录每个工程使用的DFP版本号,避免换电脑或重装Keil后出现“怎么编译不过了”的情况。

4. 建立GD32标准工程模板:从零到点灯

4.1 新建工程时的器件选择与Run-Time Environment配置

打开Keil5,Project→New uVision Project,选一个纯英文路径存放工程。在弹出的器件选择对话框里,展开GigaDevice,找到你的具体型号,比如GD32F103C8。选中后点击OK。

接下来会弹出Run-Time Environment(RTE)配置窗口。这里有个关键选择:是否使用CMSIS的Core和Device启动组件。对于GD32,我建议勾选CMSIS的CORE和Device下的Startup,但不勾选Device下的StdPeriph Drivers(标准外设库)。原因后面讲库的选择时会详细说。RTE配置的好处是自动帮你把启动文件和系统初始化文件加到工程里,省去手动复制的麻烦。

如果你在RTE窗口里看不到GD32的Device组件,说明DFP安装不完整,回到第3章检查。

4.2 标准外设库、HAL库还是LL库:GD32的库生态现状

这是GD32开发里一个容易让人迷糊的点。STM32有StdPeriph、HAL、LL三套库,GD32的情况类似但不完全相同:

  • 标准外设库(StdPeriph):GigaDevice官方提供,API风格和STM32的StdPeriph高度相似,适合从STM32转过来的开发者。缺点是GigaDevice对新系列的标准库维护力度在减弱。
  • HAL库:GD32部分系列有HAL库支持,但成熟度不如STM32的HAL。如果你要做USB、以太网等复杂外设,HAL库的参考价值有限。
  • LL库:GD32的LL库覆盖不全,很多系列没有。

我的实际建议:对于GD32F10x/F30x这类经典系列,用标准外设库最稳。网上能找到大量基于标准库的例程和项目,遇到问题容易搜到答案。对于GD32E23x、GD32F4xx等较新系列,可以评估HAL库的成熟度,但要做好踩坑的准备。

4.3 手动添加库文件与头文件路径的完整步骤

如果你在RTE里没有勾选StdPeriph Drivers,就需要手动把库文件加到工程里。步骤如下:

  1. 从GigaDevice官网下载对应系列的标准外设库压缩包,解压后找到Firmware目录。
  2. 在Keil工程里新建分组,比如Library、User、Startup。
  3. 把Firmware/GD32F10x_standard_peripheral/Source/下的.c文件按需添加到Library分组。不需要全加,用到哪个外设加哪个,减少编译时间。
  4. 把Firmware/CMSIS/GD/GD32F10x/Source/下的system_gd32f10x.c加到Startup分组。
  5. 在Options for Target→C/C++→Include Paths里添加头文件路径:Firmware/GD32F10x_standard_peripheral/Include、Firmware/CMSIS/GD/GD32F10x/Include、Firmware/CMSIS。
  6. 在Options for Target→C/C++→Define里添加宏定义,比如GD32F10X_MD(根据芯片容量选MD/HD/XD),以及USE_STDPERIPH_DRIVER。

提示:宏定义里的容量标识(MD/HD/XD)必须和你的芯片实际Flash容量匹配。选错了会导致启动文件里的堆栈大小、中断向量表地址等配置错误,表现为程序跑飞或烧录后不运行。

4.4 启动文件的选择:cl、md、hd、xd到底选哪个

GD32的启动文件按Flash容量分档:startup_gd32f10x_cl.s(互联型)、startup_gd32f10x_md.s(中容量,64-128KB Flash)、startup_gd32f10x_hd.s(大容量,256-512KB)、startup_gd32f10x_xd.s(超大容量,768KB以上)。

选错的后果很严重:比如你的芯片是GD32F103C8(64KB Flash,属于中容量),却选了hd的启动文件,编译能过,但烧录后程序可能不运行,因为中断向量表的偏移和堆栈配置不匹配。

怎么确认自己的芯片属于哪一档?看型号里的容量代码:C8=64KB(md),CB=128KB(md),CE=512KB(hd),CC=256KB(hd),CK=1024KB(xd)。如果不确定,查数据手册的Ordering Information章节,里面有明确的Flash容量标注。

5. 烧录器配置与下载算法:编译通过只是开始

5.1 J-Link、ST-Link、GD-Link的选择与驱动安装

GD32支持多种烧录器,常见的有:

烧录器优点缺点适用场景
J-Link速度快、兼容性好、支持SWD和JTAG正版价格高,盗版固件可能被Keil检测专业开发、批量烧录
ST-Link便宜、容易买到需要改固件或配置才能支持GD32个人学习、小批量
GD-Link官方支持、价格适中生态不如J-Link丰富GD32专属开发

J-Link的驱动安装比较简单,去SEGGER官网下载J-Link Software Pack,安装后Keil会自动识别。ST-Link用于GD32需要额外配置:在Keil的Options for Target→Debug里选ST-Link Debugger,然后进入Settings,在Flash Download选项卡里手动添加GD32的Flash算法。GD-Link的配置类似,官方有专门的驱动包。

注意:ST-Link刷GD32时,有时会遇到“Cannot access target”的错误。这通常是因为ST-Link的固件版本太新,对非ST芯片做了限制。解决办法是降级ST-Link固件,或者换用J-Link/GD-Link。这个坑我在多个项目里都遇到过,折腾ST-Link的时间足够买一个GD-Link了。

5.2 Flash下载算法的添加与地址配置

在Options for Target→Debug→Settings→Flash Download里,需要确保Programming Algorithm列表里有GD32对应的Flash算法。如果DFP安装正确,这里应该能自动出现,比如GD32F10x Medium Density Flash。

如果没有自动出现,点击Add,在列表里找GigaDevice相关的算法。如果列表里完全没有,说明DFP安装有问题,回到第3章重新安装。

地址配置:Flash算法的起始地址通常是0x08000000,大小根据芯片容量自动填充。不要手动改这个地址,除非你有特殊的Bootloader需求。

5.3 烧录失败的常见报错与排查链路

烧录失败是GD32开发里最高频的问题之一。我按排查顺序列一个链路:

  1. 检查硬件连接:SWDIO、SWCLK、GND、VCC四根线是否接好。SWDIO和SWCLK不要接反,VCC电压是否匹配(GD32通常是3.3V)。
  2. 检查Keil的Debug配置:Options for Target→Debug里选的烧录器是否正确,Settings里能否识别到芯片ID。如果识别不到ID,说明硬件连接或驱动有问题。
  3. 检查Flash算法:Flash Download里是否有正确的算法,起始地址是否为0x08000000。
  4. 检查芯片是否被锁:如果之前烧录过程序启用了读保护,芯片会被锁住,表现为“Cannot access target”或“Flash Download failed”。解锁方法后面讲。
  5. 检查复位电路:有些GD32开发板的复位引脚接了电容,导致烧录器无法正常复位芯片。可以尝试在Keil的Debug→Settings→Reset里选SYSRESETREQ或VECTRESET。

提示:如果以上都检查了还是不行,试试把烧录速度降到1MHz或500kHz。有些便宜的烧录器或劣质杜邦线在高速下信号质量差,降速能解决大部分“玄学”问题。

6. 那些让人抓狂的典型问题:逐个拆解

6.1 芯片被锁住后的解锁方法

GD32的读保护(Read Protection)一旦启用,通过常规方式无法读取或擦除Flash。解锁方法有两种:

方法一:用J-Link Unlock。打开J-Link Commander,输入unlock命令,然后按提示操作。这个命令会擦除整个Flash并解除读保护。注意:擦除后程序丢失,需要重新烧录。

方法二:用Keil的Flash Download配置。在Options for Target→Debug→Settings→Flash Download里,勾选Erase Full Chip,然后尝试下载。有些情况下Keil会自动触发解锁流程。

如果以上都不行,可能需要用GD32官方的GigaDevice MCU ISP Programmer工具,通过串口或USB进入Bootloader模式来解锁。具体操作是:把BOOT0拉高,复位芯片,然后用ISP工具连接并执行全片擦除。

6.2 Keil5中GD32型号列表为空或灰色不可选

这个问题的原因通常有三个:

  • DFP未安装或安装不完整:回到Pack Installer检查GigaDevice节点。
  • Keil版本过旧:某些新版DFP需要Keil MDK 5.30以上。如果你的Keil是5.20或更早,升级Keil或下载旧版DFP。
  • Pack Installer的器件数据库缓存损坏:关闭Keil,删除C:\Keil_v5\ARM\PACK\.Web\目录下的缓存文件,重新打开Keil让Pack Installer重建缓存。

6.3 编译报错“cannot open source input file ‘gd32f10x.h’”

这是头文件路径没配好。检查Options for Target→C/C++→Include Paths里是否包含了gd32f10x.h所在的目录。通常这个文件在Firmware/CMSIS/GD/GD32F10x/Include/下面。如果路径对了还报错,检查文件名大小写——Keil在Windows下不区分大小写,但有些库文件在Linux下打包时大小写混乱,解压到Windows后可能出现GD32F10x.h和gd32f10x.h不一致的情况。

6.4 J-Link烧录速度慢或频繁断连

J-Link烧录GD32时,如果速度设得太高(比如10MHz),可能出现断连或校验失败。建议把Options for Target→Debug→Settings→Debug选项卡里的Clock设为1MHz或2MHz。另外,SWD接口的线长不要超过15cm,过长的杜邦线会导致信号衰减。

如果用的是盗版J-Link,Keil可能会弹出“J-Link firmware too old”或“Clone detected”的警告。这种情况下烧录功能可能被限制,建议换用正版或GD-Link。

6.5 GD32的ITCM和DTCM配置注意事项

GD32的部分高性能系列(如GD32F4xx、GD32E5xx)有ITCM和DTCM紧耦合内存。在Keil的Options for Target→Target选项卡里,可以配置IRAM和IROM的地址范围。如果你使用了ITCM/DTCM,需要确保链接脚本(scatter file)里的内存布局和实际硬件匹配。

一个常见的坑:默认的scatter file可能把堆栈放在DTCM里,但DTCM的容量有限(通常64KB),如果堆栈需求大,会导致链接失败。这时候需要手动修改scatter file,把堆栈移到普通SRAM里。

7. 工程模板的固化与复用:一次配好,次次省心

7.1 把配置好的工程导出为模板

当你成功建立一个能编译、能烧录、能点灯的GD32工程后,建议把它固化为模板。具体做法:把工程目录下的Objects、Listings、DebugConfig等编译输出目录删掉,只保留源码、库文件、工程文件和配置。然后把这个目录复制到一个专门的“模板”文件夹里。

下次新建工程时,直接复制模板目录,改个名字,然后在Keil里把器件型号改成新的芯片(如果需要),调整宏定义和启动文件即可。这样能省去大量重复配置的时间。

7.2 用Git管理工程时的.gitignore配置

如果你用Git管理GD32工程,.gitignore里至少要排除以下内容:

Objects/ Listings/ DebugConfig/ *.uvguix.* *.scvd *.dep *.bak

*.uvguix.*是Keil的用户界面布局文件,包含个人窗口排列信息,不应该提交到仓库。*.dep是编译依赖文件,每次编译都会变。把这些排除后,仓库会干净很多。

7.3 多芯片型号工程的宏定义切换技巧

如果你一个工程需要适配多个GD32型号(比如同一套代码要跑在F103C8和F103CB上),可以在Options for Target→C/C++→Define里用条件宏,或者在工程里建多个Target,每个Target对应一个型号,分别配置宏定义和启动文件。

Keil的Target管理在Project→Manage→Project Items→Targets选项卡里。你可以复制现有Target,然后修改器件型号、宏定义和启动文件。编译时通过工具栏的Target下拉框切换。

提示:多Target工程在提交到Git时,.uvprojx文件会包含所有Target的配置,这是正常的。但要注意不同Target的Output目录不要冲突,否则编译输出会互相覆盖。

8. 从点灯到跑通第一个外设:验证环境是否真正可用

8.1 GPIO点灯工程的最小代码结构

环境搭好后,用最简单的GPIO点灯来验证整条链路。一个最小的main.c结构如下:

#include "gd32f10x.h" void delay(volatile uint32_t count) { while(count--); } int main(void) { rcu_periph_clock_enable(RCU_GPIOB); gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0); while(1) { gpio_bit_set(GPIOB, GPIO_PIN_0); delay(500000); gpio_bit_reset(GPIOB, GPIO_PIN_0); delay(500000); } }

这段代码做了三件事:使能GPIOB的时钟、配置PB0为推挽输出、在死循环里翻转PB0电平。如果你板子上的LED接在PB0,应该能看到闪烁。

8.2 用串口打印验证时钟配置是否正确

点灯只能验证GPIO和基本时钟,要验证系统时钟配置是否正确,最好用串口打印。初始化USART0,配置波特率为115200,然后在main里打印一条消息。如果串口助手能收到正确的字符串,说明系统时钟(通常配置为72MHz或108MHz)和串口分频都对了。

如果串口打印乱码,大概率是系统时钟配置和实际晶振不匹配。检查system_gd32f10x.c里的__SYSTEM_CLOCK宏定义,以及板子上的晶振频率(通常是8MHz或12MHz)。

8.3 从模板到实际项目的迁移检查清单

当你准备从模板工程迁移到实际项目时,按以下清单逐项检查:

  • [ ] 器件型号是否改为目标芯片
  • [ ] 启动文件是否匹配Flash容量
  • [ ] 宏定义(容量标识、库选择)是否正确
  • [ ] 头文件路径是否包含所有需要的目录
  • [ ] Flash下载算法是否匹配芯片系列
  • [ ] 系统时钟配置是否与板子晶振一致
  • [ ] 堆栈大小是否满足项目需求(在启动文件里改)
  • [ ] 如果用了RTOS,SysTick中断优先级是否配置正确

这份清单是我在多个GD32项目里踩坑后总结的,每次新建工程过一遍,能避免90%的低级错误。

9. 一些没人告诉你但很重要的实操心得

9.1 DFP版本与Keil版本的兼容性矩阵

GigaDevice的DFP包对Keil MDK版本有最低要求。比如GD32F10x_DFP 1.0.0需要Keil 5.24以上,而某些新版DFP可能需要5.30以上。如果你在旧版Keil上装新版DFP,Pack Installer会提示不兼容,器件列表里也不会出现。

我的做法是:保持Keil MDK在5.30-5.36这个区间。太老的版本不支持新DFP,太新的版本(5.37+)有时会改动Pack管理逻辑,导致旧DFP导入失败。这个区间是我实测下来兼容性最好的。

9.2 离线环境下的DFP安装方案

有些开发环境没有外网,Pack Installer无法在线拉取列表。这时候需要提前在有网的机器上下载好.pack文件,拷贝到离线机器上,用File→Import导入。注意:导入时Pack Installer仍然会尝试联网校验,如果完全断网,可能会卡住。解决办法是在Pack Installer的设置里关闭“Check for updates on launch”,或者直接双击.pack文件安装。

9.3 工程文件损坏后的恢复思路

Keil的.uvprojx文件是XML格式,偶尔会因为异常关闭或磁盘写入问题损坏,表现为打开工程时提示“Project file is corrupted”。这时候不要慌,.uvprojx文件通常有备份,在Objects目录下可能有.uvprojx.bak,或者你可以从Git历史里恢复。

如果备份也没有,可以新建一个空工程,然后手动把源文件、头文件路径、宏定义、烧录配置重新加一遍。这个过程大概10分钟,比试图修复损坏的XML快得多。

9.4 用VSCode + EIDE插件作为Keil的补充

Keil的编辑器功能比较弱,代码补全、跳转、格式化都不如VSCode。我现在的做法是:用Keil做编译和烧录,用VSCode做代码编辑。VSCode里装EIDE插件,可以导入Keil工程,获得更好的编辑体验。EIDE还支持直接调用Keil的编译工具链,在VSCode里就能完成编译,不用来回切换。

不过EIDE对GD32的支持需要手动配置芯片包路径,初次使用需要花点时间。如果你主要用Keil,可以先不折腾这个;如果你对编辑体验有要求,EIDE值得一试。

9.5 GD32与STM32在Keil配置上的关键差异汇总

最后用一个表格总结GD32和STM32在Keil5配置上的主要差异,方便从STM32转过来的开发者快速对照:

配置项STM32GD32
芯片包STM32F1xx_DFPGigaDevice.GD32F10x_DFP
启动文件命名startup_stm32f10x_md.sstartup_gd32f10x_md.s
库函数前缀STM32_GD32_
时钟使能函数RCC_APB2PeriphClockCmdrcu_periph_clock_enable
GPIO配置函数GPIO_Initgpio_init
Flash算法STM32F10x Medium DensityGD32F10x Medium Density
系统时钟配置文件system_stm32f10x.csystem_gd32f10x.c

这些差异看起来不大,但在实际配置时,一个函数名写错就会编译报错。建议在迁移代码时,先用查找替换把前缀改掉,然后逐个检查外设初始化函数。

我在实际使用中发现,GD32的库函数在参数顺序和返回值类型上和STM32有细微差别,比如gpio_init的引脚参数是GPIO_PIN_0而不是GPIO_Pin_0,大小写和拼写都不一样。这种细节只能靠编译报错来发现,没有捷径。踩过几次之后,我现在新建GD32工程时,会先把标准库的例程跑一遍,确认所有外设都能正常工作,再开始写业务代码。这个习惯帮我省了很多调试时间。

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

C#上位机对接西门子S7-200 SMART:基于S7netplus的通信监控实战

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

作者头像 李华
网站建设 2026/9/28 4:11:22

手把手MCP教学:用TaoToken统一管理本地与线上服务器配置

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

作者头像 李华