YTM32的flash应用答疑-详解写保护功能

YTM32的flash应用答疑-详解写保护功能

文章目录

  • YTM32的flash应用答疑-详解写保护功能
    • Introduction
    • Principle
    • Operation & Demonstration
      • Demo #1 验证基本的写保护功能
      • Demo #2 编程CUS_NVR设定EFM_ADDR_PROT初值
      • Demo #3 启用写保护后试试块擦除操作
    • Conclusion

Introduction

客户提出了一种应用场景:在使用某些授权软件(算法)的场景中,软件(算法)供应商向MCU的一些预留的存储区中写入专用的授权凭证,该凭证一机一码,各不相同,从而确保软件(算法)不会被非法复制。但对于MCU的应用开发者来说,经常需要刷写片内存储空间,更新程序或者数据,此时希望小心保存位于MCU内部存储器上的凭证,在开发和后期正常使用的过程中,不要被意外擦除,否则重新授权需要又需要额外的费用、时间和流程等。

绝大多数MCU的片内flash存储器管理模块都提供了写保护功能,当对已经设置保护功能的存储区进行擦写操作时,擦写的实际效果将失效,被保护存储区中的数据得以幸免留存,已达到防止误擦除的效果。

Principle

YTM32B1MD14微控制器为例,其中片内flash控制器模块EFM,对应有EFM_ADDR_PROT[0]EFM_ADDR_PROT[1]寄存器,其中每个比特可以保护8KB的存储区,按序分布,覆盖全部的片内flash的地址区域。

EFM_ADDR_PROT寄存器位的值为0时,写保护发生作用,对应位的值为1时,写保护不起作用,可以正常擦写。

有两种方式可以配置EFM_ADDR_PROT寄存器的值:

  • CUS_NVR0x100x18地址写数,这里的配置值将作为EFM_ADDR_PROT寄存器的初值,在硬件复位后自动生效(由boot rom复制到EFM_ADDR_PROT寄存器中)。但写入每个寄存器初值时要注意,高32位数必须为0x5A5A5A5A ,然后才是32位的有效配置值。
  • EFM_ADDR_PROT寄存器直接写数,写数之后在程序运行过程中生效,但复位后受CUS_NVR中的初值影响,在软件生效之前,需要保护的区域可能有被篡改的风险。
    • 在软件中,从1写0是可以的,但从0写1是无效的。在程序运行中,只能上锁不能解锁。如果想重新操作,只能复位重来。

需要特别注意的是,CUS_NVR也是位于flash存储器上,具体是在pflash1的尾端。如图x所示。

在这里插入图片描述
在这里插入图片描述

图x CUS_NVR的物理存储位置

这里的EFM_ADDR_PROT保护的是地址空间,而不是物理存储。对于YTM32B1MD14这种用两个pflash物理存储器集成在一起具有硬件AB面分区的内部存储设备,若交换了物理存储区,切换了地址空间和实际物理存储器的映射关系,则原有的配置下实际执行保护的区域也会发生变化。实际上,CUS_NVRBOOT SWAP操作的初始化参数共用的一个 Sector,因此在执行 BOOT_SWAP命令(交换pflash0pflash1的地址映射区域) 后,关闭调试接口和地址保护的配置会丢失,需要重新配置。同理,擦除CUS_NVRSWAP BOOT信息也会丢失,如需要重映射后的地址空间,需要重新执行BOOT SWAP操作。

另外,如果在flash块上对任意一块存储区启用了写保护,则整块flash存储器的块擦除操作都不能生效。但如果通过在CUS_NVR中解除写保护配置后复位,就可以恢复对整块flash的擦除操作。

Operation & Demonstration

设计用例,演示flash写保护的起作用的情况。

Demo #1 验证基本的写保护功能

  • 默认上电复位后,MCU未对任何地址启用写保护功能。
  • 先向0x3E000 - 0x40000(pflash0的最后一个8KB存储块)擦除后再写一组数据。通过调试器观察flash存储区的数据已经生效。

在这里插入图片描述

  • 然后执行EFM_ADDR_PROT |= (1u << 31u),配置写保护。
  • 再试着擦除0x3E000 - 0x40000内存区间的数据。执行擦除操作之后,通过调试器观察flash存储区的数据是否仍留存。

在这里插入图片描述

通过实验可以观察到,当配置写保护后,再次试图擦除指定内存区域的存储空间后,原来写入的数据仍然保留,未受擦除操作影响。

Demo #2 编程CUS_NVR设定EFM_ADDR_PROT初值

在之前的用例中,可以看到在默认情况下,EFM_ADDR_PROT[0]EFM_ADDR_PROT[1]寄存器的值都是0xFFFFFFFF。如图x所示。

在这里插入图片描述

图x EFM_ADDR_PROT寄存器的默认值

通过向CUS_NVR0x100x18地址写数,更改写保护的初值。但此时,因为尚未复位,芯片硬件也没有执行从CUS_NVREFM_ADDR_PROT导入配置的操作,因此,仍然可以擦写 flash。如图x所示。

在这里插入图片描述

图x 在CUS_NVR启用写保护后未复位

在调试环境中复位芯片,重新执行演示用例程序,从log和寄存器观察窗口中可以观察到,CUS_NVR中配置的初值已经载入到了EFM_ADDR_PROT寄存器。在执行后续的擦写操作时,可以看到实际的flash存储的值没有因为擦写操作而变化,说明写保护作用已经生效。如图x所示。

在这里插入图片描述

图x 在CUS_NVR启用写保护后复位生效

注意:在MD和ME的芯片里,NVR里的数据对于用户不是直接可见的,需要通过专门的读操作才能拿到其中存放的数据。

再继续试一下解除写保护的情况。重新复位芯片,在log交换中解除写保护。发现此时不需要复位,EFM_ADDR_PROT的寄存器的值就已经同步过来了, 对应当下就可以恢复对flash的擦写操作。如图x所示。

在这里插入图片描述

图x 在CUS_NVR解除写保护后立即生效

Demo #3 启用写保护后试试块擦除操作

在测试用例中:

  • 先在未启用写保护的情况下,在flash中写好预设的数据,复位。
  • CUS_NVR中启用写保护,复位,让写保护生效。
  • 再试着执行块擦除操作。

在这里插入图片描述

图x 试图擦除启用写保护的flash块

从图x中可以看到,启用写保护之后,执行flash块擦除操作后,预先存入flash中的数据未受影响。

Conclusion

本文专门讲解和验证了YTM32的flash写保护的功能。

  • EFM_ADDR_PROT寄存器中的每个bit可以控制启用对应一块区域(8KB for MD),但只能开启写保护不能解除。如需解除必须复位,重新导入CUS_NVR的值。
  • 在运行软件时,可以直接写EFM_ADDR_PROT寄存器启用写保护。但只能1变0(启用写保护),不能0变1(解除写保护)。
  • EFM_ADDR_PORT寄存器的初值是从CUS_NVR导入的,因此可以通过擦写CUS_NVR设定片内flash存储的上电复位默认状态。
  • CUS_NVR中启用写保护需要复位后才能生效,但解除写保护是可以不等复位立即生效的。
  • 如果在flash块上对任意一块存储区启用了写保护,则整块flash存储器的块擦除操作都不能生效。

本文中使用了两个测试工程如下,或者私信作者获取。

  • https://gitee.com/suyong_yq/arm-mcu-sdk-release/blob/master/ytm32-evk/evb-ytm32b1md-q100_efm_flash_write_protect_mdk.zip
  • https://gitee.com/suyong_yq/arm-mcu-sdk-release/blob/master/ytm32-evk/evb-ytm32b1md-q100_efm_flash_write_protect_cus_nvr_mdk.zip

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

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

相关文章

报名倒计时两周|2024 OpenTiny 开源之夏项目直播解读回顾

5月16日&#xff0c;OpenTiny 开源社区成功举办了以《OpenTiny 开源之夏项目解读直播》为主题的直播活动。此次直播中&#xff0c;华为云的高级前端工程师曾令卡、华为云的高级前端工程师伍其和与10位开源之夏技术专家携手组成项目导师团&#xff0c;面向广大开发者一同深入探讨…

Java类和对象(五)—— 抽象类、接口、Object类和内部类

抽象类 在继承体系下&#xff0c;父类有些方法可能是要被重写的&#xff0c;如果我们事先就知道某些方法需要重写的话&#xff0c;我们可以不用在父类里面具体实现这个方法&#xff0c;这时候我们会用到抽象方法&#xff0c;这时候我们会用到关键字abstract关键字来修饰 publ…

BatBot智慧能源管理平台,更加有效地管理能源

随着能源消耗的不断增加&#xff0c;能源管理已成为全球面临的重要问题。BatBot智慧能源管理作为一种的能源管理技术&#xff0c;促进企业在用能效率及管理有着巨大的提升。 BatBot智慧能源管理是一种基于人工智能技术的能源管理系统&#xff0c;通过智能分析和优化能源使用&…

【JAVA |再谈接口、Object、内部类】Object类中子类重写,Cloneable 接口、比较器、内部类

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; &#x1f388;丠丠64-CSDN博客&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起…

Internet动态路由选择—RIP与OSPF

刚做完网络层动态路由选择的实验&#xff0c;写下此篇记录实验过程&#xff0c;巩固学习成果。 参考书目&#xff1a;《计算机网络》北京理工大学出版社-刘阳老师编 路由选择可分为两种策略&#xff1a; - 静态路由选择策略 - 动态路由选择策略 静态路由即管理员手动配置路由…

Java 商品入库系统 案例

测试类 package 练习.商品入库系统;import java.util.ArrayList; import java.util.Scanner; public class Test {public static final int Enrool 1;public static final int Search 2;public static final int Delect 3;public static final int Exit 4;public static…

在docker上部署postgresSQL主从

文章目录 一、主从规划二、创建PostgresSQL的Docker镜像三、主库部署1、建立pgsql主库的data地址2、启动docker镜像3、docker内操作4、修改配置文件 四、部署从数据库1、建立psql备库的data地址2、启动docker镜像3、备库从主库同步4、检查是否同步 五、测试主从数据库 一、主从…

【深度强化学习】关于同一设备上cuda和gpu计算结果不一致问题

文章目录 问题描述关于seed: 跟原文一致补充:万能seed 问题结论cpu和gpu差异来源分析浮点数精度的差异补充报错&#xff1a;Expected all tensors to be on the same device&#xff01;常见运算上的差异累加运算的差异exp运算的差异matmul运算的差异 forward上的差异&#xff…

机器学习云环境搭建

在 https://support.huaweicloud.com/browsertg-obs/obs_03_1003.html 下载对应版本的 OBS Broswer 软件&#xff0c;如图&#xff0c;红框内的为安装文件&#xff0c;蓝色框内的为对应安装文件的校验文件&#xff08;无需下载&#xff09; 以 64 位机为例&#xff0c;下载完…

景源畅信电商:抖店需要的成本高吗?

在数字化时代的浪潮中&#xff0c;短视频平台迅速崛起&#xff0c;成为连接用户与商家的新桥梁。抖音作为其中的佼佼者&#xff0c;不仅改变了人们的娱乐方式&#xff0c;也催生了新型的电商模式——抖店。许多人好奇&#xff0c;入驻这样一个充满活力的平台&#xff0c;需要承…

618知识狂欢,挑本好书,点亮智慧生活!

618精选编程书单&#xff1a;提升你的代码力 一年一度的618又到啦&#xff01;今年的618就不要乱买啦&#xff0c;衣服买多了会被淘汰&#xff0c;电子产品买多了会过时&#xff0c;零食买多了会增肥&#xff0c;最后怎么看都不划算。可是如果你购买知识&#xff0c;坚持阅读&a…

后端之路第二站(正片)——SprintBoot之:分层解耦

很抽象&#xff0c;我自己也不好理解&#xff0c;仅作为一个前端转后端的个人理解 一、先解释一个案例&#xff0c;以这个案例来分析“三层架构” 这里我先解释一下黑马程序员里的这个案例&#xff0c;兄弟们看视频的可以跳过这节课&#xff1a;Day05-08. 请求响应-响应-案例_…

【webrtc】m98:Call的创建及Call对音频接收处理

call中多個流共享相同的辅助组件 这几个是与外部共用的 线程传输send控制module 线程任务队列工厂call的辅助组件中各种统计以及接收测的cc是自己创建的 call自己的多个辅助组件是外部传递来的 call 创建多个接收流 这里用一个set 来保存所有指针,并没有要map的意思:

【因果推断从入门到精通二】随机实验3

目录 检验无因果效应假说 硬币投掷的特殊性何在&#xff1f; 检验无因果效应假说 无因果效应假说认为&#xff0c;有些人存活&#xff0c;有些人死亡&#xff0c;但接受mAb114治疗而不是ZMapp与此无关。在174例接受mAb14治疗的患者中&#xff0c;113/17464.9%存活了28天&…

Java入门基础学习笔记47——ArrayList

什么是集合呢&#xff1f; 集合是一种容器&#xff0c;用来装数据的&#xff0c;类似数组。 有数组&#xff0c;为什么还要学习集合呢&#xff1f; 数组定义完成并启动后&#xff0c;长度就固定了。 而集合是大小可变&#xff0c;开发中用的最多的。 集合的特点&#xff1a;大…

汇聚荣科技有限公司优点有哪些?

在当今快速发展的科技时代&#xff0c;企业之间的竞争愈发激烈。作为一家专注于科技创新与研发的公司&#xff0c;汇聚荣科技有限公司凭借其卓越的技术实力和创新能力&#xff0c;在业界树立了良好的口碑。那么&#xff0c;汇聚荣科技有限公司究竟有哪些优点呢?接下来&#xf…

C++利用TinyXML读取XML文件

TinyXML是什么&#xff1f; TinyXML是一个轻量级的C XML解析器&#xff0c;它提供了一种简单的方法来解析和操作XML文档。TinyXML被设计为易于使用和集成到C项目中&#xff0c;并且非常适合处理小型XML文件。 以下是TinyXML的一些主要特点和优点&#xff1a; 轻量级: T…

OSPF问题

.ospf 选路 域内 --- 1类&#xff0c;2类LSA 域间 --- 3类LSA 域外 --- 5类&#xff0c;7类LSA --- 根据开销值的计算规则不同&#xff0c;还分为类型1和类型2 ospf 防环机制 区域内防环&#xff1a;在同一OSPF区域内&#xff0c;所有路由器通过交换链路状态通告&#xff…

226.翻转二叉树

翻转一棵二叉树。 思路&#xff1a; 指针做交换 用递归&#xff08;前序or后序&#xff0c;中序不行&#xff09; 前序&#xff1a;中左右 遍历到“中”的时候&#xff0c;交换它的左右孩子 然后分别对它的左孩子和右孩子使用“交换函数”&#xff08;定义的&#xff09;&a…