在Linux环境下使用JLink编译烧录调试Cortex-M芯片
一.前言二.准备工作2.1 环境搭建2.2 VSCode导入项目2.3 安装插件
三.编译3.1 编写脚本3.2 配置脚本
四.调试4.1 添加环境4.2 添加启动脚本4.3 使用
五.后记
一.前言
本文是基于makefile+Jlink+GDB+VScode插件进行一键编译下载烧录 所以前提条件是需要一个Jink和你的工程是用makefile进行的(当然你不用makefile也行,但是必须得有.bin or .hex or .elf)。为什么一定要Jlink,后面再说。 这里就随便用STM32CUBEMX构建一个工程。
二.准备工作
2.1 环境搭建
编译、烧录、调试的核心都是利用VScode执行脚本,所以需要手动编写脚本,并导入到VScode的配置中,一键执行。为了使Shell程序能够正确执行命令,我们需要添加环境。
Jlink:核心是使用JLinkExe进行烧录,下载地址:https://www.segger.com/downloads/jlink/。 需要通过.deb安装JLink驱动,否则需要自行添加环境。直到在shell环境下运行命令JLinkExe能出现以下界面(得插上Jlink哦): arm-gcc:下载地址https://developer.arm.com/downloads/-/gnu-rm下载解压,并在shell里根据喜好添加环境变量,比如/etc/environment, 我就在.bashrc里添加了,具体流程如图: 保存后,在shell里输入:arm-none-eabi-gcc -v,会出现gcc version的版本号, 输入arm-none-eabi-gdb会出现gdb的信息: 如果缺少文件,可以试试:sudo apt-get install libncurses5
附上刚才的添加环境的代码:
gedit .bashrc
export PATH=$PATH:/home/kanna/gcc-arm-none-eabi-10.3-2021.10/bin
source .bashrc
2.2 VSCode导入项目
打开VSCode主界面,左上角点击File-Open Folder,选择项目根目录即可:
修改代码权限:若以前使用eclipse会导致某些文档需要root权限,而由于VSCode的保护机制,我们并没有这些权限。如果项目存在root权限的文档,需要在根目录使用命令sudo chmod -R 777 ./*,会将所有目录与子目录修改为当前用户的权限。
2.3 安装插件
离线安装,需要在插件商城https://marketplace.visualstudio.com/vscode下载离线包.vsix然后手动选择离线包安装。当然也可以左侧商店栏搜索安装
必须安装:
C/C++ 提供C语言代码编写支持Cortex-Debug 提供可视化调试
离线通过以下方式安装插件:
三.编译
3.1 编写脚本
在项目的根目录,也就是在Makefile同级目录下创建:flash.sh,写入并赋予权限
#!/bin/bash
JlinkScript="./flash.jlink"
if [ -f $JlinkScript ]; then
rm $JlinkScript
fi
touch $JlinkScript
echo h > $JlinkScript
echo loadfile $1 >> $JlinkScript
echo r >> $JlinkScript
echo g >> $JlinkScript
echo exit >> $JlinkScript
JLinkExe -device STM32F103C8 -autoconnect 1 -if SWD -speed 4000 -CommanderScript $JlinkScript
更多的命令可以在https://wiki.segger.com/J-Link_Commander查询如果不是hex或需要烧写到指定位置需要添加起始位置。这里的STM32F103C8可以填写Jlink支持的芯片,这就是为什么选Jlink,因为Jlink支持的芯片太多太多辣: 支持以下芯片:https://www.segger.com/downloads/supported-devices.php
然后修改Makefile: 具体什么意思你得去学习makefile的规则才行
flash:all
@echo "start to flash:"
@./flash.sh $(BUILD_DIR)/$(TARGET).hex
脚本添加成功后,在项目目录下用shell使用make flash -j12或make flash等命令,均可实现下载:
3.2 配置脚本
在工程.vscode里添加tasks.json即可使用Build与Run Task..编译、烧录程序,举个最简单的例子:
{
"version": "2.0.0",
"tasks": [
{
"label": "Build",
"type": "shell",
"command": "make all -j12",
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "Download",
"type": "shell",
"command": "make flash -j12",
"problemMatcher": [],
"group": {
"isDefault": false
}
},
]
}
此时有快捷选项和快捷键的Build只是编译
而Run Task...选项手动选择运行的task,然后选择Download即可烧录
因为根据真实情况,通过编译验证代码是否有误的情况最多,所以将有快捷键和默认任务的Build绑定为编译。Download可以手动选择使用,亦或者通过Debug时自动烧录。当然,你也可修改自己的task.json执行自定义任务,毕竟VScode的核心是调用外部脚本。
四.调试
4.1 添加环境
安装Cortex-Debug之后,我们需要为该插件配置armToolchainPath和JLinkGDBServerPath两个工具的路径,因为这个配置不在.vscode/下,所以是全局配置
将这两个工具的绝对路径添加到全局设置里(JlinkGDBServer一般就在这):
"cortex-debug.armToolchainPath": "/home/kanna/gcc-arm-none-eabi-10.3-2021.10/bin",
"cortex-debug.JLinkGDBServerPath": "/opt/SEGGER/JLink_V766g/JLinkGDBServer",
4.2 添加启动脚本
因为每一个项目的配置不一样,所以Debug然后根据项目配置,在.vscode/目录下添加launch.json
修改配置:
{
"version": "0.2.0",
"configurations": [
{
"type": "cortex-debug",
"request": "launch",
"name": "Debug (J-Link)",
"cwd": "${workspaceRoot}",
"executable": "./build/C8T6.elf",
"servertype": "jlink",
"device": "STM32F103C8",
"interface": "swd",
"preLaunchTask": "Download",
"runToEntryPoint": "main"
}
]
}
解释一下:
preLaunchTask 可以添加我们在task.json里创建的任务,并且在Debug执行前,自动执行这些插件,所以我们可以添加刚才的烧录任务如果需要开始Debug后自动运行到主函数再暂停,可以将runToEntryPoint修改为true,否则改为false。这样可以更好的跳转到程序入口。该插件的更多脚本命令查询地址:https://lonesometraveler.github.io/2020/03/27/debug.html,可根据里面提供的项目自行配置。
4.3 使用
点击Start Debugging即可:
效果预览:
五.后记
前面.vscode里面的配置和.flash可以自己保存起来,添加到工程里方便。
还有就是使轻量级的编辑器VScode更强大的方式是安装更多的插件,笔者推荐几个:
C++ Intellisense:提供代码补全、实时错误检查与改进等功能
vscode-icons: 为左侧资源目录提供更好的浏览体验,根据文件不同,显示简明的图标
One Dark Pro:一个提供比默认暗色主题代码颜色层次更丰富的主题
如果只使用虚拟机作为一个编译的工具,那么Windows的Linux子系统,Windows Subsystem for Linux(WSL)可能是比虚拟机更好的一个选择。