[STM32]从零开始的STM32 DEBUG问题讲解及解决办法
一、前言
最近也是重装了一次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”代码都可以正常运行:

这样,我们程序卡死的问题就解决了。
四、结语
以前我的教程都比较偏向教程向,但是随着学习的知识越多,遇到的问题也越多,偶尔用自己的文章来记录自己遇到问题以及解决问题的过程,当然,我也希望我的文章能够帮助到大家,那么最后,感谢大家的观看!
相关文章:
[STM32]从零开始的STM32 DEBUG问题讲解及解决办法
一、前言 最近也是重装了一次keil,想着也是重装了,也是去官网下载了一个5.41的最新版,在安装和配置编译器和别的版本keil都没太大的区别,但是在调试时,遇到问题了,在我Debug的System Viewer窗口中没有GPIO&…...
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…...
服务器禁止操作汇总(Server Prohibits 0peration Summary)
服务器禁止操作汇总 一、禁忌操作TOP10 1. 直接断电关机 💥 血泪案例:某物流公司运维拔电源强制关机,导致数据库事务中断,20万订单状态丢失。 📌 技术解析: • 直接断电可能引发: ✅ 文件系统…...
UE5 Slate类的基础创建
创建一个slate类的基础代码 #pragma onceclass SCustomDetailPlane : public SCompoundWidget {SLATE_BEGIN_ARGS(SCustomDetailPlane){}SLATE_END_ARGS()public:SCustomDetailPlane();~SCustomDetailPlane();void Construct(const FArguments& InArgs);};***************…...
springboot2.7.18升级springboot3.3.0遇到的坑
druid的警告,警告如下: 运行警告2025-02-28T09:20:31.28508:00 WARN 18800 --- [ restartedMain] trationDelegate$BeanPostProcessorChecker : Bean com.alibaba.druid.spring.boot3.autoconfigure.stat.DruidSpringAopConfiguration of type [com.a…...
服务器IPMI用户名、密码批量检查
背景 大规模服务器部署的时候,少不了较多的网管和监测平台,这些平台会去监控服务器的性能、硬件等指标参数,为了便于管理和控制,则需要给服务器IPMI带外管理添加较多的用户,这就需要对较多的服务器检查所对应的IPMI用…...
JAVA面试_进阶部分_netty面试题
1.BIO、NIO 和 AIO 的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。 伪异步 IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO&#x…...
小红书湖仓架构的跃迁之路
作者:李鹏霖(丁典),小红书-研发工程师,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函数,经过包装器包装后屏…...
如何判断邮件列表中邮箱地址的有效性?
判断邮件列表中邮箱地址的有效性,对于提高邮件送达率、避免资源浪费和维护发件人信誉至关重要。以下是一些实用的判断方法: 一、使用专业的邮箱验证工具 市面上有许多专业的邮箱验证工具,如 Geeksend邮箱验证工具 等。这些工具通过与邮件服…...
翻译: 深入分析LLMs like ChatGPT 二
监督微调(SFT) 使用人工标注的对话数据集(如1M条"用户-助手"对话)继续训练模型。 标注员遵循指导原则编写理想回答,使模型学习助手的回应风格。 示例对话格式: [系统] 你是一个有帮助的AI助手……...
conda怎么迁移之前下载的环境包,把python从3.9升级到3.10
克隆旧环境(保留旧环境作为备份) conda create -n cloned_env --clone old_env 在克隆环境中直接升级 Python conda activate cloned_env conda install python3.10 升级 Python 后出现 所有包导入失败 的问题,通常是因为依赖包与新 Pyth…...
k8s之pod的调度之污点与容忍污点,什么是污点? 如何容忍污点
在 Kubernetes 中,污点(Taint) 和 容忍(Toleration) 是用于控制 Pod 调度到特定节点的重要机制。污点允许节点拒绝某些 Pod 的调度,而容忍则允许 Pod 忽略节点的污点,从而调度到特定节点上。 1.…...
Linux切换Python版本
1、更新apt sudo apt update2、查询python安装路径 which python 或者which python33、查询安装版本 # 查看所有以 "python" 开头的命令(包括版本号) ls -l 安装路径* 例如 ls -l /usr/bin/python*4、修改软连接 udo unlink /usr/bin/pyt…...
TCP的三次握手与四次挥手:建立与终止连接的关键步骤
引言 TCP(传输控制协议)工作在OSI模型的传输层。OSI模型将计算机网络功能划分为七个层级,从底层到顶层依次是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。传输层负责在网络节点之间提供可靠的端到端通信&a…...
2025计算机考研复试资料(附:网课+历年复试真题+140所高校真题+机试)
目录 2025 计算机考研复试经验全攻略,附超全资源🎁 (一)网课资源 (二)历年复试真题 (三)140 所高校真题 二、专业知识复习篇 (一)复试专业课程 二&…...
Milvus高性能向量数据库与大模型结合
Milvus | 高性能向量数据库,为规模而构建Milvus 是一个为 GenAI 应用构建的开源向量数据库。使用 pip 安装,执行高速搜索,并扩展到数十亿个向量。https://milvus.io/zh Milvus 是什么? Milvus 是一种高性能、高扩展性的向量数据…...
【Groovy】流程控制
1 选择结构 Groovy 中选择结构主要包含 if -else、switch 语句,并且可以返回结果。 1.1 if-else def score 85 if (score > 90) {println("优秀") } else if (score > 80) {println("良好") } else if (score > 60) {println("…...
腾讯游戏完成架构调整 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系列产品…...
什么是 MGX:MetaGPT
什么是 MGX:MetaGPT MetaGPT是由思码逸(OpenDILab)团队开发的一款专注于生成式AI驱动的软件开发框架,MGX可能是其衍生或升级的相关成果,它创新性地将大语言模型引入软件开发流程,模拟人类软件团队的协作方式,能让用户通过自然语言描述需求,即可自动生成完整的软件项目,…...
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 …...
一个借助ai分析市场交易数据的流程方法
回答和代码借助 AI 生成,仅供参考,不构成任何专业建议。 如有投资损失请自负盈亏。 一个提取比特币的不同周期数据,并进行文本的初步分析的程序。 用途:把文本提供给ai,进行深度思考,从而达到一个相对比较…...
安装electron 提示RequestError: certificate has expired
最近需要开发electron,遇到了一个生产问题,使用了很多办法都不生效。 现在记录下具体情况 一执行 yarn add electron 就开始报错 [2/4] 🚚 Fetching packages... [3/4] 🔗 Linking dependencies... [4/4] 🔨 B…...
Flutter状态管理框架GetX最新版详解与实践指南
一、GetX框架概述 GetX是Flutter生态中轻量级、高性能的全能开发框架,集成了状态管理、路由导航、依赖注入等核心功能,同时提供国际化、主题切换等实用工具。其优势在于代码简洁性(减少模板代码约70%)和高性能(基于观…...
详细对比所有开源许可及其不同版本
qwen 以下是基于知识库内容对常见开源许可证及其不同版本的详细对比,重点突出版本间差异和核心条款变化: 1. GPL(GNU General Public License) 版本: v2 vs v3 GPLv2(1991): 要求衍生代码开源,…...
【企业场景】上线的项目如何进行限流
一、常见的四种速率限流算法 对于限流,最为直接的就是速率限流了 固定窗口算法 比如 10r/s 就是把时间线分为 1s 一段,也就是周期为 1s,对一个时间段的请求进行计数,超过 10 则舍弃,未超过则直接处理经过 1s 后&…...
git - study
文章目录 git - study概述可以用 git gui工具来添加快捷命令工具如果要在提交日志中搜索,可以用gitk的view编辑功能实验环境直接用git自带环境进行git操作的好处查看git所有配置配置全局数据配置项目专用的数据查询配置数据的原始值配置git使用的文本编辑器获取某个…...
