【ARM Cortex-M 系列 2.1 -- Cortex-M7 Debug system registers】
请阅读【嵌入式开发学习必备专栏】
文章目录
- Debug system registers
- 中断控制状态寄存器(ICSR)
- Debug Halting Control and Status Register, DHCSR
- Debug 寄存器DCRSR与DCRDR
- CPU 寄存器读操作
- CPU 寄存器写操作
- CPU 寄存器选择
- CPU 寄存器读写示例
- 调试故障状态寄存器(DFSR)
Debug system registers
在ARMv7架构中,调试功能通过一系列的系统控制块(System Control Block, SCB)寄存器来提供。这些寄存器不仅帮助开发者诊断程序运行中的错误,还提供了硬件故障的详细信息。以下是SCB中与调试相关的重要寄存器和标志位的介绍:
中断控制状态寄存器(ICSR)
ICSR 寄存器可在应用程序中用于:
- 设置和清除系统异常的挂起状态,其中包括 SysTick、PendSV 和 NMI。
- 通过读取 VECTACTIVE 可以确定当前执行的异常/中断编号。
另外,调试器还可利用该寄存器确定中断状态。VECTACTIVE 域和 IPSR 相同。
- 中断控制和状态寄存器(SCB->ICSR,0xE000ED04)

debug 寄存器小结:

Debug Halting Control and Status Register, DHCSR

-
C_DEBUGEN: Enables debug.
启用调试。这只能由 AHB-AP 修改,而不是由软件修改。它在软件进行写入时将被忽略,软件不能设置或清除它。当写入 C_HALT 来暂停CPU时,内核必须向它写入 1。当外部debugger将该bit配置从0修改为1时 必须同时将 域C_MASKINTS(bit[3])置0。 -
C_Halt:Halts the core.
暂停 cpu。当CPU停止时,该位自动设置。例如断点。此位在CPU reset 时清除。该位只能在C_DEBUGEN为 1 时写入,否则将被忽略。- 当设置该位为 1 时,且 C_DEBUGEN 置位时,将会将cpu halt住;
- 当CPU 处于 debug state时,将该bit写0,将会退出 debug state。
-
C_STEP, bit[2]:单步调试使能bit。 -
C_MASKINTS, bit[3]:当debug 模式使能后,也即C_DEBUGEN配置为1后,外部 debugger 可以通过配置该bit来屏蔽ysTick 和 外部其它中断。 -
C_SNAPSTALL, bit[5]:设置此位为1允许调试器请求不精确地进入调试状态。C_SNAPSTALL提供了一种机制,通过它调试器可以请求处理器进入调试状态,而不需要等待具体的断点触发。这对于那些需要在特定条件下暂停处理器执行,但又不依赖于精确断点位置的调试场景特别有用。
当处理器执行加载(load)或存储(store)指令时,可能会遇到“阻塞”(stalled)的情况。这种情况通常发生于数据无法立即从内存中被访问时,例如因为缓存未命中(cache miss)、访问外设或者内存争用等原因。阻塞的加载或存储指令需要等待相关数据可用后才能完成其操作。下面详细介绍这一过程及其影响。可以通过配置C_SNAPSTALL 让 阻塞的 load 或者store强制结束。
-
S_REGRDY:
调试内核寄存器选择器寄存器上的寄存器读/写可用。 为1表示最后一次传输完成。 -
S_HALT
当 S_HALT 为高时,表示处于调试状态 -
S_SLEEP
表示内核正在休眠.WFI、WFE 或 SLEEP-ON-EXIT, 必须使用 C_HALT 来获得控制权或等待中断唤醒。 -
S_LOCKUP:
如果内核正在运行(未停止)并且存在锁定条件,则读取为 1。 -
S_RETIRE_ST: I表示自上次读取后指令已完成。 这是一个在读取时清除的粘性位。 这确定核心是否在加载/存储或获取时停止。 -
S_RESET_ST
表示自从上次读取该位以来,内核已被复位或正在被复位。 这是一个在读取时清除的粘性位。 因此,读取两次并得到 1 然后 0 意味着它在过去被重置。 读取两次并获得 1 意味着它现在正在重置(仍然保持在重置状态)。
Debug 寄存器DCRSR与DCRDR
与调试功能有关的,还有NVIC中另外两个寄存器。它们分别是:调试内核寄存器选择者寄存器(DCRSR),以及调试内核寄存器数据寄存器(DCRDR)。调试器需要通过这两个寄存器来访问处理器的寄存器,并且只有在处理器停机时,才能使用这里的寄存器传送功能。
DCRSR:

DCRDR:

CPU 寄存器读操作
使用DCRSR和DCRDR这两个寄存器来读取内核的寄存器的内容,则必须按如下的顺序做:
- 确定处理器已停机
- 往
DCRSR写数据来选择读CPU的哪个寄存器,其中bit[16]要为0,表示这是要读数据 - 查询,直到
DHCSR.S_REGRDY=1 - 读取
DCRDR以获取寄存器的内容
CPU 寄存器写操作
寄存器写操作的顺序与上面的类似:
- 确定处理器已停机
- 往
DCRDR中写数据 - 往
DCRSR写数据来选择准备写CPU的哪个寄存器,其中bit[16]要为1,表示这是要写数据 - 查询,直到
DHCSR.S_REGRDY=1
NOTE: 使用DCRSR和DCRDR来访问寄存器,只适用于停机模式。
CPU 寄存器选择
DCRSR bit[16] 用标志是读操作还是写操作:
0Read1Write
DCRSR bits[6:0] 用于选择要操作哪个寄存器:
0b0000000-0b0001100:选择寄存器R0-R120b0001101:选择寄存器 SP0b0001110:选择寄存器 LR0b0001111:DebugReturnAddress0b0010000:xPSR0b0010001:Main stack pointer, MSP0b0010010Process stack pointer, PSP.0b0010100Bits[31:24] CONTROL.- Bits[23:16] FAULTMASK.
- Bits[15:8] BASEPRI.
- Bits[7:0] PRIMASK.
0b0100001:Floating-point Status and Control Register, FPSCR.
CPU 寄存器读写示例
写操作:
#define REGW_FLAG BIT(16)
#define S_REGRDY BIT(16)int cpu_reg_write(uint32_t reg, uint32_t val)
{uint32_t data, try = 5;mcu_write(DCRDR, val);mcu_write(DCRSR, REGW_FLGA | reg);mcu_read(DHCSR, &data);while ((data & S_REGRDY) == 0x0 && try) {log_warn("wait for transfer complete\n");try--;}if (!try) {log_err("write gpu mcu reg failed\n");return -1;}return 0;
}
读操作:
uint32_t cpu_reg_read(uint32_t reg, uint32_t *pdata)
{uint32_t data, try = 5;mcu_write(DCRSR, reg);mcu_read(DHCSR, &data);while ((data & S_REGRDY) == 0x0 && try) {log_warn("wait for transfer complete\n");try--;}if (!try) {log_err("write gpu mcu reg failed\n");return -1;}mcu_read(DCRDR, pdata);return 0;
}
调试故障状态寄存器(DFSR)
DFSR(Debug Fault Status Register)是SCB的一部分,提供了与调试相关的故障信息。它指示了最后一次调试事件的原因,例如硬件断点触发或访问违例。DFSR寄存器包括以下几个关键字段:

- HALTED:当处理器因调试请求而停止时,该位被设置。 C_HALT 和 C_STEP 请求都会触发该位置位。
- BKPT:当执行到PFB中硬件断点时或者软件断点指令BKPT指令时,该位被设置。
- DWTTRAP:当数据观察点和追踪(Data Watchpoint and Trace, DWT)单元检测到匹配事件时,该位被设置。
- VCATCH:当向量捕捉事件发生时,该位被设置。
- EXTERNAL:当由于外部调试请求而停止时,该位被设置。
DFSR为开发者提供了关于程序为何停止的直接线索,是调试过程中不可或缺的资源。
相关文章:
【ARM Cortex-M 系列 2.1 -- Cortex-M7 Debug system registers】
请阅读【嵌入式开发学习必备专栏】 文章目录 Debug system registers中断控制状态寄存器(ICSR)Debug Halting Control and Status Register, DHCSR Debug 寄存器DCRSR与DCRDRCPU 寄存器读操作CPU 寄存器写操作CPU 寄存器选择CPU 寄存器读写示例 调试故障…...
深入解析C#中的async和await关键字
文章目录 一、异步编程的基本概念及其在C#中的实现二、async关键字的定义及其用法三、await关键字的定义及其用法示例代码:使用async和await编写一个简单的异步程序 四、async和await的优点注意事项 五、C#下async和await中常见问题汇总1. 异步方法中的await调用2. …...
【VUE.js】前端框架——未完成
基于脚手架创建前端工程 环境 当安装node.js时,它本身就携带有npm命令。(-v 查版本号)安装VUE CLI npm i vue/cli -g(全局) 创建 vue create 【project name】 镜像源解决方案 输入创建命令后,提示检查更…...
开源的文件压缩和解压缩软件7-Zip
7-Zip是一款开源的文件压缩和解压缩软件,它支持多种压缩格式,包括自有的7z格式以及常见的ZIP、RAR、TAR等格式。下面是对7-Zip的详细介绍,包括其功能特点、使用方法、优缺点等方面的内容。官网:7-Zip 1. 功能特点: 多…...
搜维尔科技:Patchwork 3D 新功能:爆炸视图动画
Patchwork 3D新功能:爆炸视图动画 为什么使用 Patchwork 3D? Patchwork 3D 软件有助于将 CAD 数据转换成真实感的 3D 模型以用于工业用途。 Patchwork 3D 可轻松进行实时渲染,有助于缩短设计周期,或者让您获得效果逼真的渲染图&…...
Redis——RedLock、Zookeeper及数据库实现分布式锁
在分布式系统中,实现分布式锁是确保数据一致性和防止并发问题的重要手段。以下是使用Redis的RedLock算法、ZooKeeper以及数据库实现分布式锁的基本概念和步骤: 1. Redis的RedLock算法 Redis的RedLock算法是Redis官方推荐的一种分布式锁实现方式&#x…...
OpenSSL自签证书并基于Express搭建Web服务进行SSL/TLS协议分析
OpenSSL自签证书并基于Express搭建Web服务进行SSL/TLS协议分析 起因 最近在学习安全协议,大多数实验都是基于Windows下IIS,或者Linux下nginx搭建的Web服务,搭建环境和编写配置文件比较麻烦。而且我有多个不同环境的设备,折腾起来…...
记录一次 vue2 前端项目整合过程
整合成功效果图 具体说明: 项目A是现在的vue2前端项目,项目B是一个开源的工作流前端,项目后端代码已经整合了,就不多提了。这里主要记录下前端整合的过程和思路。 1、开源工作流里面的功能,拷贝到自己对应的vue2项目里…...
物联网五层架构分析
物联网五层架构分析 随着科技的迅速发展,物联网(IoT)作为日常生活中不可或缺的一部分,已融入人们的生活和工作中。物联网五层架构,包括感知层、网络层、数据层、应用层和业务层,扮演着关键的角色。 感知层 …...
【Java EE】多线程(三)线程状态
📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更…...
FFmpeg常用API与示例(一)—— 工具库篇(av_log、AVDictionary、avio)
工具层 1.av_log 可以设置日志的级别,这个看看名字就明白了,也不用过多的解释。 AV_LOG_PANICAV_LOG_FATALAV_LOG_ERRORAV_LOG_WARNINGAV_LOG_INFOAV_LOG_VERBOSEAV_LOG_DEBUG void test_log() {/ av_register_all();AVFormatContext *pAVFmtCtx NU…...
日志的基本用法
目标 1. 掌握如何设置日志级别 2. 掌握如何设置日志格式 3. 掌握如何将日志信息输出到文件中 1. logging模块 Python中有一个标准库模块logging可以直接记录日志 1.1 基本用法 import logging logging.debug("这是一条调试信息") logging.info("这是一条…...
什么是页分裂、页合并?
数据组织方式 在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table IOT)。 行数据,都是存储在聚集索引的叶子节点上的。而我们之前也讲解过InnoDB的逻辑结构图: 在I…...
软件2班20240513
第三次作业 package com.yanyu;import java.sql.*; import java.util.ResourceBundle;public class JDBCTest01 {public static void main(String[] args) {ResourceBundle bundle ResourceBundle.getBundle("com/resources/db");// ctrl alt vString driver …...
嵌入式学习-时钟树
时钟树 时钟分类 时钟树框图 LSI与LSE HSI、HSE与PLL 系统时钟的产生 AHB、APBx的时钟配置 相关寄存器 寄存器部分的细节内容请参考手册。 相关库函数...
对博客系统基本功能进行自动化测试(Junit + Selenium)
环境搭建: 浏览器: 本次测试使用Chrome浏览器在jdk的bin目录下安装对应浏览器驱动(尽量选择与浏览器版本相近的驱动)chromedriver.storage.googleapis.com/index.htmlJunit依赖: <!-- https://mvnreposit…...
《换你来当爹》:AI驱动的养成游戏,探索虚拟亲子关系的新模式
AI技术如何重塑我们对游戏互动的认知 在人工智能技术的浪潮下,一款名为《换你来当爹》的AI养成游戏,以其创新的互动模式和个性化体验,吸引了游戏爱好者的目光。这款游戏利用了先进的LLM技术,通过AI实时生成剧情和图片,…...
在idea中使用vue
一、安装node.js 1、在node.js官网(下载 | Node.js 中文网)上下载适合自己电脑版本的node.js压缩包 2、下载完成后进行解压并安装,一定要记住自己的安装路径 一直点击next即可,这部选第一个 3、安装成功后,按住winR输入…...
Linux系统编程:进程控制
1.进程创建 1.1 fork函数 fork()通过复制调用进程来创建一个新进程。新进程称为子进程,是调用进程的精确副本 进程,但以下几点除外: 子进程有自己的PID,此PID与任何现有进程组的ID不匹配子进程的父进程ID…...
Android 异常开机半屏重启代码分析
Android 的稳定性是 Android 性能的一个重要指标,它也是 App 质量构建体系中最基本和最关键的一环;如果应用经常崩溃,或者关键功能不可用,那显然会对我们的留存产生重大影响所以为了保障应用的稳定性,我们首先应该树立…...
stm32f4 + Helix + Max98357播放mp3文件
stm32f4的SDIO + FataFs读取SD卡文件在前面的文章中已经实现,下面的配置和修改基于之前的配置实现 配置I2S 模式设置 参数设置 DMA配置 勾选 SPI2 global interrupt 以上都配置完Helix 解码出来的 PCM 数据就发给 MAX98357了 Helix解码库移植...
AI学习 Newsletter 的手工感设计:从断点驱动到可追溯实践
1. 项目概述:这不是一份 newsletter,而是一份 AI 社区共建的实践手记 “Learn AI Together — Towards AI Community Newsletter #14”——看到这个标题,你第一反应可能是:又一份 AI 领域的资讯汇总?点开看看最新论文…...
520遇见AI:猛犸AI智能体训练增长营第15期深圳圆满落幕
一束玫瑰,一场关于未来的对话。 2026年5月20日,猛犸AI智能体训练增长营第15期在深圳南山正式开课。课程伊始,GEO理论奠基人罗小军为每一位到场的100余名学员送上了一束玫瑰花——这一天恰逢520,这束花,是猛犸AI送给每一…...
魔兽争霸III终极优化指南:让你的经典游戏在现代系统上焕发新生
魔兽争霸III终极优化指南:让你的经典游戏在现代系统上焕发新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III在Window…...
Agent 时代的开发者技能树重构指南
1. 标题选项 核心关键词:AI Agent、开发者转型、技能树重构、职业跃迁 《Agent 时代降临:普通开发者的技能树重构全指南,从CRUD Boy到AI应用工程师的跃迁之路》 《别再只会写CRUD了!AI Agent浪潮下,你必须掌握的新技能树体系》 《从软件开发到AI Agent开发:2024年开发者技…...
2026破圈!5款AI论文工具实测,摆脱无效加班,初稿质量效率翻倍
对于学生、科研工作者而言,论文写作往往面临诸多挑战:文献资料筛选耗时冗长、格式排版反复调整、查重率难以精准控制、研究逻辑梳理不够清晰,这些痛点严重制约了写作效率与学术成果的规范性。随着2026年AI技术的持续突破,各类AI论…...
千问 LeetCode 2569. 更新数组后处理求和查询 TypeScript实现
这道题的核心是高效维护 nums1 的区间反转操作,因为数据规模达到 10^5,暴力反转会超时。下面给出 TypeScript 实现,采用线段树 懒标记的方案。function handleQuery(nums1: number[], nums2: number[], queries: number[][]): number[] {con…...
AI导演系统:编排角色扮演,让多智能体协作效率飙升10倍
🧑💻 博主介绍 & 诚邀关注 作者:专注于 Java、Python、前端开发的技术博主 | 全网粉丝 30 万 在校期间协助导师完成毕业设计课题分类、论文格式初审及代码整理工作;工作后持续分享毕设思路,助力毕业生顺利完成…...
独立开发者如何利用Taotoken同时管理多个AI项目的模型调用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何利用Taotoken同时管理多个AI项目的模型调用 对于独立开发者而言,同时维护多个小型产品是常态。每个产品…...
免费高效的窗口放大神器:Magpie让Windows显示效果翻倍提升
免费高效的窗口放大神器:Magpie让Windows显示效果翻倍提升 【免费下载链接】Magpie A general-purpose window upscaler for Windows 10/11. 项目地址: https://gitcode.com/gh_mirrors/mag/Magpie 还在为老旧游戏或软件在4K显示器上显示模糊而烦恼吗&#x…...
