IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 嵌入式 -GD32代码读保护 -> 正文阅读

[嵌入式]嵌入式 -GD32代码读保护

更新历史

  1. 20220227
    首次编辑和发布,描述了 GD32F303 MCU 的安全保护功能和初步测试结果;
  2. 20220303
    添加了进一步测试的结果;

引言

公司产品换料,使用了 GD32F3 系列的 MCU,客户要求对代码进行读保护,再查看用户手册时,看到了其提供的“安全保护”,就想通过实验来看下实际效果;

手册介绍

这里从 GD32F303 的用户手册摘录关键信息:

芯片内存结构

在这里插入图片描述
图1 内存基本分配表

这里我们需要注意的是,这里的主存分为了 bank0, bank1. bank0 的页大小为 2KB 每页,bank1 的大小为 4KB 每页;
且存在信息块和可选字节块,这个可选字节块也是和我们想要做的读保护息息相关的;

这里我们先明确,启用读保护功能是需要设置 可选字节块的,所以下面我们围绕可选字节块进行展开。

闪存操作说明

我们知道,常规内存编程前需要进行一定的动作,擦除、解锁等操作,这里是通过 两层解锁和先擦除后编程的:
在这里插入图片描述
图2 内存控制说明

通过图 2 中,我们可以得知以下关键信息:

  1. 内存操作前需要解锁,解锁的方式是向指定寄存器 FMC_KEY0 中写入键值;
  2. 可选字节的编程,是需要两层解锁的,即 FMC bank0 解锁后,还要对 FMC_OBKEY 寄存器写入相应键值解锁 可选字节寄存器的编程权限;

可选字节块说明

功能生效条件

每次系统复位后,闪存的可选字节块被重加载到FMC_OBSTAT和FMC_WP寄存器,可选字节生效。可选字节的补字节具体为可选字节取反。当可选字节被重装载时,如果可选字节的补字节和可选字节不匹配,FMC_OBSTAT寄存器的OBERR位将被置1,可选字节被强制设置为0xFF。若可选字节和其补字节同为0xFF,则OBERR位不置位。

上述我们可提取到关键信息:

  1. 开启读保护后,至少需要系统复位;
  2. 复位后检测信息不匹配后,可选字节会被强制擦除;

可选字节的具体含义见下图:
在这里插入图片描述
图3 可选字节块说明

安全保护功能说明

在这里插入图片描述
图4 安全保护功能说明

从图 4 的说明中我们可知:

  1. 从未保护模式下修改 SPC 字节后,需要复位后生效读保护功能:若是用户代码修改,则需要系统复位使其生效;若是调试模式下修改,则需要上电复位。
  2. 安全模式下,想要关闭保护态,仅能从用户代码从修改;
  3. 安全模式下,主存的前 4KB 不可擦除,也就是 bank0 的前两页;【如果 IAP 这里的话,是会失效的】。
  4. 安全模式下,任何启动方式下的读主存都失效;
  5. 安全模式下,可修改 SPC 字节以退出读保护,但是会擦除整个主存

代码实现

保护功能开启

经过上述的分析,结合库函数,我们确定了驱动函数为:

#include "gd32fmc.h"
fmc_state_enum GD32FMC_OB_Toggle(uint8_t ob_spc)
{
	fmc_state_enum res = FMC_BUSY;
	fmc_unlock();	// 解除 bank0 的编程限制
	ob_unlock();	// 	解除 可选字节 的编程限制
	
	ob_erase();		// 可选字节擦除 这里上电默认为 A5 5A FF FF FF ... 所以这里直接整个擦除了
	res = ob_security_protection_config(ob_spc);	// 启停保护功能
	ob_lock();		// 退出 可选字节 编辑态
	fmc_lock();		// 退出 bank0 编辑态
	
	return res;
}

测试方法

测试过程中,由于 SPC 字节仅支持用户代码修改,所以在代码中加入了某一 IO 电平检测,并修改 SPC 字节的代码,这里简单分享下:

	static uint8_t time1 = 0, time2 = 0;
	
	if(GetInputStatus(oneIO) > 0)
	{
		time2 = 0;
		if(time1 == 0)
		{
			time1++;
			ob_security_protection_config(FMC_USPC);
		}
	}
	else
	{
		time1 = 0;
		if(time2 == 0)
		{
			time2++;
			ob_security_protection_config(FMC_NSPC);
		}
	}

现象说明

  1. 在开启读保护后,jflash工具可连接,但是无法读取主存,最终会提示超时:

在这里插入图片描述
2. 可通过 Jlink Commander 来查看 SPC 字节内容:
在这里插入图片描述
这里的是为开启读保护时方位到的可选字节的数据,当加锁后,读取的值会变为:

BB 44 FF FF FF FF FF FF FF FF FF FF FF FF FF FF

此时需要重启生效;
3. 运行过程中,触发解锁信号,会立即导致整片立马被擦除,产品看起来是卡死,但是此时 MCU 是支持读写的,类似于恢复出厂设置了;

整体分析

  1. 由于关闭读保护后会立马擦除整片数据,所以此功能风险过大,考虑其它防复制方案。
  2. 在开启读保护情况下,进行 IAP 的话,会导致芯片在读保护的状态下是会自锁且无法退出读保护的,只能通过联系原厂支援以退出芯片读保护,这里也可以参考《嵌入式 - GD32读保护解除》;

进一步测试

后面尝试了将 SWJ 重映射来实现防复制的目的,参考《GD32 SWJ调试接口关闭》添加链接描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:31:24  更:2022-03-03 16:34:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:24:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码