用pyocd读写gd32f4系列mcu的otp区

news2024/11/15 8:58:03

gd32f450

如前一篇文章所述,pyocd是一个调试、编程cortex-m单片机的简单、强大的工具,本文就结合实例讲解pyocd的一些用法。

使用j-link、dap-link等工具在keil或其它ide中调试单片机程序的场景比较常见,而使用这些工具对单片机片内和片外flash存储区进行编程在生产环节也是非常重要的步骤,本文就以gd32f4系列单片机otp区的烧写为例,讲解pyocd的用法。

准备工作

pyocd并没有内置对gd32f4系列单片机的支持,需要先安装包:

# 以gd32f425为例进行查找
❯ pyocd pack find gd32f425
  Part         Vendor       Pack                      Version   Installed  
---------------------------------------------------------------------------
  GD32F425RE   GigaDevice   GigaDevice.GD32F4xx_DFP   3.0.3     True
  GD32F425RG   GigaDevice   GigaDevice.GD32F4xx_DFP   3.0.3     True
  GD32F425RK   GigaDevice   GigaDevice.GD32F4xx_DFP   3.0.3     True
  GD32F425VG   GigaDevice   GigaDevice.GD32F4xx_DFP   3.0.3     True
  GD32F425VK   GigaDevice   GigaDevice.GD32F4xx_DFP   3.0.3     True
  GD32F425ZG   GigaDevice   GigaDevice.GD32F4xx_DFP   3.0.3     True
  GD32F425ZK   GigaDevice   GigaDevice.GD32F4xx_DFP   3.0.3     True

# 我已经安装了,所以上面输出的"Installed"为"True"
# 没有安装的话需要进行安装
# 安装后再执行上面的命令应该输出相似的结果
❯ pyocd pack install GigaDevice.GD32F4xx_DFP

这样就可以用pyocd连接gd32f4系列的mcu了。

使用 j-link 或 dap-link 等 pyocd 支持的调试器连接mcu,还是以gd32f425为例:

# 列出当前连接的调试器
❯ pyocd list
  #   Probe/Board            Unique ID      Target  
----------------------------------------------------
  0   wch.cn WCH CMSIS-DAP   0001A0000001   n/a     

# 以命令模式连接目标器件
❯ pyocd cmd -t gd32f425rg
0002472 W Invalid coresight component, cidr=0x0 [rom_table]
Connected to GD32F425RG [Running]: 0001A0000001

# 查看存储区map
pyocd> show map
 Region         Type   Start       End         Size        Access  Sector      Page       
 IROM1_0x4000   Flash  0x08000000  0x0800ffff  0x00010000  rx      0x00004000  0x00000400
 IROM1_0x10000  Flash  0x08010000  0x0801ffff  0x00010000  rx      0x00010000  0x00000400
 IROM1_0x20000  Flash  0x08020000  0x080fffff  0x000e0000  rx      0x00020000  0x00000400
 IRAM2          Ram    0x10000000  0x1000ffff  0x00010000  rwx     -           -
 IRAM1          Ram    0x20000000  0x2002ffff  0x00030000  rwx     -           -

这样就已经可以对gd32f425的片内存储区进行编程了。但是如果需要对otp区编程,除了单片机的DFP包以外,还需要用户脚本和otp区编程算法文件,可以点击这里下载。

OTP编程

将下载的压缩包解压至工作目录:

# cd进入压缩包解压的工作目录ls

    Directory: C:\Users\flashalgo\gd32f4xx_otp

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
la---           2022/9/15    18:40          13772 GD32F4xx_OTP.FLM
la---           2022/9/15    18:28            265 pyocd_user.py


# 再次以命令模式连接gd32f425目标板
❯ pyocd cmd -t gd32f425rg
0002408 W Invalid coresight component, cidr=0x0 [rom_table]
Connected to GD32F425RG [Running]: 0001A0000001

# 再次查看存储区map
pyocd> show map
 Region         Type   Start       End         Size        Access  Sector      Page
 IROM1_0x4000   Flash  0x08000000  0x0800ffff  0x00010000  rx      0x00004000  0x00000400
 IROM1_0x10000  Flash  0x08010000  0x0801ffff  0x00010000  rx      0x00010000  0x00000400
 IROM1_0x20000  Flash  0x08020000  0x080fffff  0x000e0000  rx      0x00020000  0x00000400
 IRAM2          Ram    0x10000000  0x1000ffff  0x00010000  rwx     -           -
 otp            Flash  0x1fff7800  0x1fff79ff  0x00000200  rx      0x00000200  0x00000200
 IRAM1          Ram    0x20000000  0x2002ffff  0x00030000  rwx     -           -

可以看到otp区已经加进来了,这样就可以对otp区进行编程了。

我们先来读一下:

# 依然在命令连接模式
pyocd> rb 0x1fff7800
1fff7800:  fe                                                 |.|

pyocd> read16 0x1fff7800
1fff7800:  fffe                                       |..|

pyocd> read32 0x1fff7800
1fff7800:  fffffffe                               |....|

正常情况如果之前没对otp区进行过编程的话,读到的应该是全"1",即otp区所有字节都是0xff,我这个板子因为之前编程过,首字节最低位被写入"0"了。

接下来我们把第一个字节的第2位写入"0":

# 写入'1111 1101',即'0xfd'
pyocd> wb 0x1fff7800 0xfd

# 再次读出
pyocd> rb 0x1fff7800
1fff7800:  fc                                                 |.|

我们发现读出的是0xfc,并不是写入的0xfd,这是因为otp区只能被编程1次,每一位只能从"1"写成"0",不能从"0"再写回"1"。

至此,我们已经对gd32f4系列单片机的otp区进行编程了。需要注意的是,从兆易官方手册上,gd32f403xx系列是没有otp的,其它目前已发布的gd32f4xx系列mcu都是1个512B的OTP区,所以这个算法文件可以支持gd32f4xx全系列。

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

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

相关文章

[ 应急响应基础篇 ] evtx提取安全日志 事件查看器提取安全日志

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

【C++中关于abs()函数的告警问题】“abs“ is ambiguousC/C++(266)

C中关于abs()函数的告警问题 “abs” is ambiguousC/C(266) 在调试异常打卡记录这道华为OD机考题的时候,完成了C版本之后,在vscode进行调试,出现了如下的告警:abs有歧义,所以就开始查找到底是设什么原因: …

MAC-安装Java环境、JDK配置、IDEA插件推荐

背景:发现经常换电脑装环境等比较麻烦,主要还是想记录一下,不要每次安装都到处翻。。 1、下载并安装JDK 到官网下载所需的JDK:https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html 这儿下…

Wine运行器帮助——使用Qemu User运行Wine(理论支持全架构)

提醒 Qemu 的转换效率较低,如果可以的话建议使用其它方案以提升运行效率 此方案理论上支持全架构(amd64、arm64、mips64、loongarch64、riscv64、ppc64、s390x……),只要能跑 Qemu User 即可,在 x86、arm64 真机测试通…

[建议收藏]45 个 Git 经典操作场景,专治各种不会合并代码的童鞋~~

有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。 生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少。

FFmpeg基础

FFmpeg介绍 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码libavcodec,为了保证高可移植性和编解码质量…

老胡的周刊(第086期)

老胡的信息周刊[1],记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。🎯 项目MochiDiffusion[2]在 MacOS 上运行原生的 Stab…

20230412-使用STM32实现内部flash模拟U盘

最近用STM32F103CBT6搞了个U盘功能 ​ 工程师干了几年后,基本会有小外包的生活,算是赚外快吧,搞小钱改善伙食,嘻嘻。。。。 ​ 最近有个客户找到我,说是否通过ST的单片机搞个U盘功能,有些文件通过U盘拖拽…

【Linux进阶篇】系统监控命令

目录 🍁proc文件系统 🍁常见系统监视命令 🍃uptime 🍃free -h 🍃vmstat 🍃mpstat 🍃iostat 🍃sar 🍃iotop 🍃htop 🍃glances 🦐博客主…

Java集合Collections和元素排序之Comparable排序接口讲解

Collections工具类: Java里关于集合的工具类,包含有各种有关集合操作的静态多态方法,不能实例化(把构造函数私有化) 。 和Collection的区别 : Collection是接口,提供了对集合对象进行基本操作的通用接口方法,List、Set…

智能网卡相关知识(smart nic 、DPU)

网卡作为穿行在网络与计算之间的桥梁,是可以解决计算瓶颈的关键硬件。 随着CPU 密度和数据中心网络带宽的进一步提升,用户对预期性能的需求,系统运行平稳性都会有更高的要求。云厂商一方面面临巨大的成本压力,另一方面面临巨大的…

动态规划算法解决背包问题,算法分析与C语言代码实现,时间效率解析

🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨,经典算法的解析✨都在这儿,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 -…

28 · 搜索二维矩阵

LintCode 炼码 class Solution { public:/*** param matrix: matrix, a list of lists of integers* param target: An integer* return: a boolean, indicate whether matrix contains target*/bool searchMatrix(vector<vector<int>> &matrix, int target) …

AI制药 - AlphaFold DB PDB 数据集的多维度分析与整理 (2)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/130118339 数据集&#xff1a;AlphaFold Protein Structure Database 下载地址&#xff1a;https://alphafold.ebi.ac.uk/download Alp…

springboot 部署k8s(二)

系列文章目录 目录 系列文章目录 前言 操作步骤 1.springboot.yaml文件 2.查看deployment 3.查看service服务 4.验证服务 总结 前言 springboot 部署到k8s 上。里面涉及了deployment, Service, NodePort. 操作步骤 1.springboot.yaml文件 apiVersion: apps/v1 kind: …

【C++】C/C++内存管理:

本篇的内存管理主要是动态内存管理。 1.C中的malloc、realloc、calloc和free函数&#xff1a; 【面试问题】 malloc、calloc和realloc的区别是什么&#xff1f; malloc申请的内存值是不确定的 calloc却在申请后&#xff0c;对空间逐一进行初始化&#xff0c;并设置值为0 异…

MATLAB基于卡尔曼滤波的锂蓄电池SOC设计matlab仿真代码(链接在文章结尾)

用自适应卡尔曼滤波方法&#xff0c;基于锂离子动力电池等效电路模型&#xff0c;在未知干扰噪声环境下&#xff0c;在线估计电动汽车锂离子动力电池荷电状态&#xff08;SOC&#xff09;。 相比于其它电池模型&#xff0c;等效电路模型可以更直观地表现输入与输出&#xff0c;…

01-Android 序列化与反序列化

1. 背景 在日常开发过程中&#xff0c;经常遇到程序读取文件&#xff0c;将文件数据转换为对象&#xff0c;程序通过对象传输数据&#xff0c;或者通过对象读取数据。同时也会经常遇到对象数据写入文件操作。 如果采用常规的文件读写&#xff0c;然后再进行赋值&#xff1b;那…

每日学术速递4.16

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.SpectFormer: Frequency and Attention is what you need in a Vision Transformer 标题&#xff1a;SpectFormer&#xff1a;频率和注意力是您在 Vision Transformer 中所需要的 …

医院不良事件报告系统源码:基于PHP+vue2+element+laravel8技术开发

医院不良事件报告系统源码 文末获取联系&#xff01; 技术架构&#xff1a;前后端分离&#xff0c;仓储模式&#xff0c; 开发语言&#xff1a;PHP 开发工具&#xff1a;vscode 前端框架&#xff1a;vue2element 后端框架&#xff1a;laravel8 数 据 库&#xff1a;mysql5…