[STM32]从零开始的STM32 DEBUG问题讲解及解决办法

news2025/3/1 19:19:50

一、前言

        最近也是重装了一次keil,想着也是重装了,也是去官网下载了一个5.41的最新版,在安装和配置编译器和别的版本keil都没太大的区别,但是在调试时,遇到问题了,在我Debug的System Viewer窗口中没有GPIO,IIC,SPI等寄存器。刚遇到的时候还是比较疑惑的,然后去网上找了比较多的资料,发现大部分的办法都是将魔术棒下的Target下方的“Use Custom File”打勾,然后选择一个SFR,听起来是非常简单,但是,我根本就没这个SFR文件啊!当然,这是遇到的第一个Debug中的问题,然后就是,我每次调试一步,箭头走过的地方就变成绿色,代码也会跑到奇怪的地方去。最后就是,代码卡死在汇编的“BX  R0”处。以上就是我在使用Debug时遇到的问题,在本次教程中,我会教大家如何一一解决上面的问题,如果你准备好了,那就让我们开始吧!

二、谁适合本次教程

        在我之前的教程中,应该告诉过大家,优秀的代码是通过反复的调试得来的,只盯着代码看是很难看出问题的。所以,在嵌入式开发中,调试可以说是一个非常重要的技能。如果你是一名嵌入式小白,你仍然可以收藏本文章,以备不时之需。如果你是一名嵌入式大佬,也可以通过这篇文章拓宽自己的知识面。所以,总的来说,不管你嵌入式基础如何,都可以观看本篇文章,在以后遇到这样的问题以后能够自己进行解决。

三、Debug相关问题及解决方案

        上面我也提到了我在调试的时候遇到的三个问题。现在我们就一一来说明问题并且解决问题吧!

1.System Viewer不显示外设寄存器

        这个问题是出现在我使用寄存器去配置GPIO口时出现的,因为最近在准备一篇讲解GPIO相关寄存器的文章,我在调试时就发现,我无法在System Viewer窗口找到我要调试的寄存器,具体页面如下:

可以看到,我的System Viewer窗口中只有“Core Peripherals”并没有其它的寄存器,这就非常奇怪。在网络上的方法都是将下面图中的“Use Custom File”的勾上:

然后选择一个SFR文件。我在选择SFR文件的时候,发现我连别的文章中描述的路径都没有更别说这个文件了。后面找了半天,找到了一些svd文件。将这些文件选中以后,发现也不行。

这里从我自己的角度出发,推断问题的话,我认为是我的keil版本太高了所以不存在其它文章中描述的路径和文件。当然,问题已经出了,现在最主要的就是解决问题。现在我们就一起来看看吧!

在寻找了大量的方法之后,找到了一个有效的方法,因为我们不是没有SFR文件吗?那就索性自己生成一个文件。这里生成SFR文件会用到keil内部的一个工具,这里我们先去到keil的安装路径,可以看到以下文件和文件夹:

这里我们是使用原本的SVD文件来生成一个SFR文件,这里先带大家找一下SVD文件在哪儿,这里我们先进入keil安装目录下的“Keil”文件夹:

进来以后,就能看到我们已经安装的芯片包对应的文件夹:

这里每种芯片包对应的调试文件不一样,所以这里大家要找到自己要调试的芯片的文件夹,这里我调试的是STM32F1系列的芯片,所以,我就进入“STM32F1xx_DFP”,进入以后,就能看到一个版本号的文件夹:

进入这个版本号的文件夹就能看到下面的文件和文件夹了:

这里我们进入这个文件夹下的SVD文件夹:

进入以后,就能看到许多SVD为后缀的文件了,并且还分了芯片的型号,这就是我们要找的SVD文件了,后面我们就用这些SVD文件来生成SFR文件:

这里大家记住这个文件夹的路径,等会儿会用到。

然后我们去找生成SFR文件的工具,这里我们去到keil安装目录下的“UV4”文件夹:

进入UV4文件夹以后,我们往下滑找到“SVDConv.exe”文件:

这就是我们用来生成SFR文件的可执行文件了。下面我们来生成以下SFR文件。这里我们就在“SVDConv.exe”文件所在的目录右键打开终端:

这里我们需要在终端中使用“SVDConv.exe”文件。

我们在终端中输入下面的命令:

./SVDConv.exe D:\MDK-ARM\Keil\STM32F1xx_DFP\2.3.0\SVD\STM32F103xx.svd --generate=sfr

这里的“D:\MDK-ARM\Keil\STM32F1xx_DFP\2.3.0\SVD\STM32F103xx.svd”是我SVD文件的路径,大家换成自己的即可。这里要注意“SVDConv.exe”前面的“./”不可缺少。

输入命令回车以后,我们就可以看到一堆日志过去了:

最后我们看到没有错误,就表示转换已经完成了:

我们这里再次回到UV4文件夹中,我们可以看到,相关的SFR文件已经生成在UV4文件夹中了:

为了方便,我们将其剪切到原本存放SVD文件的文件夹中,如图所示:

完成上面的步骤以后,我们启动我们要调试的工程,然后点击魔术棒:

在魔术棒中,我们将“Use Custom File”打勾:

然后在路径选项中,我们将刚刚生成的SFR文件选中进来:

最后点击OK即可:

然后我们启动调试,就能看到“System Viewer”下已经有寄存器了:

这样,我们System Viewer下没有寄存器的问题就解决了。

2.调试箭头走过后框框变为绿色

        下面这个问题就是,当我们调试时,箭头走过一个地方以后,我们的箭头一栏的框框变为了绿色,并且代码运行逻辑混乱。这里我们直接看效果:

这里我们可以看到,代码运行过去以后,我们的箭头一栏就变为绿色了而且也不知道代码跑到哪儿去了。

这里的解决办法也比较简单,我们这里还是点击魔术棒:

然后点击“Debug”:

这里我们点击“Use”:

完成上面的步骤以后,我们再次调试就没有问题了:

这样,框框变为绿色的问题我们就解决了。

3.调试时程序卡死在BX  R0处

        这个问题是我在调试中点击了复位以后遇到的。假如说,我进入调试,然后第一遍将下面的代码调试到了while处:

然后点击“RST”:

代码回到起始,继续调试,就发现代码调试到“BX  R0”处就不动了:

我们点击这个“x”,就出现了非常神奇的现象,箭头指向了while:

这就非常神奇了。但是解决办法非常简单。我们结束调试。然后点击“魔术棒”:

这里我们将魔术棒中的“Use MicroLIB”打上勾即可。

最后点击“OK”:

完成上面的步骤以后,我们将代码重新全局编译,然后下载到单片机中。我们再次开始调试,发现就没有上面的问题了,不管我们按几次“RST”代码都可以正常运行:

这样,我们程序卡死的问题就解决了。

四、结语

        以前我的教程都比较偏向教程向,但是随着学习的知识越多,遇到的问题也越多,偶尔用自己的文章来记录自己遇到问题以及解决问题的过程,当然,我也希望我的文章能够帮助到大家,那么最后,感谢大家的观看!

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

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

相关文章

MySQL当中的Lock

1. 总览锁的类型 锁的类型: 锁类型 符号/缩写 描述 全局锁 FTWRL 锁定整个数据库(FLUSH TABLES WITH READ LOCK),用于全库备份。 表级锁 - 表锁 S/X LOCK TABLES ... READ(共享锁)或 WRITE&#…

electron-builder打包时github包下载失败【解决办法】

各位朋友们,在使用electron开发时,选择了electron-builder作为编译打包工具时,是否经常遇到无法从github上下载依赖包问题,如下报错: Get "https://github.com/electron/electron/releases/download/v6.1.12/ele…

【免费】YOLO[笑容]目标检测全过程(yolo环境配置+labelimg数据集标注+目标检测训练测试)

一、yolo环境配置 这篇帖子是我试过的,非常全,很详细【cudaanacondapytorchyolo(ultralytics)】 yolo环境配置 二、labelimg数据集标注 可以参考下面的帖子,不过可能会出现闪退的问题,安装我的流程来吧 2.1 labelimg安装 label…

服务器IPMI用户名、密码批量检查

背景 大规模服务器部署的时候,少不了较多的网管和监测平台,这些平台会去监控服务器的性能、硬件等指标参数,为了便于管理和控制,则需要给服务器IPMI带外管理添加较多的用户,这就需要对较多的服务器检查所对应的IPMI用…

小红书湖仓架构的跃迁之路

作者:李鹏霖(丁典),小红书-研发工程师,StarRocks Contributor & Apache Impala Committer 本文整理自小红书工程师在 StarRocks 年度峰会上的分享,介绍了小红书自助分析平台中,StarRocks 与 Iceberg 结合后&#x…

C++-第十七章:包装器

目录 第一节:std::function 第二节:std::bind 2-1.基本介绍 2-2.调整顺序(不常用) 2-3.调整个数 2-4.std::bind与std::function 下期预告: C中有3种可调用对象:函数指针、仿函数对象、lambda函数,经过包装器包装后屏…

TCP的三次握手与四次挥手:建立与终止连接的关键步骤

引言 ‌TCP(传输控制协议)工作在OSI模型的传输层‌。OSI模型将计算机网络功能划分为七个层级,从底层到顶层依次是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。传输层负责在网络节点之间提供可靠的端到端通信&a…

2025计算机考研复试资料(附:网课+历年复试真题+140所高校真题+机试)

目录 2025 计算机考研复试经验全攻略,附超全资源🎁 (一)网课资源 (二)历年复试真题 (三)140 所高校真题 二、专业知识复习篇 (一)复试专业课程 二&…

Milvus高性能向量数据库与大模型结合

Milvus | 高性能向量数据库,为规模而构建Milvus 是一个为 GenAI 应用构建的开源向量数据库。使用 pip 安装,执行高速搜索,并扩展到数十亿个向量。https://milvus.io/zh Milvus 是什么? Milvus 是一种高性能、高扩展性的向量数据…

腾讯游戏完成架构调整 IEG新设五大产品事业部

易采游戏网2月28日独家消息:继1月份腾讯天美工作室群完成内部组织架构调整后,腾讯旗下互动娱乐事业群(IEG)再次宣布对组织架构进行优化调整。此次调整的核心在于新设立了五大产品事业部,包括体育产品部、音舞产品部、V…

达梦数据库系列之安装及Mysql数据迁移

达梦数据库系列之安装及Mysql数据迁移 1. 达梦数据库1.1 简介1.2 Docker安装达梦1.2.1 默认密码查询1.2.2 docker启动指定密码 1.3 达梦数据库连接工具1.3.1 快捷键 2 Mysql数据库迁移至达梦2.1 使用SQLark进行数据迁移 1. 达梦数据库 1.1 简介 DM8是达梦公司在总结DM系列产品…

java jar包内的jar包如何打补丁

问题描述: 主包:hisca.jar,解压后 BOOT-INFO/lib下有其他jar包 因为一个小bug,需要修改这个hisca包下BOOT-INF/lib下的子jar包service-hisca-impl-1.0.0.jar中的一个service类及xml文件 操作步骤: 1、主包jar -xvf …

【企业场景】上线的项目如何进行限流

一、常见的四种速率限流算法 对于限流,最为直接的就是速率限流了 固定窗口算法 比如 10r/s 就是把时间线分为 1s 一段,也就是周期为 1s,对一个时间段的请求进行计数,超过 10 则舍弃,未超过则直接处理经过 1s 后&…

git - study

文章目录 git - study概述可以用 git gui工具来添加快捷命令工具如果要在提交日志中搜索,可以用gitk的view编辑功能实验环境直接用git自带环境进行git操作的好处查看git所有配置配置全局数据配置项目专用的数据查询配置数据的原始值配置git使用的文本编辑器获取某个…

FPGA之硬件设计笔记-持续更新中

目录 1、说在前面2、FPGA硬件设计总计说明3、 原理图详解 - ARITX - 7 系列3.1 顶层框图介绍3.2 FPGA 电源sheet介绍:3.2.1 bank 14 和 bank 15的供电3.2.2 bank 0的供电3.2.3 Bank34 35 的供电 3.3 核电压和RAM电压以及辅助电压 4 原理图详解-- Ultrascale ARTIX4.…

嵌入式开发:傅里叶变换(5):STM32和Matlab联调验证FFT

目录 1. MATLAB获取 STM32 的原始数据 2. 将数据上传到电脑 3. MATLAB 接收数据并验证 STM32进行傅里叶代码 结果分析 STM32 和 MATLAB 联调是嵌入式开发中常见的工作流程,通常目的是将 STM32 采集的数据或控制信号传输到 MATLAB 中进行实时处理、分析和可视化…

Cursor AI编程-详细教程

一点准备工作 Cursor方法论:简单到没有方法 Cursor能做什么 Cursor官网:https://www.cursor.com/ja Cursor文档:Cursor – Welcome to Cursor Cursor论坛:Weekly - Cursor - Community Forum 写程序代码 举例: 设…

(十 三)趣学设计模式 之 模版方法模式!

目录 一、 啥是模板方法模式?二、 为什么要用模板方法模式?三、 模板方法模式的实现方式四、 模板方法模式的优缺点五、 模板方法模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式&a…

泛型编程、函数模板、类模板

目录 一、泛型编程 1.泛型编程提出背景 1.1.代码复用案例解析 案例1:实现一个交换函数,并对不同类型参数进行函数重载 (1)调试 (2)代码解析 ①代码复用问题 ②泛型编程的解决方案 ③上面泛型Swap函数模版的优点 1.2.泛型编程提出背景 2.泛型编…

【Vue3】浅谈setup语法糖

Vue3 的 setup 语法糖是通过 <script setup> 标签启用的特性&#xff0c;它是对 Composition API 的进一步封装&#xff0c;旨在简化组件的声明式写法&#xff0c;同时保留 Composition API 的逻辑组织能力。以下是其核心概念和原理分析&#xff1a; 一、<script setu…