☰
Eclipse+ARM GCC+J-Link嵌入式工具链搭建与调试实战
2026/10/15 18:06:07 网站建设 项目流程

很多年前我第一次从商业IDE转向免费工具链的时候,也经历过“Eclipse能开发STM32吗”“GCC编译出来的固件真的能跑吗”“J-Link会不会只支持自家商业IDE”这种连环疑问。后来被一个持续集成项目逼着走通了一遍,才意识到eclipse+arm_gcc+JLink这套组合才是真正能“打通任督二脉”的方案:许可证完全免费、跨Windows/Linux/macOS、构建过程全部命令行化、调试链路也透明。这篇适合三类人看:想摆脱商业IDE许可证限制的开发者、需要把嵌入式构建跑进自动化流程的团队、以及想彻底搞懂“从源码到Flash再到断点”全链路的新手。我会从方案选型、安装避坑、工程创建、烧录调试、问题排查一路讲到CI集成,争取把每个“为什么”都说清楚。

1. 方案选型:为什么是Eclipse + ARM GCC + J-Link

1.1 先看清这套组合里每一环在干什么

嵌入式开发不是一个软件能包办的,它本质上是“编辑代码—编译目标文件—链接成固件—下载到Flash—调试运行”这个闭环。Eclipse在这套组合里承担“工作台”的角色:组织源码、编辑文件、调用外部工具、展示调试信息;ARM GCC承担“编译器”的角色,它不是一个单独命令,而是一整套工具链,包括arm-none-eabi-gcc编译器、arm-none-eabi-as汇编器、arm-none-eabi-ld链接器、arm-none-eabi-objcopy格式转换工具,还有size、nm、readelf这些分析工具;J-Link承担“硬件接口”的角色,负责把编译好的固件写入STM32的Flash,并且通过SWD/JTAG协议把调试数据传给主机上的调试器。

这三个角色之间没有绑定关系,而是通过几个公开、通用的“接口”串联起来的。工程用一个Makefile描述,Makefile里写清楚GCC怎么编译、链接脚本怎么指定内存布局;调试时则通过GDB远程协议,把Eclipse里的调试指令翻译给J-Link GDB Server,再由GDB Server驱动J-Link和芯片对话。这个“组装式”架构最大的特点是:每一环都可以替换。你不想用Eclipse,可以换成VS Code和命令行;你手上只有ST-Link,也可以用OpenOCD替代GDB Server;你不想用CubeMX生成初始化代码,甚至可以完全手写寄存器。这种自由度,在商业IDE里是做不到的。

1.2 和Keil、IAR、STM32CubeIDE的对比

很多新手绕不开这三类“现成IDE”的诱惑。先说一个结论:如果只看“最容易上手”,Keil和STM32CubeIDE确实赢很多,但如果你要长远地在多个团队、多套代码、自动化环境中反复折腾,Eclipse+GCC这套组合的优势会越用越明显。我用一张表把几个常见方案拉出来比过:

对比维度Keil MDKIAR EWARMSTM32CubeIDEEclipse + ARM GCC + J-Link
许可证成本商业收费商业收费免费免费
跨平台支持主要WindowsWindows为主Win/Linux/macOS全平台
工程文件格式私有二进制工程私有工程Eclipse工程结构Makefile/CMake纯文本
编译器Arm Compiler/AC6IAR专有编译器arm-none-eabi-gccarm-none-eabi-gcc
调试器支持J-Link等J-Link等默认ST-Link为主通过GDB Server接J-Link等
命令行构建比较麻烦需要额外配置可做但路径繁琐make/CMake原生支持
上手门槛低中低中等

我见过不少团队因为Keil的License问题,被迫给每个员工买授权,或者版本一换发现老工程升级麻烦。这些痛点本质上是“私有格式”带来的。Makefile工程文件只是文本,放到Git里可读、可Review、可追溯。Eclipse和GCC都不会锁定你,以后芯片平台变了,核心编译逻辑照样能复用。

这里还要强调一下:STM32CubeIDE本身内部也是基于Eclipse和GCC的,只是芯片原厂把所有插件、调试器驱动、代码生成器都包在了一起,并且默认绑定ST-Link。如果你已经在用STM32CubeIDE,那对接下面这套方法反而很快;如果你只能拿到J-Link,或者需要在Linux服务器上做固件构建,直接用Eclipse+GCC才是正道。

1.3 为什么调试器我倾向于J-Link而不是ST-Link

ST-Link成本低,很多开发板上直接集成,配合STM32CubeIDE开箱即用。但J-Link在嵌入式开发圈里的口碑,更多来自“稳定”和“功能丰富”。J-Link支持的芯片范围远超ST系列,换不同厂家的ARM核心芯片时不需要换调试器;调试下载速度在批量刷写时优势很大;J-Link自己的工具链里还有串口模拟、RTT实时打印、J-Scope波形观察等实用功能。尤其RTT,它不需要占用USART引脚,在调试真实收发数据的场景里非常好用。当然,J-Link价格不便宜,如果只有ST-Link,下面的思路一样适用,把J-Link GDB Server换成OpenOCD就行,我也会在调试章节里讲一句过渡方案。

2. 搭建前准备:组件版本、下载和安装避坑

2.1 需要准备的组件清单

别急着开浏览器乱搜,先列清楚四件套:

  1. JDK:Eclipse运行需要Java运行时。
  2. Eclipse IDE for Embedded C/C++ Developers:这是Eclipse官方专门为嵌入式开发者准备的发行版,自带CDT插件,省得后面手动装C/C++开发环境。
  3. GNU Arm Embedded Toolchain:工具链压缩包,解压即用,提供arm-none-eabi-gcc等命令。
  4. SEGGER J-Link软件包:里面包含J-Link驱动、J-Link GDB Server、J-Link Commander、RTT Viewer等工具。

除了这四件套,Windows下一般还需要一个make程序。Eclipse的自带发行版有时候会捆绑build tools(里面有make.exe),如果make命令找不到,就用MSYS2安装make,或者单独下载一个GNU make放到无空格路径,并把它的目录加入PATH。

2.2 版本匹配的四个坑

第一,Eclipse版本和JDK版本要对上。新版Eclipse通常要求JDK 17或21,只装个JRE往往不够。我建议直接装JDK 21,配置好JAVA_HOME和PATH,然后再启动Eclipse。

第二,ARM GCC工具链版本不用追新,但也不要用太老的。新版本对C11/C17标准支持好,但个别老工程遇到编译错误时,快速降级到某个历史稳定版反而省事。我实际中遇到过新GCC对“未使用变量”的警告处理更严格,导致CI里-Werror直接失败的情况。所以如果团队里几个同事统一版本,比每日追新要重要。

第三,J-Link软件包的版本要能识别你的目标芯片。新版J-Link驱动对老芯片兼容性很好,但老版驱动对新型号就是两眼一抹黑,连接时会提示Unknown device。如果遇到新买的芯片连不上,第一件事就是升级J-Link软件包。

第四,也是老生常谈但翻车率最高的:所有安装路径不要带空格、不要带中文。Eclipse工作空间、工具链目录、工程目录,我都建议放在像C:\tools\这样的纯英文路径下。Windows上有些老版本make对带空格的路径处理有毛病,报错还特别隐晦,为了省时间,路径越短越纯越好。

2.3 Windows下安装配置实操笔记

用Windows举例,步骤会具体一些:

  1. 安装JDK,安装完在命令行验证java -version能输出版本。
  2. 解压Eclipse到比如C:\tools\eclipse,运行eclipse-inst.exe或直接双击eclipse.exe,首次启动会要求选择工作空间目录,同样选一个无空格路径,比如C:\work\workspace。
  3. 解压ARM GCC到C:\tools\gcc-arm-none-eabi,把C:\tools\gcc-arm-none-eabi\bin加入系统PATH。命令行输入arm-none-eabi-gcc --version,看到类似arm-none-eabi-gcc (GNU Arm Embedded Toolchain ...)的输出就代表成功。
  4. 安装J-Link软件包,一路Next。安装时注意保留“USB driver”相关组件,否则连接J-Link后设备不能被识别。
  5. 测试make,在命令行敲make -v,如果没有输出,则需要把make所在目录也加入PATH。

Linux和macOS其实更简单:Linux下可以用包管理器装一个旧版ARM GCC,但我个人更建议从官方下压缩包,避免系统源里的版本太老,导致CMSIS头文件编译报错。macOS用户如果拿到的工具链是x86_64版本,在Apple Silicon上运行时可能会直接报“cannot execute binary file”,需要找到原生支持arm64的版本,或者用Rosetta方式跑。

2.4 验证环境是否就绪的小脚本

我常用的验证方式就是开一个命令行,执行下面三行,如果都有正常输出,说明环境基本没问题:

arm-none-eabi-gcc --version make -v JLink.exe -? # 或 JLinkExe -? 取决于平台

这一步看似简单,但它可以避免后面在Eclipse里排半天错,最后发现是PATH没配好。

3. 从零建工程:CubeMX生成、Eclipse导入、链接脚本要点

3.1 用STM32CubeMX生成一个干净的“Makefile工程”

为什么要强调”Makefile工程“?因为CubeMX在生成代码时有很多种IDE选项,包括STM32CubeIDE、Keil、IAR和Makefile。如果你选了Keil,生成出来的工程是uvprojx格式,和GCC没关系了。选Makefile生成,得到的是一套纯文本工程,里面有Makefile、启动文件、系统初始化文件、外设驱动代码,还有一个链接脚本。这套东西才是我们想手动掌握的“原料”。

具体操作以最常见的某块F407开发板为例:

  1. 新建工程,选择芯片型号,比如STM32F407VET6。
  2. 在Pinout&Configuration里,找到SYS,把Debug从Disable改成Serial Wire。这一步非常关键,它保证PA13/PA14保留为SWD调试引脚,否则程序一旦运行,这两根引脚被复用成普通GPIO,J-Link就再也连不上了。
  3. 配置时钟树。比如外部晶振25MHz,HSE作为PLL源,倍频到168MHz系统主频,同时让APB1=42MHz、APB2=84MHz。时钟配置错了,后面调试会非常难受。
  4. 在Project Manager里,把Toolchain/IDE选为Makefile,然后生成代码。

生成的工程里会包含一个CubeMX自动填好的Makefile。打开看一眼,你会发现它的开头定义了PREFIX=arm-none-eabi-,下面跟着编译选项、源文件列表、链接脚本路径。理解了它的结构,后面EPLISE配置才不会两眼一抹黑。

3.2 把Makefile工程导入Eclipse

打开Eclipse,选择File -> Import -> C/C++ -> Existing Code as Makefile Project,然后指定工程目录。这一步导入的不是“源码列表”,而是告诉Eclipse:这是一个用Makefile构建的工程,我需要你来当编辑器和工作台,真正干活的还是make。

导入之后,右键工程,进入Properties -> C/C++ Build -> Environment,确保PATH里已经包含arm-none-eabi-gcc和make的目录。如果你在命令行已经验证过环境,这里一般不会出问题。接着进入C/C++ Build -> Builder Settings,确认Build command是make,Build directory指向工程根目录。

IDE的代码索引需要重新扫描:右键工程,Index -> Rebuild,这样Eclipse才认识stm32f4xx_hal.h这些头文件,代码跳转、补全才会生效。CubeMX重新生成工程后,Eclipse里的构建并不会自动变,需要重新导入一次,或者直接把工程目录刷新,因为Makefile工程本来就是“跟着文件走”的。

3.3 链接脚本里那些必须理解的数字

链接脚本是很多人容易忽略的一环,但它决定了代码放在哪、变量放在哪。以STM32F407为例,最核心的一段MEMORY声明长这样:

MEMORY { FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K }

0x08000000是STM32片上Flash的起始地址,上一份中断向量表就存在这里。0x20000000是SRAM的起始地址。为什么RAM的LENGTH要写128K而不是130K?因为芯片实际SRAM就这么大,超出地址范围会直接HardFault。如果以后要做BootLoader,Flash的ORIGIN要改成0x08008000,LENGTH相应缩小,同时程序里还要设置SCB->VTOR为同样的偏移地址,不然中断向量表对不上,一进中断就飞。

链接脚本里另一个常见符号是_estack或__StackTop,它被设置成RAM尾部的地址。Cortex-M内核上电时会把向量表第一个word加载进MSP,所以这个值通常就是0x20020000(F407 RAM 128K的末尾)。如果启动文件或链接脚本里栈顶地址算错,程序上电后甚至走不到main。

3.4 手工建最小工程需要的文件

如果你连CubeMX都不想用,也可以完全手工搭。一个最精简的工程只需要:

  • startup_stm32f407xx.s:启动文件,负责建立向量表、初始化栈指针、调用SystemInit,然后跳转到main。
  • system_stm32f4xx.c:提供SystemInit函数,做时钟和FLASH延迟初始化。
  • stm32f4xx.h和相关寄存器定义头文件,一般来自CMSIS。
  • main.c:自己写一个死循环和一点LED闪烁逻辑。
  • STM32F407VETx_FLASH.ld:链接脚本。

编译时最关键的是CPU架构和浮点参数不能选错:

CFLAGS = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard

如果芯片不带FPU,-mfpu和-mfloat-abi=hard都要去掉,否则硬件浮点指令会让不支持FPU的内核直接触发异常。我刚接触GCC时在这上面栽过多次,板子一跑浮点就进HardFault。

链接时建议加上-ffunction-sections -fdata-sections,并配-Wl,--gc-sections,可以自动丢弃没有被引用的函数和数据,显著减小固件体积。同时生成map文件,方便分析内存占用:

arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard \ -Os -ffunction-sections -fdata-sections \ -TSTM32F407VETx_FLASH.ld \ -Wl,--gc-sections -Wl,-Map=output.map \ -o firmware.elf startup.o main.o system_stm32f4xx.o

再用objcopy生成hex和bin,烧录和产线归档都会用到:

arm-none-eabi-objcopy -O ihex firmware.elf firmware.hex arm-none-eabi-objcopy -O binary firmware.elf firmware.bin arm-none-eabi-size firmware.elf

3.5 命令行烧录先行,不依赖IDE

Eclipse里烧录之前,我强烈建议先在命令行里把烧录链路验证通。J-Link提供一个很实用的批处理模式——J-Link Commander。Windows下命令大概是:

JLink.exe -device STM32F407VE -if SWD -speed 4000 -autoconnect 1 -CommanderScript flash.jlink

flash.jlink脚本内容可以这样写:

h loadfile firmware.hex r g exit

每行含义很清楚:h暂停目标;loadfile把hex写进Flash;r复位;g运行;exit退出。这套脚本不只适合手动验证,稍作改动就能变成产线批量烧录工具。把同样逻辑挂到Eclipse的External Tools里,也能实现IDE下一键烧录。

4. 调试环境配置:让断点真正停下来

4.1 J-Link GDB Server在调试链路里的位置

很多初学者一上来就想在Eclipse里直接点击“Debug”,结果发现板子没反应,原因就是漏掉了中间层。ARM GCC自带的调试器是GDB,它只认GDB远程协议,不认识J-Link的USB协议。J-Link GDB Server就是那个桥:它在PC上开一个TCP端口,默认是2331,GDB通过localhost:2331来连接,J-Link GDB Server再把收到的调试命令翻译成SWD/JTAG时序。

启动方式很直观,安装完J-Link软件包后运行JLinkGDBServer,在界面上选择芯片型号、接口类型、速率。比如:

  • Device: STM32F407VE
  • Interface: SWD
  • Target interface speed: 4000 kHz

命令行方式也一样:

JLinkGDBServer -device STM32F407VE -if SWD -speed 4000 -port 2331

启动后保持这个终端窗口不关,再去Eclipse里配置调试。

4.2 Eclipse调试配置一步步设置

在Eclipse里点击Run -> Debug Configurations,双击新建一个GDB Hardware Debugging配置。关键地方有三处:

  • Main标签页:选择工程,并指定C/C++ Application为编译产物firmware.elf。一定要用elf文件,因为它才带调试符号和源码行信息,hex和bin没有这些。
  • Debugger标签页:GDB Command填arm-none-eabi-gdb;在“Remote Target”里选择TCP,Hostname填localhost,Port Number填2331。
  • Startup标签页:勾选“Reset and halt”,并指定在main函数设置一个临时断点。这样点调试后,Eclipse会把固件下载到Flash,然后让CPU复位并停在main入口。

如果固件已经烧进去,只是想从当前状态观察,可以把“Download image”取消掉。这种断点调试方式能做的事情很多:单步执行、步骤进入、运行到光标、查看变量实时值、调用栈浏览。所有这些数据,本质都是GDB和远端芯片通过J-Link GDB Server交互的结果。

4.3 寄存器、外设视图和SVD文件的妙用

Cortex-M调试时只看C语言变量是不够的,很多时候要直接看寄存器。Eclipse的Debug视图里自带寄存器窗口,可以看到R0-R15、xPSR、MSP、PSP、LR等。但真正好用的是外设寄存器视图,它需要加载芯片的SVD文件。

SVD文件是芯片厂商提供的XML格式设备描述文件,里面定义了哪些外设、哪些寄存器在什么地址。在Eclipse中打开Window -> Show View -> Peripheral,然后在视图上点击加载SVD文件。加载后,你可以直接在界面上看到GPIOA的ODR当前值、USART2的SR标志位、定时器的CNT计数值,不需要自己用指针去内存窗口里翻。排查外设没反应时,这个视图比日志好使得多。

Cortex-M还有一个特性要注意:硬件断点数量有限。F4系列一般就几个硬件比较器,所以断点数量大概在6个左右。当你觉得“怎么设不了这么多断点”时,不是Eclipse坏了,而是硬件资源用完了。这种情况下可以改用软件断点,代价是调试器需要改写Flash,擦除和写入会慢,而且对Flash有磨损,调试只读区域时要小心。

4.4 没有J-Link时的通用方案

如果手头只有ST-Link,也可以完全复用刚才的思路,只是把J-Link GDB Server替换成OpenOCD。OpenOCD启动后同样在TCP端口3333上监听GDB请求。Eclipse里的Remote Target端口改成3333,同时把启动方式改成OpenOCD的reset方式即可。虽然体验可能没有J-Link直接,但理解了“GDB Server是中间层”的原理,换调试器就变成了换中间层,不用换整套环境。

5. 实战翻车实录:编译、连接、运行三类问题排查

5.1 编译阶段最常见的几个报错

编译期的问题相对好排查,因为报错信息通常指向明确。但有几个高频问题值得单独拎出来:

  • “cannot open source file 'stm32f4xx.h'” 这类错误基本都是头文件路径没加。Makefile里CFLAGS要包含-I.或头文件所在目录。
  • “undefined reference to `SystemInit'” 是因为启动文件里调用了SystemInit,但工程里没有编译system_stm32f4xx.c。解决方法是把对应源文件加进Makefile的源文件列表。
  • “entry point absent or not first” 通常是指向量表没有放在Flash起始地址。检查链接脚本里第一个段是不是isr_vector,以及启动文件是否被正确链接进去。
  • Windows下莫名其妙的“No such file or directory”,但文件明明存在。大概率是路径有空格或中文,或者编译路径超过了Windows的文件路径长度限制。把工程挪浅一点,问题立解。

5.2 J-Link连接不上,板子红灯

先看现象再分析原因。最常见的是J-Link的灯由绿变红,命令行输出Cannot connect to target。

排查顺序我从经验中总结成六步:

  1. 线有没有接对。SWD只需要SWDIO、SWCLK、GND三根线,方向别接反。
  2. 供电是否稳定。目标板用USB供电时,如果电流不够,芯片刚复位就掉电,J-Link很难握上任持。
  3. 复位引脚是否被外部元器件强制拉低。有些板子复位端接了RC复位电路,C电容过大时,J-Link的复位时序会被拖垮,尝试降低速率或断开复位电容。
  4. 芯片是否意外进入低功耗模式或读保护状态。如果之前烧过使能RDP的固件,SWD会被禁用,这时J-Link连不上非常正常。最彻底的恢复方式是用串口ISP全片擦除,或者J-Link软件里尝试解锁(很多芯片解锁会丢Flash内容)。
  5. 启动引脚电平是否正常。STM32的BOOT0一般要拉低才能从Flash启动,如果BOOT0被拉高,芯片会进系统存储器BootLoader,此时你烧进去的地址都不对。
  6. 速率是不是太高。4000kHz不行就降到1000kHz甚至400kHz,线太长或接触不良时,高速率会直接失败。

其中,CubeMX里把SYS Debug配置成Disable导致SWD引脚失效,是新手最容易踩的雷。一旦程序跑起来把PA13/PA14改成普通IO,J-Link就立刻失联。这种情况你可以尝试“连接时按住目标板Reset键不放,然后在Commander里发connect命令,在复位瞬间抢住芯片”,但最干净的办法还是先擦除Flash。

5.3 烧录成功但程序不运行

烧录时明明提示下载成功,但板子一点反应没有。我说过很多次的排查方法:不要猜,直接看CPU当前停在哪。

在调试模式下连接目标,查看PC指针。正常的启动路径应该是:0x08000000处放栈顶地址,0x08000004处放Reset_Handler入口,上电后PC跳到Reset_Handler,初始化数据段和BSS段,然后调用SystemInit,最后进main。如果你发现PC在0x00000000或停留在HardFault_Handler,基本就是下面几个原因之一。

  • 向量表放错位置,或VTOR没有指向正确的Flash地址。特别是做了BootLoader偏移后,忘了在main开头执行SCB->VTOR = 0x08008000。
  • 中断服务函数名和启动文件里的符号不一致。GCC的启动文件会声明DMA1_Stream0_IRQHandler之类的弱符号,如果你在C文件里把函数名写错一个字母,中断触发时就会跳到默认的无限循环,表现为“没反应但主循环还在跑”。
  • 浮点编译选项和实际硬件不一致,FPU指令触发异常。
  • 时钟配置不对,HSE起振失败后系统还在低速时钟下跑,程序表现是慢得好像死了,但实际活着。

学会查看SCB的异常状态寄存器对定位非常有用。Fault状态寄存器里区分了总线错误、内存管理错误、未定义指令用法错误等。比如CFSR指出INVSTATE,多半是函数指针跳到了一个非Thumb模式的地址,检查一下是不是取了地址但没有把最低位置1。

5.4 栈溢出和内存优化的排查技巧

嵌入式应用最怕“不定时死机”,而且常常和栈有关。默认的启动文件里Stack_Size通常只有0x400,对简单任务够用,但加了RTOS以后每个任务还要分配单独栈,应用栈不够就会互相踩。

一个非常实用的小技巧是编译时加-fstack-usage,GCC会在每个源文件旁边生成.su文件,记录每个函数的栈使用量。你可以把编译产物里所有.su文件的栈需求按调用路径加起来,粗略估算最深调用会有多深。日常为了省Debug功夫,我会把工程在Debug配置用-Og优化,Release配置用-Os,两个配置分开编译。-Og保留了最好的调试体验,-Os是体积优先。不要用-O0做release,那会让固件又大又慢。

map文件也是排查内存被谁吃掉的利器。arm-none-eabi-nm --print-size --size-sort firmware.elf可以直接列出所有符号的大小,看到哪个大数组占了RAM,哪个函数体积异常,一目了然。

5.5 进阶:把环境搬进自动化流水线

说到最后,这套环境最大的价值其实在自动化。如果构建靠IDE按钮,那就永远无法在服务器上跑集成;而Makefile和命令行工具天然适合CI。我习惯在每次持续集成里做这几件事:

  1. make clean && make -j8编译整个固件。
  2. 编译时强制-Wall -Wextra -Werror,让一切可疑警告在合并前被掐死。
  3. 用产物里的hex/bin/map/su打包归档,每个构建版本都有迹可循。
  4. 如果测试机架上有J-Link和被测板,直接在脚本里调J-Link Commander自动烧录,然后跑一段自动化用例。
  5. 版本号不要手填。在Makefile里调用git describe --dirty --always生成版本字符串,然后通过宏定义注入到代码里,固件里就能随时读出当前构建版本。

这套方法我在自己的多个项目上都验证过。只要熬过最开始的Eclipse配置关,后面收益是成倍的:同事之间不会再因为“他那台电脑能编译我这台编译不了”而吵架,服务器上也能一键出固件,调试器和IDE可以自由更换,不再被某个商业生态绑死。

我个人的体会是:命令行构建能力本身,就是嵌入式工程师的一项基本功。Eclipse+ARM GCC+J-Link恰好是成本最低的一条养成路径。最后再分享一个小技巧:给不同板子分别写好对应的.jlink脚本放在工程目录里,比如flash.jlink、erase.jlink、read_serial.jlink,命令行一敲就是一次标准烧录。这套思路再往前一步,就是产线自动化工序的雏形。希望你按着上面流程走完一遍之后,也能感受到“从零亲手搭起一条编译烧录调试链路”的那种踏实感。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询