首页 > 其他分享 >STM32开发之 VS Code + gcc环境编译

STM32开发之 VS Code + gcc环境编译

时间:2022-12-12 21:23:42浏览次数:80  
标签:openocd gcc Code target cfg VS interface 调试 调试器

写在前面:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。

在完成上一篇的 STM32开发之 VS Code + gcc环境编译后,那么就可以根据以下的环境搭建实现下载及在线调试了。


 

目录

 


一、软件下载

OpenOCD:https://gnutoolchains.com/arm-eabi/openocd/

一个开源的片上调试器(Open On-Chip Debugger)。在其他平台上,OpenOCD是要自己 Configure并且自己编译的,但是 Windows平台上提供了编译好的二进制文件,所以只需要下载下来后随便解压出来就好了。安装完成后添加系统环境变量,可以利用 cmd命令:openocd -v测试。


二、搭建调试链接

在这里需要说明的是,OpenOCD文件夹下的 share/openocd/scripts 里面放的就是 openocd在运行时所需要用到的各种配置文件,其中 interface文件夹下放的是关于调试器的配置文件,而 target文件夹放的是目标平台的配置文件,这里我们需要的是 interface/stlink.cfgtarget/stm32l1.cfg,不过不需要复制出来。注:stm32l1.cfg是要选择你的目标芯片对应的文件,可以进入 …\OpenOCD-20200729-0.10.0\share\openocd\scripts\target路径下查找。

连接好 STLink和板子,如果板子的调试接口正常的话;然后在终端控制台里键入命令:openocd -f interface/stlink.cfg -f target/stm32l1.cfg 回车,得到以下信息,即搭建了一个 GDB Server,连通了硬件调试器和 GDB,通过 USB和硬件调试器连接,并且通过 TCP和 GDB连接:

在这里插入图片描述


三、下载配置

当你能正确实现以上操作时,那么,关闭终端显示的窗口,使之退出搭建的 GDB Server链接;然后回到 tasks.json文件里,在原本的 “tasks” 任务标签里再追加以下内容:

{
    "dependsOn":"Build",          // 任务依赖
    "label": "Build and Download",
    "type": "shell",
    "command": "openocd", 
    "args": [
    "-f",
    "interface/stlink.cfg",
    "-f",
    "target/stm32l1.cfg",
    "-c",
    "program ./build/${workspaceFolderBasename}.elf verify reset exit"
    ],
    "problemMatcher": []
}

最后变成:

在这里插入图片描述

这个任务要求先进行 Build任务,然后通过命令打开 openocd,加载两个配置文件(-f interface/stlink.cfg-f target/stm32l1.cfg),同时,这个 -c 的选项后面跟着的就是openocd成功加载后执行的内置命令,这里我们让它下载、验证、reset,然后直接退出,这样就实现了一条龙式的下载。运行这个任务的方法就跟 Build一样,在此就不过多介绍了,最后运行该任务你会发现,这小破板跑起来。

这里其实是经过了进入调试处理的操作,只不过我们让它自动退出了调试模式而已;因为下载和调试的区别是,下载只是把代码加载到芯片里,而不进行调试,也不会切换到调试页面,其实调试就已经会将代码下载到板子上了,所以这里所设置的下载,其实并不是单纯的下载,而是经过了进入调试,退出调试这样的操作,使我们人为的觉得是下载操作。


四、调试配置

在窗口里点击 运行 -> 添加配置:

在这里插入图片描述

接着,如果根据上一篇安装了 Cortex Debug插件,就会出现如下选项(ps:如果窗口打开的是 .c文件或者 .h文件,只会显示前面两个选项,不知道是我电脑问题还是咋的,可以试着切换打开到 .json文件或者打开 makefile文件):

在这里插入图片描述

点击框选的选项,在 .vscode文件里会创建一个 launch.json文件,然后把里面的内容修改成以下样子:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Cortex Debug",
            "cwd": "${workspaceRoot}",  // 输出路径
            "executable": "./build/${workspaceRootFolderName}.elf",    // 要调试的程序
            "request": "launch",
            "type": "cortex-debug",
            "servertype": "openocd",    // 调试器选择
            "device": "STM32L151CB",    // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php
            //"svdFile": "./STM32L15xC.svd",  // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载
            "interface": "swd",
            "configFiles": [
                //"${workspaceRoot}/openocd.cfg",	// *可以通过加载该文件来配置
                "interface/stlink.cfg",
                "target/stm32l1.cfg"
            ],
            "runToMain": false,
            "preLaunchTask": "Build",   // 在调试前预先执行的任务,此处是tasks.json中的
            //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin"    // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径
        }
    ]
}

这里主要就是指定 preLaunchTask,顾名思义就是先运行某个任务后再启动调试,我们这里要先运行前面配置的 Build 任务,意为先编译再进行调试操作;servertype 调试器这里,我们就使用 openocd 就好了,因为它支持各种不同的调试器,若是仅使用Jink,不用其他的调试器,那么,你可以改成 jlink,然后参考:https://zhuanlan.zhihu.com/p/163771273device 是指定 STM32的芯片型号,如果支持,则可以帮助调试器显示外设寄存器的值;configFiles 就是前面说到需要加载的那两个配置文件了(类似于键入命令:openocd –f interface/jlink.cfg –f target/stm32f4.cfg);runToMain 就是选择程序是从 main函数开始加载,还是从汇编代码开始加载,stm32启动都是从 startup_stm32xxx.s开始的,所以这里得选择 false

然后在这里说一下,在configFiles 中,注释了一行,在正常情况下,如果我们不带参数启动(即所谓的单纯键入命令:openocd),openocd就会默认自动查找当前目录下有没有名为 openocd.cfg的文件,并把它作为配置文件来启动。若是你想在利用 openocd.cfg来加载配置,那么就要在工程路径下(对应你在 configFiles所填的路径文件)创建一个 openocd.cfg文件,并添加以下内容:

# 选择调试器为JLink or CMSIS-DAP or STlink
#source [find interface/jlink.cfg]
#source [find interface/cmsis-dap.cfg]
source [find interface/stlink.cfg]

# 选择接口为SWD,jlink下打开
#transport select swd

# 选择目标芯片
source [find target/stm32l1.cfg]

实际上并不推荐这种方式,因为又要创建,又把 launch.json的配置分开了,当整体移植 .vscode文件夹并更换目标芯片时容易出现漏改参数。


五、DEBUG调试

在配置完成以上的 launch.json调试参数后,点击窗口 运行 -> 启动调试(或者直接按 f5),就可以进入 debug模式了:

在这里插入图片描述

 

标签:openocd,gcc,Code,target,cfg,VS,interface,调试,调试器
From: https://www.cnblogs.com/lidabo/p/16977113.html

相关文章

  • VSCode GDB调试配置
    VSCodeGDB调试配置1.vscode启动debug窗口按Ctrl+Shift+D,打开Debug窗口默认是“Noconfigurations”,点击“F5”,会提示你配置GDB参数(选择gccbuildanddebugactive......
  • AtCoder Beginner Contest 281
    A-CountDown(abc281a)题目大意给定\(n\),输出\(n\)到\(1\)。解题思路直接输出即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=l......
  • codeforces 598 div3 Minimize the Permutation(贪心找规律)
    题目大意:有n个排列数。现在定义操作:交换第i和i+1个元素。我们对每个i位置只能操作一次。问经过这种操作后,我们最少能够得到的字典序序列是多少。解题思路:我们贪心从小到大选......
  • codeforces ECR 74 Standard Free2play(找规律)
    题目大意:有一座山,山有h层。每一层都有平台。有些平台凸出来,有些平台是凹进去。主角一开始站在h层平台,他的目标是落到第0层。主角能够下山的方式只有一种:让高为x的平台和高为......
  • codeforces 596 div2 p-binary(数位复杂度压缩)
    题目大意:已知: 同时  ,问k最少为多少。解题思路:首先,我们看到这里有2的n次方,我们考虑能不能从二进制表示下手,我们通过移位来表示:得到公式 ,很直接的想法是我们让k从小到大......
  • atcoder beginner contest 144 Gluttony(二分答案)
    题目大意:有an,bn,我们找到an和bn每个元素的一种一一对应关系。使得min(max(ai*bi))。已知我们可以进行操作让an中的任一个元素减少1。操作数最大为k,问我们怎么操作,可以min(......
  • codeforces 594 div2 Ivan the Fool and the Probability Theory (DP 推公式)
    题目大意:现在有n*m个格子。然后我们可以对这些格子染上黑色或者白色。规定每个格子最多允许相邻1个与它同样颜色的格子,问你我们有多少中不同的染色方案。解题思路:首先考虑1*......
  • leetcode 128 最长连续序列(hash)
    ​​128.最长连续序列​​难度困难437给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。示例:输入: [100,4,200,1,3,2]输出:4解......
  • leetcode 139. 单词拆分(BFS 或者 DP)
    题目大意:给定一个非空字符串s和一个包含非空单词列表的字典wordDict,判定 s是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。......
  • leetcode 155. 最小栈(辅助栈)
    题目大意:设计一个支持push,pop,top操作,并能在常数时间内检索到最小元素的栈。push(x)——将元素x推入栈中。pop() ——删除栈顶的元素。top() ——获取栈顶元素......