在 vscode + cmake + GNU 工具链的基础上配置 JLINK

JLINK 官网链接

下载安装后找到安装路径下的可执行文件

将此路径添加到环境变量的 Path 中。

创建 JFlash 项目

打开 JFlash,选择新建项目

选择单片机型号

在弹出的窗口中搜索单片机

其他参数根据实际情况填写

新建完成:

接下来设置一下项目

把 Start Application 勾上,复位方式选择通过复位引脚复位。如果没有这个硬件条件则使用软件复位。

最后保存工程

编写 powershell 脚本

新建一个脚本叫 jlink-release-download.ps1

powershell 复制代码
# 项目参数
$project_name = "test"
$cmake_config = "gcc-release"
$project_path = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
$workspace_path = Split-Path $project_path -Parent
$build_path = "$workspace_path/out/build/$cmake_config"
$install_path = "$workspace_path/out/install/$cmake_config"

# 开始操作
New-Item -Path $build_path -ItemType Directory -Force
Push-Location $build_path
try
{
	cmake -G "Ninja" $workspace_path `
		--preset "$cmake_config"

	if ($LASTEXITCODE)
	{
		throw "配置失败"
	}

	ninja -j12
	if ($LASTEXITCODE)
	{
		throw "编译失败"
	}

	ninja install
}
finally
{
	Pop-Location
}

Push-Location $install_path
try
{
	arm-none-eabi-objcopy -O binary `
		"$install_path/bin/${project_name}.elf" `
		"$install_path/bin/${project_name}.bin"

	$jflash_arg_array = @(
		"-openprj${workspace_path}/jflash-project.jflash",
		"-open${install_path}/bin/${project_name}.bin,0x8000000",
		"-auto",
		"-startapp",
		"-exit"
	)

	$jflash_arg = $jflash_arg_array -join " "
	$jflash_arg = $jflash_arg.Trim()
	Write-Host $jflash_arg

	Start-Process -FilePath "JFlash.exe" `
		-ArgumentList $jflash_arg `
		-WindowStyle Normal `
		-Wait

	if ($LASTEXITCODE)
	{
		throw "将 ${project_name}.bin 下载到单片机失败。"
	}

	Write-Host "将 ${project_name}.bin 下载到单片机成功。"
}
finally
{
	Pop-Location
}

项目参数部分根据实际情况修改。

为 DEBUG 配置也创建一个 powershell 脚本,叫作 jlink-debug-download.ps1

powershell 复制代码
# 项目参数
$project_name = "test"
$cmake_config = "gcc-debug"
$project_path = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
$workspace_path = Split-Path $project_path -Parent
$build_path = "$workspace_path/out/build/$cmake_config"
$install_path = "$workspace_path/out/install/$cmake_config"

# 开始操作
New-Item -Path $build_path -ItemType Directory -Force
Push-Location $build_path
try
{
	cmake -G "Ninja" $workspace_path `
		--preset "$cmake_config"

	if ($LASTEXITCODE)
	{
		throw "配置失败"
	}

	ninja -j12
	if ($LASTEXITCODE)
	{
		throw "编译失败"
	}

	ninja install
}
finally
{
	Pop-Location
}

Push-Location $install_path
try
{
	arm-none-eabi-objcopy -O binary `
		"$install_path/bin/${project_name}.elf" `
		"$install_path/bin/${project_name}.bin"

	$jflash_arg_array = @(
		"-openprj${workspace_path}/jflash-project.jflash",
		"-open${install_path}/bin/${project_name}.bin,0x8000000",
		"-auto",
		"-startapp",
		"-exit"
	)

	$jflash_arg = $jflash_arg_array -join " "
	$jflash_arg = $jflash_arg.Trim()
	Write-Host $jflash_arg

	Start-Process -FilePath "JFlash.exe" `
		-ArgumentList $jflash_arg `
		-WindowStyle Normal `
		-Wait

	if ($LASTEXITCODE)
	{
		throw "将 ${project_name}.bin 下载到单片机失败。"
	}

	Write-Host "将 ${project_name}.bin 下载到单片机成功。"
}
finally
{
	Pop-Location
}

创建 task.json

在 vscode 项目根目录下的 .vscode 目录创建 task.json 文件

填入以下内容:

json 复制代码
{
	"version": "2.0.0",
	"tasks": [
		{
			"label": "stflash-release-download",
			"type": "shell",
			"command": "pwsh",
			"args": [
				"./stflash-release-download.ps1"
			],
			"options": {
				"cwd": "${workspaceFolder}/test"
			},
			"problemMatcher": []
		},
		{
			"label": "stflash-debug-download",
			"type": "shell",
			"command": "pwsh",
			"args": [
				"./stflash-debug-download.ps1"
			],
			"options": {
				"cwd": "${workspaceFolder}/test"
			},
			"problemMatcher": []
		},
		{
			"label": "jlink-debug-download",
			"type": "shell",
			"command": "pwsh",
			"args": [
				"./jlink-debug-download.ps1"
			],
			"options": {
				"cwd": "${workspaceFolder}/test"
			},
			"problemMatcher": []
		},
		{
			"label": "jlink-release-download",
			"type": "shell",
			"command": "pwsh",
			"args": [
				"./jlink-release-download.ps1"
			],
			"options": {
				"cwd": "${workspaceFolder}/test"
			},
			"problemMatcher": []
		},
	],
}
  • args 是传递给 pwsh 进程的参数,向它传递 ps1 文件。
  • cwd 是启动 pwsh 进程时赋予它的当前路径,将它改成刚刚创建的 ps1 文件所在的目录。

创建 launch.json

在 vscode 项目根目录的 .vscode 目录创建 launch.json 文件

填入以下内容

json 复制代码
{
	// 使用 IntelliSense 了解相关属性。
	// 悬停以查看现有属性的描述。
	// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
	"version": "0.2.0",
	"configurations": [
		{
			"name": "ST-Link Debug",
			"preLaunchTask": "stflash-debug-download",
			"cwd": "${workspaceFolder}/out/install/gcc-debug/bin/",
			"executable": "${workspaceFolder}/out/install/gcc-debug/bin/test.elf",
			"request": "launch",
			"type": "cortex-debug",
			"runToEntryPoint": "main",
			"servertype": "stlink",
			"showDevDebugOutput": "raw",
			"liveWatch": {
				"enabled": true,
				"samplesPerSecond": 4
			},
		},
		{
			"name": "JLink Debug",
			"preLaunchTask": "jlink-debug-download",
			"cwd": "${workspaceFolder}/out/install/gcc-debug/bin/",
			"executable": "${workspaceFolder}/out/install/gcc-debug/bin/test.elf",
			"request": "launch",
			"type": "cortex-debug",
			"runToEntryPoint": "main",
			"servertype": "jlink",
			"showDevDebugOutput": "raw",
			"device": "STM32H743II",
			"liveWatch": {
				"enabled": true,
				"samplesPerSecond": 4
			},
			"serverArgs": [
				"-if",
				"JTAG"
			],
		}
	]
}

CMakePresets.json

附上我的 CMakePresets.json 文件的内容。这不是本文要讲述的。本文只讲述如何在已经配置好 cmake 和 GNU 工具链的情况下配置 JLINK

json 复制代码
{
	"version": 3,
	"configurePresets": [
		{
			"name": "options",
			"hidden": true,
			"cacheVariables": {
				"platform": "arm-none-eabi-cortex-m7",
				"obj_copy": "arm-none-eabi-objcopy",
				"CMAKE_SYSTEM_PROCESSOR": "arm",
				"CMAKE_SYSTEM_ARCH": "armv7-m",
				"CMAKE_SYSTEM_NAME": "Generic",
				"CMAKE_C_COMPILER": "arm-none-eabi-gcc",
				"CMAKE_CXX_COMPILER": "arm-none-eabi-g++",
				"CMAKE_ASM_COMPILER": "arm-none-eabi-gcc",
				"CMAKE_LINKER": "arm-none-eabi-ld",
				"CMAKE_SIZE": "arm-none-eabi-size",
				"CMAKE_STRIP": "arm-none-eabi-ld"
			},
			"vendor": {
				"microsoft.com/VisualStudioSettings/CMake/1.0": {
					"intelliSenseMode": "linux-gcc-arm",
					"disableExternalAnalysis": true
				}
			}
		},
		{
			"name": "gcc-debug",
			"displayName": "gcc-debug",
			"inherits": "options",
			"generator": "Ninja",
			"binaryDir": "${sourceDir}/out/build/${presetName}",
			"installDir": "${sourceDir}/out/install/${presetName}",
			"cacheVariables": {
				"CMAKE_BUILD_TYPE": "Debug"
			}
		},
		{
			"name": "gcc-release",
			"displayName": "gcc-release",
			"inherits": "options",
			"generator": "Ninja",
			"binaryDir": "${sourceDir}/out/build/${presetName}",
			"installDir": "${sourceDir}/out/install/${presetName}",
			"cacheVariables": {
				"CMAKE_BUILD_TYPE": "Release"
			}
		}
	]
}
相关推荐
巴渝小禹1 天前
【VSCODE】使用技巧
vscode
snow@li1 天前
VSCode:学习手册 / 全景梳理与深度分析
ide·vscode
郭老二2 天前
【ROS2】vscode配置头文件路径等
vscode
不厌 -_-2 天前
VSCode 中 Markdown 转 PDF
vscode·pdf
友人.2272 天前
补充章节:VSCode Wokwi 无法可视化连线?在线 Wokwi 网页拖拽绘图方案
ide·vscode·编辑器
赵庆明老师3 天前
Vben精讲:04-了解VSCode中的Git
ide·git·vscode
fenghx2583 天前
仅用于个人记录:火狐有网,Vscode的codex连不上
vscode·编辑器
00后程序员张3 天前
iOS 打包方式汇总 从 Xcode Archive 到轻量级工具链的 IPA 构建
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
Balabala噗3 天前
VScode接入MiniMax流程
ide·vscode·编辑器
星云_byto5 天前
五分钟从零配置好VSCode + Claude Code + DeepSeek V4 Pro
ide·vscode·编辑器·cursor·codex·claude code·deepseekv4