实现vscode上用gdb调试stm32

news2024/10/5 20:41:38

实现vscode上用gdb调试stm32

这周负责编写设备的某个模块,其中遇到了一些变量地址不正确的错误,按理这种底层变量错误用gdb一类的调试器就能很快查到,可是初入嵌入式一行,此C语言非彼C语言,对于gdb怎么对接到项目上根本一无所知,问了下周边同事,发现他们居然都是直接打串口日志来调试的,那岂不是每次遇到问题都得在代码上留一堆丑陋的printf? 我对如此原始的调试方式实在不服气,便想找到相关的对接工具,我的开发习惯是在vscode上写好代码后再在keil上编译烧录,由于keil的界面和操作实在令我难以接受,因此我的需求就是找到在vscode上找到调试单片机的方法,一开始我以为占工作时间一两小时就调通了,结果发现课题复杂度远超出自己的预期,只好乖乖放弃,在代码上不断加入丑陋的printf。。。。。。

等到周末,终于有时间研究了,总之就是不断搜索踩坑,整了两天,总算完事,现作记录。

我使用的是江科大的stm32c8t6开发板,仿真器用的st-link-v2。

1.下载openocd

gdb对于stm32的调试需要借助一个gdb server, st-link和Jlink都有自带的gdbserver, 我这里选择用openocd作为板子的gdbserver,实际上openocd除了调试还可以烧录,感兴趣的可以自己深入研究下,附一张板子,openocd,pc机之间的关系:

v2-aac3a16fbd3a81fc5de0a1e76d9ae483_1440w

openocd尽量选新的,我这里是windows平台,用的xpack-0.11.0版本,之前用的0.10.0版本跟cotrexDebug扩展组合莫名会出行gdb server超时的错误。

这里附openocd的下载地址:https://github.com/xpack-dev-tools/openocd-xpack/releases

后面关于如何烧录及开gdb server可自行查找。

2.下载arm-gnu-toolchains

arm平台有专属的gcc,gdb,make等工具用于arm系列开发板的开发,stm32的开发和调试工具就靠这些,下载:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads

windows平台用户可选择:

image-20230806164552347

3.MinGW

在windows下作C/C++开发的同学应该很熟,不作赘述,这里记个坑,官方下载的时候总是遇到The file has been downloaded incorrectly,据说是网络问题导致,直接下官网的压缩包又太慢,真的无力。好在已经有好心人贴了百度链接,如下:https://pan.baidu.com/s/1mIq_Vbn2w45L_B-AGJk0ww?pwd=gv1s

参考:

Mingw快捷安装教程 并完美解决出现的下载错误:The file has been downloaded incorrectly

4.Cotrex-Debug下载及配置

参考:https://blog.csdn.net/qq_40833810/article/details/106713462

注意那个configFile可根据相对路径来填,另外别把单词写错了,当时由于把interface写成interfaces卡了一整晚。。。。

executable部分写keil的axf文件或者bin文件都可以,前者确保output选项打勾了Debug Information!

5.STM32CubeMX

对于STM32,Cotrex-Debug只支持调试其HAL库的代码,对于板子相关的库函数的代码貌似不支持,我试过,拿江科大的库代码版本烧进板子后vscode F5调试,gdb没响应,显然是不兼容。目前stm32开发已经是HAL库的天下了,一个HAL库兼容st下所有型号的板子,这么高效的开发,怎么能不学呢?看来当时应该买正点的板子的,然而太贵了。。。。

STM32CubeMX是ST公司为其开发板做的专属项目生成工具,支持MDK-ARM和makefile两种编译方法,各位同学可根据自身需求选择自己的编译方式, 它就是用的HAL库,而且似乎只能用HAL库,如果学的板子相关标准库的同学(江科大就是stm32f103的标准库)得多做点功课。。。。

另外这东西可以图形化配置芯片的IO口和时钟,最后生成相关的配置代码,还挺方便的。。。

拿江科大的LED闪烁实验来说,原代码是这样:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	while (1)
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_0);
		Delay_ms(500);
		GPIO_SetBits(GPIOA, GPIO_Pin_0);
		Delay_ms(500);
		
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
		Delay_ms(500);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
		Delay_ms(500);
		
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);
		Delay_ms(500);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);
		Delay_ms(500);
	}
}

在STM32CubeMX里面可以预先把IO口设置好,我这里由于PA0和System-WKUP冲突改选了PA1,将PA1设置为推挽输出的操作如图:

image-20230806170425314

最后generate code可在MX_GPIO_Init()一行看到, 自己的配置已经被落实了:

static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);

  /*Configure GPIO pin : PA1 */
  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;	//HAL库中LOW,MEDIUM,HIGH三档分别对应库函数的2MHZ,10MHZ,50MHZ
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}

闪烁灯代码如下:

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
    HAL_Delay(500);
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
    HAL_Delay(500);
  
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

6.最终效果

在vscode的launch.json上配置好:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Cortex Debug",
            "cwd": "${workspaceFolder}",
            "request": "launch",
            "type": "cortex-debug",
            "runToEntryPoint": "main",
            "servertype": "openocd",
            "configFiles": [
                "interface/stlink.cfg",
                "target/stm32f1x.cfg"
            ],
            "executable":"build/mdk_arm_test.axf",
            "svdFile": "D:/Arm/Packs/Keil/STM32F1xx_DFP/2.2.0/SVD/STM32F103xx.svd",
        }
    ]
}

用之前STM32CubeMX生成的HAL库的代码直接在keil上面编译烧录。

image-20230806172855964

然后上vscode, F5开启调试,成功!尽情享受吧!

image-20230806171846136

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/841736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

冠达管理投资前瞻:三星加码机器人领域 大信创建设提速

上星期五,沪指高开高走,盘中一度涨超1%打破3300点,但随后涨幅收窄;深成指、创业板指亦强势震动。截至收盘,沪指涨0.23%报3288.08点,深成指涨0.67%报11238.06点,创业板指涨0.95%报2263.37点&…

vue 在方法里用字符串赋值图片路径获取不到,提示找不到图片

原因 直接通过字符串赋值命名路径是不会生效的,如 this.file1"../assets/addmodel/TAR.png" 因为在Vue模板中直接使用字符串赋值的方式不会被解析为正确的资源路径。 你可以使用动态绑定(v-bind 或简写为 :)来设置图片的路径。…

基于Spring Boot的医院预约挂号网站设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频: 基于Spring Boot的医院预约挂号网站设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java spring…

边写代码边学习之LSTM

1. 什么是LSTM 长短期记忆网络 LSTM(long short-term memory)是 RNN 的一种变体,其核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径,让信息能在序列连中传递下去。你可以将其看作网络的“记忆”。理论上讲&a…

K8S系列文章之 使用Kind部署K8S 并发布服务

简单介绍 kind 即 Kubernetes In Docker,顾名思义,就是将 k8s 所需要的所有组件,全部部署在一个docker容器中,是一套开箱即用的 k8s 环境搭建方案。使用 kind 搭建的集群无法在生产中使用,但是如果你只是想在本地简单…

从零开始学Python(Ⅰ)基本变量与数据类型

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Python的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.关于Python的基本知识(变量…

python爬虫之scrapy框架介绍

一、Scrapy框架简介 Scrapy 是一个开源的 Python 库和框架,用于从网站上提取数据。它为自从网站爬取数据而设计,也可以用于数据挖掘和信息处理。Scrapy 可以从互联网上自动爬取数据,并将其存储在本地或在 Internet 上进行处理。Scrapy 的目标…

ffmpeg+nginx实现rtsp协议摄像头web端播放

ffmpegnginx实现rtsp协议摄像头web端播放 环境准备准备nginx环境添加rtmp模块添加hls转发 使用ffmpeg,将摄像头rtsp转为rtmp并推送到nginxVLC播放验证 环境准备 nginx(需要安装rtmp模块)ffmpeg 6.0vlc播放器(本地播放验证&#x…

这个酒店管理方法太酷了!赶紧试试吧

安全是酒店管理中最重要的优先事项之一,酒店保障住客和员工的生命安全是不可妥协的责任。为了有效预防和应对潜在的火灾风险,引入烟感监控系统是一种普遍且高效的解决方案。 烟感监控系统通过及时检测烟雾和火源,及时发出警报和采取措施&…

Nacos单点部署

文章目录 一、Nacos概述二、部署Nacos(1)容器部署 三、注册服务四、整合外部的Mysql(单节点) 一、Nacos概述 Nacos是什么? Nacos的全称是Dynamic Naming and Configuration Service,是阿里巴巴推出来的一个…

系统函数和状态方程的转换

1.问题介绍 之前碰到这样一个问题:给定一个正弦信号以及系统传递函数,利用该系统传递函数进行卡尔曼滤波。 利用卡尔曼进行滤波首先要知道系统的状态方程,那么题目只给了系统传递函数,如何能够得到状态方程呢? 首先…

C++ 多线程:std::future

std::future std::future 简介示例1博客引用来源 std::future 简介 我们前面介绍的std::thread 是C11中提供异步创建多线程的工具,只能是异步运行任务,却无法获取任务执行的结果,一般都是依靠全局对象,全局对象在多线程下是及其不…

Python连接Hive实例教程

一 Python连接hive环境实例 经在网络查询相关的教程,发现有好多的例子,发现连接底层用的的驱动基本都是pyhive和pyhs2两种第三方库的来连接的 hive,下面将简介windows 10 python 3.10 连接hive的驱动程序方式,开发工具:pycharm …

API接口统一管理

API接口统一管理 在开发项目的时候,接口可能很多需要统一管理。在src目录下去创建api文件夹去统一管理项目的接口;这样便于后期维护和团队开发。 axios二次封装 对于axios不熟悉的话,建议先学习这篇文章:Axios的基本使用 在开发项目的时候避免不了与后…

日销千单!TikTok Shop正成为部分东南亚卖家的首选平台...

TikTok Shop 正在成为一些东南亚卖家首选的电商平台,凭借娱乐购物模式获得年轻消费者青睐,他们已经可以通过该平台实现日销 5000 单。 作为字节跳动旗下全球短视频平台,TikTok 的电商功能可能会撼动这个拥有 6.7 亿人口、目前由 Shopee、Laz…

[Docker实现测试部署CI/CD----构建成功后钉钉告警(7)]

目录 15、钉钉告警创建项目群,然后添加机器人添加机器人Jenkins 系统配置项目配置修改Jenkinsfile文件,添加钉钉提示信息测试 不修改Jenkinsfile文件,添加钉钉提示信息测试 15、钉钉告警 创建项目群,然后添加机器人 首先需要在钉…

探索Python数据容器之乐趣:列表与元组的奇妙旅程!

文章目录 零 数据容器入门一 数据容器:list(列表)1.1 列表的定义1.2 列表的下表索引1.3 列表的常用操作1.3.1 列表的查询功能1.3.2 列表的修改功能1.3.3 列表常用方法总结 1.4 补充:append与extend对比1.5 list(列表)的遍历1.6 补…

浏览器同源策略

浏览器同源策略 同源策略:是一个重要的浏览器的安全策略,用于限制一个源的文档或者它加载的脚本如何能与另一个源的资源进行交互 它能帮助阻隔恶意文档,减少可能被攻击的媒介 例如:被钓鱼网站收集信息,使用ajax发起…

MongoDB 入门

1.1 数据库管理系统 在了解MongoDB之前需要先了解先数据库管理系统 1.1.1 什么是数据? 数据(英语:data),是指未经过处理的原始记录。 一般而言,数据缺乏组织及分类,无法明确的表达事物代表的意…

基于IMU和超声的3D手势识别笔

随着科技的发展,人机交互在商业中有了越来越多的应用。面对日益复杂的交互场景,手势识别逐渐成为虚拟现实等相关应用的主要交互手段。 3D手势识别是一个具有挑战性的问题,常用的手势传感器有三种基本类型:多点触摸屏传感器、基于视…