OpenOCD简明指南

news/2025/11/10 0:12:29/文章来源:https://www.cnblogs.com/lsksp/p/19205581

一、OpenOCD 简介

OpenOCD(Open On-Chip Debugger)是一个开源的片上调试工具,支持多种调试器和目标芯片。它通过 JTAG、SWD 等接口与目标设备通信,提供固件烧录、调试、内存操作等功能。

二、快速烧录固件

2.1 基本烧录命令

openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c "program Project.hex verify reset exit"

命令解析:

  • -f interface/stlink-v2.cfg:指定 ST-Link V2 调试器接口
  • -f target/stm32f1x.cfg:指定 STM32F1 系列目标芯片
  • program Project.hex:烧录 Project.hex 固件
  • verify:验证烧录结果
  • reset:复位芯片
  • exit:退出 OpenOCD

2.2 适用场景

适用于 STM32F1 系列芯片的快速固件烧录,一次性完成烧录→验证→复位全流程。

三、Telnet 调试模式

3.1 启动调试服务

openocd -f interface/cmsis-dap.cfg -f target/stm32g4x.cfg

服务说明:

  • 监听 3333 端口(GDB 调试)
  • 监听 4444 端口(Telnet 交互)
  • 保持终端运行以维持连接

3.2 连接 Telnet

telnet 127.0.0.1 4444

连接成功后进入交互模式,可直接输入 OpenOCD 指令操作目标芯片。

四、基本控制指令

4.1 基本控制指令汇总

指令名称 命令格式 示例 说明
init init init 初始化调试接口和目标芯片
reset reset reset 简单复位芯片
reset run reset run reset run 复位后立即运行程序
reset halt reset halt reset halt 复位后暂停执行(调试常用)
reset init reset init reset init 复位并初始化芯片状态
halt halt halt 暂停目标执行
resume resume resume 从当前地址恢复执行
resume 地址 resume [address] resume 0x08000000 从指定地址开始执行
step step step 单步执行(进入函数)

五、常用操作指令

5.1 内存操作指令

指令名称 命令格式 示例 说明
读 32 位 mdw [addr] [count] mdw 0x08000000 4 读取 4 个 32 位数据
读 16 位 mdh [addr] [count] mdh 0x20000000 5 读取 5 个 16 位数据
读 8 位 mdb [addr] [count] mdb 0x08001000 8 读取 8 个 8 位数据
写 32 位 mww [addr] [value] mww 0x20000000 0x12345678 写入 32 位数据
写 16 位 mwh [addr] [value] mwh 0x20000004 0xABCD 写入 16 位数据
写 8 位 mwb [addr] [value] mwb 0x20000006 0xEF 写入 8 位数据
保存内存 dump_image [file] [addr] [size] dump_image ram.bin 0x20000000 0x1000 保存内存数据到文件

5.2 Flash 操作指令

指令名称 命令格式 示例 说明
探测 Flash flash probe [num] flash probe 0 探测 Flash 设备
显示信息 flash info [num] flash info 0 显示 Flash 详细信息
地址擦除 flash erase_address [addr] [size] flash erase_address 0x08000000 0x1000 按地址范围擦除
扇区擦除 flash erase_sector [num] [first] [last] flash erase_sector 0 0 3 按扇区擦除
烧录固件 flash write_image [erase] [file] [addr] flash write_image erase firmware.bin 0x08000000 烧录固件到 Flash

5.3 程序加载与执行

指令名称 命令格式 示例 说明
程序烧录 program [file] [addr] [verify] [reset] program Project.bin 0x08000000 verify reset 烧录并验证程序
加载到内存 load_image [file] [addr] load_image test.elf 0x20000000 加载程序到 RAM
验证固件 verify_image [file] [offset] verify_image Project.hex 0x00 验证烧录结果
复位运行 reset run reset run 复位后运行程序
指定地址执行 resume [address] resume 0x20000000 从指定地址执行

5.4 调试指令

指令名称 命令格式 示例 说明
显示寄存器 reg reg 显示所有 CPU 寄存器
设置寄存器 reg [name] [value] reg R1 0x1234 设置寄存器值
硬件断点 bp [addr] [length] hw bp 0x08000100 0x01 hw 设置硬件断点
移除断点 rbp [addr] rbp 0x08000100 移除断点
数据监视点 wp [addr] [length] r/w wp 0x20000000 0x04 r 设置数据监视点
单步执行 step step 单步执行(进入函数)
步过执行 next next 单步执行(跳过函数)

六、总结

OpenOCD 是嵌入式开发中强大的调试工具,掌握基本控制指令是有效调试的基础。建议按照标准调试流程操作,结合实际项目多加练习,逐步掌握各种调试场景的应用技巧。

核心要点:

  • 始终以 init开始调试会话
  • 使用 reset halt获得可控的调试起点
  • 善用 step进行精细调试
  • 调试完成后用 reset run恢复正常执行

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

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

相关文章

2025Dec.居家集训游记

在家集训也能叫游记吗? 总所周知每一个OIer都爱写这东西 (欸我CSP-S游记还没写) ,所以在家集训也要写。 DAY1 11.9 有点忘了,游记是10号写的。 好像不安了一天,因为我太菜了,也有点想学校里的朋友。 学习了 kru…

电商财务不求人!一张图看懂工作流程,算清每一笔账 - 智慧园区

做电商公司的财务,是不是经常感觉像个“救火队员”?刷单、推广费、平台账单、多店核算……传统行业那套流程在这里好像失灵了。 别慌!电商账务看似复杂,但只要抓住核心流程,就能化繁为简。这篇文章将带你走一遍电…

OI 笑传 #26

Seikai小清新 DP 回。解说会补的。 Luogu P14460 mx 的 NOIP 模拟 T1,赛时连猜带蒙结果 30min 切了( codeShow me the code #define rd read() #define mkp make_pair #define ls p<<1 #define rs p<<1|…

20232327 2025-2026-1 《网络与系统攻防技术》实验四实验报告

20232327 2025-2026-1 《网络与系统攻防技术》实验四实验报告 1. 实验内容 1.1 本周学习内容 本周学习了恶意代码分析的基本方法,静态分析和动态分析的核心概念。静态分析主要通过代码结构和API调用等特征来识别恶意行…

Gas 优化技巧

Gas 优化技巧 gas 优化技巧并不总是有效 注意复杂性和可读性 这里无法对每个主题进行全面处理 我们不讨论特定应用的技巧最重要的是:尽可能避免零到一的存储写入 缓存存储变量:仅写入和读取存储变量一次 打包相关变量…

2025.11.9总结

用AI写项目,太坐牢,今天继续写项目,用ai写,虽然能写出来,但是这是对于小型功能来说,能写,能改小bug,一旦项目的量级上来的,ai也写不出来。 于是这里就引申出了写项目更高级的做法,将大项目拆分成数个独立的小…

Python与C语言术语及概念差异全景总结

Python与C语言术语及概念差异全景总结 基于“易混淆术语(同名不同义)、对应概念(功能相似名不同)、体系差异(机制完全不同)”的严格分类标准,结合实践中高频踩坑点,系统梳理两种语言的核心差异,全程以表格为核…

Appium vs uiautomator2 优势劣势对比表

Appium vs uiautomator2 优势劣势对比表 本文档提供了Appium和uiautomator2两个Android自动化测试框架的详细对比,帮助开发者根据具体需求选择合适的工具。 核心能力对比表对比维度 Appium + Selenium uiautomator2嵌…

Android自动化测试中的嵌套元素查找

Android自动化测试中的嵌套元素查找 本文档总结了Android自动化测试中各种框架对嵌套元素查找的支持情况,包括实现方式、代码示例和性能对比。 目录支持嵌套查找的框架 Appium + Selenium UiAutomator (原生Java) Esp…

solidity面试题

solidity面试题(一)私有、内部、公共和外部函数之间的区别? 答:私有private只能当前合约内部使用,子合约继承也不能调用;内部internal可以当前合约和子合约调用;公共public合约内部外部和子合约都可以调用;外部…

对象存储基本知识

1 存储桶 存储桶是对象存储的核心组织单元,相当于“云端文件夹”,所有对象(文件、数据)都必须存储在存储桶中,是管理对象的基础载体。 1.1 存储桶的核心定位 存储桶是对象存储的顶层命名空间,用于隔离和管理不同…

基于GF域的多进制QC-LDPC误码率matlab仿真,译码采用EMS算法

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 本课题实现的是四进制QC-LDPC2.算法涉及理论知识概要 多进制QC - LDPC码是一种基于GF域的线性分组码,它具有稀疏的校验矩阵。QC - LDPC码的校验矩…

AtCoder Beginner Contest 431

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 [ABC431F] Almost Sorted 2给一个数组 \(A\) 和一个正整数 \(D(1 \le D \le 10^6)\),求有多少种重排数组 \(A\) 能得到的数组 \(B\)(显然多种完全相同的数组 \(B\) 只算一种)…

基于BPSK调制解调和LDPC编译码的单载波相干光传输系统matlab误码率仿真

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印):2.算法涉及理论知识概要 在单载波相干光传输系统中,光信号作为载波来传输信息。发送端将电信号调制到光载波上,通过光纤传输到接收端。接收端采用…

空间矢量脉宽调制(Space Vector Pulse Width Modulation)SVPWM基础

空间矢量脉宽调制(Space Vector Pulse Width Modulation)SVPWM基础 前面已经了解了如何将复杂的三相电流通过Clarke与park变换解耦为d-q旋转坐标系的控制,因此只要令\(i_d=0\),控制\(i_q\)来控制转矩大小。 下面需…

OI 笑传 #25

me me she感觉落下了好多东西要写,先写写 ABC431。被 E 吓跑了写了 F。 ABC431D 今年 T1 既视感。 首先贪心把幸福感更高的放进头和身子,这样一定最优但是不一定合法。 然后考虑从头里选出一些扔进身子,选的重量最少…

如何有效衡量开发者生产力:超越代码行数的思考

本文深入探讨了如何正确衡量软件开发者的生产力,批判了传统的代码行数指标,提出了基于产品价值输出的衡量方法,并针对不同开发角色给出了具体度量建议。衡量开发者生产力 几乎从我开始致力于改善软件工程师生活的那…

2025-11-blog

11/1/blog1 我的编程学习之旅:为什么开启这个博客 今天,我决定开始记录自己的编程学习之路。 这个想法的种子,来源于许多像「阮一峰的网络日志」那样优秀的个人博客。它们不仅分享了知识,更留下了一个人的思考轨迹…

科研项目申报

人工智能(工信部)2025年人工智能产业及赋能新型工业化创新任务揭榜挂帅隐私保护

关于apk安装包的解包与签名重新打包

关于apk安装包的解包与签名重新打包点击查看代码 #反编译并清理旧签名 apktool d mzt.apk -o f -f rmdir /s /q f\original\META-INF#新建强签名 keytool -genkeypair ^-v -keystore my-release-key.keystore ^-alias …