在 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 中的 Delete CR 问题
ide·vscode·编辑器
taoismimortal17 小时前
vscode目录,右键菜单加入用VSCode打开文件和文件夹(快速解决)(含删除)(脚本)
ide·vscode·编辑器
猫咪的白手套18 小时前
解决VSCode中“#include错误,请更新includePath“问题
ide·vscode·编辑器
天安彩21 小时前
mac下 vscode 运行 c++无法弹出窗口
c++·vscode·macos·clang
白日与明月1 天前
Hive-vscode-snippets
hive·hadoop·vscode
橘子味的茶二1 天前
vsCode如何远程服务器不需要每次输入密码
服务器·ide·vscode
Tipriest_1 天前
libgmp库(GNU高精度算术库)介绍
gnu·gmp·高精度算术库
William.csj1 天前
VSCode——python选择解释器消失的解决办法
vscode·编辑器
滴水成川1 天前
现代 C++ 开发工作流(VSCode / Cursor)
开发语言·c++·vscode·cursor
Eiceblue2 天前
PDF转Markdown - Python 实现方案与代码
开发语言·vscode·python·pdf