文章目录
- 一、开发环境与开发工具的准备
- 1.Ubuntu 18.04 LTS
- 2.Visual Studio Code与插件
- 3.STM32CubeMX
- 4.gcc-arm-none-eabi编译器
- 4.1 介绍
- 4.2 安装
- 5.OpenOCD
- 二、快速生成工程代码
- 三、VS Code进行编译、烧录、调试
- 1.工程源码编译
- 2.OpenOCD烧录
- 3.调试
- 四、编写配置文件实现快速编译烧录调试
- 1.SVD文件
- 2.tasks.json文件
- 3.launch.json文件
- 五、不借助STM32CubeMX,自己构建Makefile文件可行吗?
- 六、理解一些知识
- 1.VS Code软件、C/C++插件和c_cpp_properties.json配置文件的联系
- 2.Makefile和make
- 3.OpenOCD
- 在此感谢以下两篇文章给我提供了很多帮助,有任何错误之处也欢迎指正!
一、开发环境与开发工具的准备
1.Ubuntu 18.04 LTS
是在VMware Workstation上装了Ubuntu 18.04 LTS作为开发用的Linux系统。
2.Visual Studio Code与插件
需要在VS Code中安装ARM Assembly、C/C++、CMake、CMake Tools等插件,Chinese(Simplified)和vscode-icons这两款插件也推荐安装。
1.ARM Assembly插件用于分析Arm assembly语法,工程源码中的启动文件便是ARM汇编文件。
2.C/C++插件用于支持C/C++IntelliSense、调试和代码浏览的功能。
3.CMake和CMake Tools插件用于支持CMake工具,CMake可以较为方便地生成makefile文件(对makefile使用make命令可以生成elf、hex、bin、map等文件)。
4.Chinese(Simplified)插件是简体中文语言包。
5.vscode-icons插件用于显示不同文件的图标。
3.STM32CubeMX
可以直接去ST官网下载注意:以上VMware Workstation、Visual Studio Code、STM32CubeMX软件的安装过程以及如何在VMware Workstation上装Ubuntu系统网上有非常多的教程,这里我就不做详细介绍了。
4.gcc-arm-none-eabi编译器
4.1 介绍
gcc是GNU Compiler Collection的缩写,即GNU编译工具。
arm即ARM架构
none是指没有移植操作系统的处理器
eabi是Embedded Application Binary Interface的缩写,即嵌入式应用二进制接口(它主要描述了如何链接、执行和调试目标代码以及目标代码的生成过程,并且对C和C++等编程语言的接口进行了规定,嗯看个概念就行!)
由于我们是在X86_64架构的PC上去编译ARM架构的C/C++代码,gcc-arm-none-eabi编译器便能完成这样的工作,称之为交叉编译器。
4.2 安装
下载地址注意:这个地址的交叉编译工具链是针对ARM的Cortex-R和Cortex-M架构的,Cortex-A架构下载地址,但目前ARM工具已经整合了针对三种架构的交叉编译工具链:下载地址
1.我使用的是gcc-linaro-11.3.1-2022.06-x86_64_arm-linux-gnueabinf.tar.gz
2.把压缩包放到/usr/local/arm中并解压
3.添加环境变量
sudo vim /etc/profile
export PATH=$PATH:/usr/local/arm/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux/gcc-arm-none-eabi-10.3-2021.10/bin
reboot #重启使得环境变量生效
4.测试
安装成功之后可以查看bin目录下的可执行文件
5.OpenOCD
OpenOCD(Open On-Chip Debugger)是一个开源的的片上调试器,OpenOCD通过连接到目标硬件上的调试接口(如JTAG或SWD)来提供调试功能,使得我们能够用它对芯片进行代码烧录、调试等开发。
1.直接打开终端安装
sudo apt install openocd
2.输入openocd --version可以查看其版本号;连接下载器用lsusb命令可以查看下载器的相关信息
二、快速生成工程代码
关于STM32CubeMX的使用可以网上查找教程,这里只是借用它快速生成一个可以编译烧录的工程,后续并不会使用这个软件。
这里需要完成以下配置:
一是SYS里Debug要选择正确的调试接口;二是时钟树的配置;三是选择生成Makefile文件;四是配置某个GPIO引脚的电平用于点亮LED灯(可选,也可以自行编写代码实现)
三、VS Code进行编译、烧录、调试
用VS Code打开工程目录,工程文件如下图所示。打开main.c后会有一堆红色报错,报错我认为是因为C/C++这个插件分析整个工程源码,发现你没有定义USE_HAL_DRIVER和STM32F407xx(我使用的是STM32F407ZGT6开发板)这两个宏,可以通过修改c_cpp_properties.json配置文件解决问题。具体做法是按下快捷键Ctrl+Shift+p,输入C/C++然后点击Edit Configuration(JSON)
但这里的报错不会影响正常的编译,编译所需的文件是Makefile文件,USE_HAL_DRIVER和STM32F407xx两个宏定义就写在这个文件里!
打开c_cpp_properties.json文件如图,把鼠标移动到相关字段会有相应的解释!
”configuration"字段:用于配置IntelliSense引擎。
"name"字段:配置标识符。
"includePath"字段:搜索包含的标头时,IntelliSense引擎要使用的路径列表。
"defines"字段:分析文件时要使用的IntelliSense引擎的预处理器定义列表。
"cStandard"字段:用于IntelliSense的C语言标准的版本。
"cppStandard"字段:用于IntelliSense的c++语言标准的版本。
"intelliSenseMode"字段:要使用的、映射到MSVC、gcc或Clang的平台和体系结构变体的IntelliSense模式。
"version"字段:配置文件的版本,不要更改!
所以综上所述,建议只修改"includePath"字段和"defines"字段,其余字段保持默认即可。
“includePath"字段的配置是表示当前工作区的文件夹和子文件夹的路径,所以也不需要修改;
"defines"字段添加"USE_HAL_DRIVER"和"STM32F407xx"两个宏定义即可。然后可以看到main.c就不会报错了。
1.工程源码编译
前面在STM32CubeMX配置工程代码时我已经配置了GPIO引脚用于点亮LED灯,所以这里不用编写任何代码,可以直接编译。
按快捷键Ctrl+Shift+`打开VS Code内置终端,输入make命令回车开始编译。(关注一下终端打开时所在的路径,make程序需要读取Makefile文件,而Makefile文件正好位于这个路径下,所以直接输入make命令即可)
编译完成后会出现build文件夹,elf,hex和bin文件都存放在这个文件夹下
2.OpenOCD烧录
首先烧录器连上STM32,另外单独打开一个终端,输入以下指令
openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg
stlink-v2.cfg对应烧录器,支持的烧录器在/usr/share/openocd/scripts/interface
stm32f4x.cfg对应MCU,支持的芯片在/usr/share/openocd/scripts/target
-f参数是指定一个配置文件,这条指令的作用是使用指定的接口配置文件和目标配置文件启动OpenOCD。
回到VS Code的内置终端,分别输入
telnet localhost 4444 通过telnet连接OpenOCD
program 文件夹的绝对路径/build/STM32_Test.hex 烧录hex文件,注意文件路径和文件名称
reset 复位STM32
exit 可以断开与OpenOCD的连接
3.调试
在VS Code内置终端,分别输入
arm-none-eabi-gdb ./build/STM32_Test.elf 使用
target remote localhost:3333 连接到远程GDB Server
接着便可以使用GDB调试指令调试程序
四、编写配置文件实现快速编译烧录调试
1.SVD文件
.在KEIL软件中,.svd、.SFR和.sfd文件的全称是System View Description File、System View Segment File和System View Function File。.svd文件是由开发人员手动创建的,开发人员可以使用.svd文件来生成.SFR文件和.sfd文件。
它们的作用如下:
.svd文件:用于描述目标芯片的引脚和功能,包含了与目标芯片通信所需的寄存器地址和配置信息,用于生成目标芯片的驱动程序和初始化代码。
.SFR文件:用于描述目标芯片的寄存器列表和地址,包含了每个寄存器的名称、大小和位格式,用于生成目标芯片的寄存器读写代码。
.sfd文件:用于描述目标芯片的函数列表和地址,包含了每个函数的名称、参数和返回值类型,用于生成目标芯片的函数调用代码。
在MDK软件安装目录中应该能够找到这三个文件,将对应芯片型号的.svd文件通过文件传输工具下载到Ubuntu的文件系统中(我用的是XFTP 7软件)
2.tasks.json文件
tasks.json是VS Code的内置配置文件,用于定义文件生成等任务。
依次选择"终端">“配置任务”
任选一个选项,不同选项只是生成不同的配置,我们都可以修改
建议
同样简要分析tasks.json的字段
“version"字段:配置的版本号
”task"字段:任务配置
”type"字段:任务类型。
常见的类型有"shell"、“python”、“cppbuild"
“label"字段:任务名称
”command"字段:执行编译的编译器或脚本的路径
“args"字段:其他要传递给编译器或脚本的参数
”options"字段:其他命令选项
"cwd"字段:指定当前工作目录
“group"字段:任务的执行组。该字段用于将任务分组,以便在任务列表中按组显示。
常见的分组有"build”、“test”、“default”
”isDefault"字段:定义该任务是组中的默认任务
“detail"字段:任务的其他详细信息
“problemMatcher"字段:指定如何识别和报告构建产生的错误,可以使用"msvc”、"clang"等
编写如下代码,按快捷键Ctrl+Shif+B选择要运行的任务(即"label"字段指定的任务名称)
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "Build",
"command": "/usr/bin/make",
"args": [],
"options": {
"cwd": "${workspaceFolder}"
},
"group": {
"kind": "build",
"isDefault": true
},
"detail": "编译器: make",
"problemMatcher": []
},
]
}
选择Build可以实现编译的步骤
3.launch.json文件
选择右侧的"运行和调试",“创建launch.json文件”
launch.json是VS Code内置的用于配置启动调试和编译行为的配置文件。
方式一:选择C++(GDB/LLDB)
照例分析launch.json的字段
”name"字段:配置名称
"cwd"字段:当前工作目录
“request"字段:请求配置类型。可以是"launch"或"attach”
"type"字段:配置类型
"miDebuggerPath"字段:MI调试程序(如GDB)的路径
"program"字段:程序可执行文件的完整路径
"targetArchitecture"字段:调试对象的体系结构。允许的值有x86、x64、x86_64、arm、arm64、mips、amd64
"setupCommands"字段:为了安装基础调试程序而执行的一个或多个GDB/LLDB命令
下面的五条GDB指令的作用分别是:
:将程序可执行文件加载到GDB Server
:将目标设备连接到GDB Server
:重置目标设备的所有寄存器与状态
:暂停目标设备的执行
:加载程序可执行文件到目标设备的内存中
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name":"ARM Debug",
"cwd":"${workspaceFolder}",
"request":"launch",
"type":"cppdbg",
"miDebuggerPath": "/usr/local/arm/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gdb",
"program":"/home/zjc/STM32Cube/STM32/STM32_Test/build/STM32_Test.elf",
"targetArchitecture": "arm",
"setupCommands": [
{
"text":"file '/home/zjc/STM32Cube/STM32/STM32_Test/build/STM32_Test.elf'"
},
{
"text":"target remote localhost:3333"
},
{
"text":"monitor reset"
},
{
"text":"monitor halt"
},
{
"text":"load"
},
]
},
]
}
可以在main.c添加一个断点,然后按F5快捷键进入调试
五、不借助STM32CubeMX,自己构建Makefile文件可行吗?
回答当然是可以的,前提是你得懂Makefile语法或者懂如何修改Makefile文件以适配不同的芯片型号。
但CMake和CMake Tools插件可以协助我们构建所需的Makefile文件,相对应的我们需要构建CMakeLists.txt文件(必须是这个名字,注意大小写)
内容写的有点多,这部分内容我就放到下一篇文章来讲述。
六、理解一些知识
1.VS Code软件、C/C++插件和c_cpp_properties.json配置文件的联系
(1)搜索”VS Code软件为什么可以分析C/C++代码?"相关问题,可以更加深入了解。
(2)据我了解,
C/C++插件为VS Code软件提供了对C/C++编程语言的支持,包括语法高亮、代码补全、调试等功能。
IntelliSense引擎是VS Code软件中的一个核心组件,它提供代码补全、语法提示、定义跳转等功能,帮助程序员更加高效地编写代码。
c_cpp_properties.json配置文件包含了项目相关的编译和调试信息,例如编译器路径、包含路径、宏定义等。这些配置信息可以帮助C/C++插件和IntelliSense引擎更好地理解和处理C/C++代码。
因此,要想在VS Code软件中进行C/C++代码分析,需要安装C/C++插件、配置c_cpp_properties.json文件以及使用IntelliSense引擎。
2.Makefile和make
Makefile是一个文本文件,其中包含了描述整个工程如何编译、链接以及生成可执行文件的详细指令。这些指令可以被make命令解释并执行,以完成项目的自动化构建。
3.OpenOCD
OpenOCD扮演的角色是调试器/烧录器的服务器。它会接受并处理来自客户端(如IDE、命令行工具等)的调试命令,然后将这些命令通过调试器/烧录器发送到连接的目标硬件。同时它也接收来自目标硬件的调试信息,然后将这些信息发送给客户端。
这里给出OpenOCD的架构图,可能有助于我们更好地理解。
OpenOCD提供GDB Server,可以通过它进行GDB相关的调试操作。本地终端通过GDB remote protocol与GDB Server连接,默认端口是3333
也提供Telnet Server,可以通过它对目标设备进行烧写、重启等操作。本地终端通过Telent protocol与Telnet Server连接,默认端口是4444
在此感谢以下两篇文章给我提供了很多帮助,有任何错误之处也欢迎指正!
Linux下使用VSCode,GCC,OpenOCD实现STM32一键编译烧录调试(STM32CubeMX篇)使用Vscode 编译 开发 调试 STM32单片机 VScode+openocd+STM32CubeMX+GDB