Bootstrap

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

安装 JLINK

JLINK 官网链接
在这里插入图片描述
下载安装后找到安装路径下的可执行文件
在这里插入图片描述
将此路径添加到环境变量的 Path 中。

创建 JFlash 项目

打开 JFlash,选择新建项目
在这里插入图片描述
选择单片机型号
在这里插入图片描述
在弹出的窗口中搜索单片机
在这里插入图片描述
其他参数根据实际情况填写
在这里插入图片描述
新建完成:
在这里插入图片描述
接下来设置一下项目
在这里插入图片描述
把 Start Application 勾上,复位方式选择通过复位引脚复位。如果没有这个硬件条件则使用软件复位。
在这里插入图片描述
最后保存工程
在这里插入图片描述
在这里插入图片描述

编写 powershell 脚本

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

# 项目参数
$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

# 项目参数
$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 文件
在这里插入图片描述
填入以下内容:

{
	"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 文件
在这里插入图片描述
填入以下内容

{
	// 使用 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

{
	"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"
			}
		}
	]
}

;