中颖51芯片学习5. 类EEPROM操作

news2024/11/30 14:37:57

中颖51芯片学习5. 类EEPROM操作

  • 一、SH79F9476 Flash存储空间
    • 1. 特性
    • 2. 分区
    • 3. OP_EEPROMSIZE选项设置
    • 3. 编程接口
    • 4. 代码保护控制模式简介
      • (1)**代码保护模式0:**
      • (2)**代码保护模式1:**
      • (3)**代码保护模式2:**
      • (4)**代码保护模式3:**
  • 二、扇区自编程(SSP)功能
    • 1. SSP 编程流程
      • (1)代码/数据编程
      • (2)扇区擦除
    • 2. 寄存器介绍
      • (1)编程用地址选择寄存器
      • (2)擦除/编程用扇区选择寄存器
      • (3)编程用地址偏移寄存器
      • (4)编程用数据寄存器
      • (5)SSP型选择寄存器
      • (6)SSP流程控制寄存器1
      • (7) SSP流程控制寄存器2
      • (8)SSP流程控制寄存器3
      • (9)SSP流程控制寄存器4
      • (10)FLASHCON
  • 三、补充知识 C51的存储空间
    • 1. C51的RAM空间
  • 四、代码实现
    • 1. C语言访问存储区的方法
    • 2. 读取可读识别码
      • eeprom_random_id.c
      • main.c
      • 运行示例:
    • 3. 扇区删除
    • 2. 字节读
    • 3. 字节编程

一、SH79F9476 Flash存储空间

1. 特性

SH79F9476 集成了64KB(128x512Byte) Flash 存储器,有以下特性:

  • 支持在线编程(ICP)操作,包括写入、读取、擦除;
  • 支持整体和扇区擦除、编程操作;
  • 支持代码保护控制模式编程,
  • 程序区域的编程/擦除次数至少为10,000 次;
  • 类 EEPROM 区域的编程/擦除次数至少为100,000 次
  • 数据保存年限至少为10 年。

2. 分区

SH79F9476 Flash分成两个区:

  • 64K可编程Flash,支持ICP、SSP
  • 4096字节类EEPROM区,每个扇区512字节 , 最多8个扇区。

EEPROM与程序存储区共享空间共享 , 即EEPROM与程序存储区总和为64K,如下图所示:
在这里插入图片描述

可以通过 OP_EEPROMSIZE配置EEPROM 大小。

3. OP_EEPROMSIZE选项设置

  • 0000:8 X 512Bytes(默认,即4K=1000H)
  • 0001:7 X 512Bytes
  • 0010:6 X 512Bytes
  • 0011:5 X 512Bytes
  • 0100:4 X 512Bytes
  • 0101:3 X 512Bytes
  • 0110:2 X 512Bytes
  • 0111:1 X 512Bytes
  • 1000:0 Bytes
  • 其余:0 Bytes

3. 编程接口

提供了ICP模式和SSP模式两种编程接口。

  • ICP模式,通过Flash编程器对存储器擦、读、写。
  • SSP模式适用于用户程序代码运行在Program Memory中,对Flash存储器进行编程操作。

ICP模式同时可用于对MCU进行仿真调试,SH79F9476 支持单线模式(3线接口编程器)和四线模式(使用4个JTAG引脚)。接线如下图所示:

3线接口
在这里插入图片描述
四线模式
在这里插入图片描述
本文重点是扇区自编程(SSP)功能 ,包括下一节的代码保护并非本文重点。

4. 代码保护控制模式简介

代码保护模式是一种微控制器提供的安全功能,旨在保护程序代码不受未经授权的访问和修改。中颖 SH79F9476 提供了四种代码保护模式,分别是代码保护模式0、代码保护模式1、代码保护模式2和代码保护模式3。

Flash编程器在ICP模式设置相应的保护位,以进入所需的保护模式。SSP模式不支持代码保护控制模式编程。

(1)代码保护模式0:

  • 允许/禁止任何编程器的写入/读取操作,但不包括整体擦除。
  • 在该模式下,可以选择允许或禁止对芯片的编程操作,以防止未经授权的程序代码修改。

(2)代码保护模式1:

  • 允许/禁止在其它扇区中通过 MOVC 指令进行读取操作。
  • 在该模式下,可以限制在其他扇区中读取程序代码的操作,以加强对程序代码的保护。

(3)代码保护模式2:

  • SSP 功能允许/禁止控制,选中后,芯片对 code 区域的 SSP 操作(擦除或写入,不包括读取)是禁止的,但不会禁止芯片对类 EEPROM 的操作。
  • 这种模式下,可以限制对代码区域的 SSP(扇区自编程)操作,从而进一步加强代码的安全性。

(4)代码保护模式3:

  • 客户密码保护,可由客户自设密码,密码由6字节组成。如果将此功能开启,表示在烧写器或仿真器工具对芯片做任何操作(读出,写入,擦除或仿真)之前先输入这个密码,如果这个密码正确,则芯片允许烧写器或仿真器工具进行相应的操作,反之则报错,无法执行相应操作。
  • 在该模式下,可以设置一个客户自定义的密码,只有输入正确的密码才能执行对芯片的编程、读取、擦除或仿真等操作。

二、扇区自编程(SSP)功能

SH79F9476支持SSP功能。如果所选扇区未被保护,用户代码可以对任何扇区执行编程操作。
一旦该扇区被编程,必须在擦除后才能再次编程。

1. SSP 编程流程

(1)代码/数据编程

  1. 关闭中断;
  2. 根据地址设置XPAGE,IB_OFFSET;
  3. 如果需要写数据,设置IB_DATA;
  4. 按照顺序设置IB_CON1 - 5;
  5. 添加4个NOP指令
  6. 开始编程,CPU将进入IDLE模式;烧写完成后自动退出IDLE模式;
  7. 如需继续写入数据,跳转至第2步;
  8. XPAGE寄存器清0,恢复中断设置。

(2)扇区擦除

  1. 关闭中断;
  2. 按相应的扇区设置XPAGE;
  3. 按照顺序设置IB_CON1 - 5;
  4. 添加4个NOP指令
  5. 开始擦除,CPU将进入IDLE模式;擦除完成后自动退出IDLE模式;
  6. 如需要继续擦除数据,跳转至第2步;
  7. XPAGE寄存器清0,恢复中断设置。

需要注意的几点:

  1. 在对类EEPROM进行擦除、写或读之前,应首先将FLASHCON寄存器的最低位FAC位置1。
  2. 类EEPROM的扇区为512字节,而不是1024字节。
  3. 系统时钟不得低于 200kHz 以确保 FLASH 的正常编程。
  4. 当不需对类 EEPROM 操作时,必须将 FAC 位清 0 。

2. 寄存器介绍

(1)编程用地址选择寄存器

地址: F7H Bank0
符号:XPAGE
对于程序存储区,一个扇区为 512 字节 。 寄存器定义如下
在这里插入图片描述

(2)擦除/编程用扇区选择寄存器

地址: F7H Bank0
符号:XPAGE
对于类 EEPROM 存储区,一个扇区为 512 字节,最大 8 个扇区 。 寄存器定义如下:
在这里插入图片描述
需要将 FLASHCON 寄存器中的 FAC 位置 1 。

(3)编程用地址偏移寄存器

地址:FBH, Bank0
符号:IB_OFFSET
在这里插入图片描述

(4)编程用数据寄存器

地址:FCH, Bank0
符号:IB_DATA
在这里插入图片描述

(5)SSP型选择寄存器

地址:F2H, Bank0
符号:IB_CON1
在这里插入图片描述

(6)SSP流程控制寄存器1

地址:F3H, Bank0
符号:IB_CON2
在这里插入图片描述

(7) SSP流程控制寄存器2

地址:F4H, Bank0
符号:IB_CON3
在这里插入图片描述

(8)SSP流程控制寄存器3

地址:F5H, Bank0
符号:IB_CON4
在这里插入图片描述

(9)SSP流程控制寄存器4

地址:F6H, Bank0
符号:IB_CON5
在这里插入图片描述

(10)FLASHCON

A7H,Bank0第7位第6位第5位第4位第3位第2位第1位第0位
FLASHCON------CRC_FACFAC
读/写------读/写读/写
复位值
(POR/WDT/LVR/PIN)
------00

位编号定义:

位编号位符号说明
7-2-保留位
1CRC_FAC访问控制
0:对MAIN区做CRC的验证
1:对INFO区做CRC的验证
0FAC访问控制
0:MOVC指令或者SSP功能访问Main Block区域
1:MOVC指令或者SSP功能访问类EEPROM区域或信息存储区

三、补充知识 C51的存储空间

1. C51的RAM空间

C51编译器可以访问8051的所有存储区域,声明变量时可以指定分配的存储区,下面是关键字:

关键字存储空间地址范围访问方式
data内部RAM(低位128 bytes)0x00~0x7F直接寻址
idata内部RAM(全部256 bytes)0x00~0xFF间接寻址
bdata内部RAM(指定 16 bytes)0x20~0x2F位寻址/直接寻址
pdata扩展RAM(低位256 bytes)0x00~0xFF间接寻址
xdata扩展RAM(最大64K bytes)0x0000~0xFFFF间接寻址
codeFlash(最大64K bytes)0x0000~0xFFFF间接寻址

下面是变量声明的示例:

unsigned char data  my_data;
unsigned char code  text[] = "Hello World!";
unsigned char xdata array[100];
unsigned char idata x,y,z;
unsigned char pdata dimension;
unsigned char xdata vector[10][4][4];
unsigned char bdata flags;

存储结构图示如下:
在这里插入图片描述

SH79F9476RAM空间分配略有不同,主要在外部RAM区、增加的TK RAM、LED RAM。
在这里插入图片描述
关键字code用于声明常量或函数在Flash区,声明函数时编译器默认隐匿添加 code 关键字,不用处理。

四、代码实现

1. C语言访问存储区的方法

在ABSACC.H里定义了宏:

#define CBYTE ((unsigned char volatile code  *) 0)

通过这个宏来读取FLASH存储区域数据,详解如下:

  • ((unsigned char volatile code *)): 定义了一个类型转换和指针。
  • unsigned char: 将指针指向的数据类型定义为 unsigned char,即一个字节的无符号字符。
  • volatile: 告诉编译器不要对指针指向的内存进行优化,即使似乎没有被程序直接访问到,也要保持读写的一致性。
  • code: 这是一个特殊的关键字,用于指示数据存储在程序存储器中(如 Flash 存储器),而不是RAM。
  • 0: 这是一个常量,表示一个内存地址,这个宏定义了一个指向地址为0的位置的指针。

这个宏定义CBYTE用来访问程序存储器中地址为0的位置的数据,如果要访问 0x127b处的数据,可以使用:

CBYTE[0x127b]

在下面的读取可读识别码部分,展示了该宏的使用方法。

2. 读取可读识别码

SH79F9476出厂时会固化一个40位可读识别码,是0-0xffffffffff 的随机值,无法被擦除,地址在:
0x127b ~ 0x127F,可使用下面代码读取:

eeprom_random_id.c

#include "eeprom_random_id.h"
#include "ABSACC.H"

/**
* @brief 读取随机识别码
*/
void readRandomID(unsigned char *r){
    // 访问类EEPROM
    FLASHCON = 0x01;
    r[0] = CBYTE[0x127b];
    r[1] = CBYTE[0x127c];
    r[2] = CBYTE[0x127d];
    r[3] = CBYTE[0x127e];
    r[4] = CBYTE[0x127f];
    // 访问 FLASH
    FLASHCON = 0x00;
}

main.c

#include "SH79F9476.h"
#include "cpu.h"
#include "intrins.h"
#include "api_ext.h"
#include "clk_util.h"
#include "eeprom_op.h"

void main()
{
  UCHAR val;
	// 选择高速时钟
	highFrequenceClk();
	
	// 擦除扇区
  EEPromSectorErase(0);
	
  // EEPROM 0x0100地址写值
  ssp_flag = 0x5A;
  EEPromByteProgram(0x01,0x00,0x69);
	
  //读取EEPROM 0x0100地址的值
  val=EEPromByteRead(0x01,0x00);

	while (1);
}

运行示例:

在这里插入图片描述

3. 扇区删除

/**
* @brief 扇区擦除
**/
void EEPromSectorErase(UCHAR nAddrH)
{
	// 保护中断			
     _push_(IEN0);
    //关总中断	 
     IEN0 &=0x7F;
    // 访问EEPROM区
	FLASHCON = 0x01;									
	
	XPAGE = nAddrH<<1 ;
	// E6 扇区擦除
	IB_CON1	 = 0xE6;
	// 编程时IB_CON2必须为05H
	IB_CON2	 = 0x05;
	// 编程时IB_CON3必须为0AH
	IB_CON3	 = 0x0A;
	// 编程时IB_CON4必须为09H
	IB_CON4	 = 0x09;
	// 增加flag判断,加强抗干扰能力
	if(ssp_flag!=0xA5)
		goto Error;
	// 编程时IB_CON5必须为06H
	IB_CON5	 = 0x06;
	_nop_();				
	_nop_();
	_nop_();
	_nop_();	
Error:
	ssp_flag = 0;
	IB_CON1 = 0x00;
	IB_CON2 = 0x00;
	IB_CON3 = 0x00;
	IB_CON4 = 0x00;
	IB_CON5 = 0x00;
	// 切回Flash区
	FLASHCON = 0x00;
	// 操作结束,恢复总中断
    _pop_(IEN0);
}

2. 字节读

/**
* @brief 字节读
**/
UCHAR EEPromByteRead(UCHAR nAddrH,UCHAR nAddrL){
	UCHAR nTemp;
	// 保护现场
     _push_(IEN0);
    // 关总中断	 
     IEN0 &=0x7F;
	// 访问 EEPROM 区
	FLASHCON = 0x01;
    // 读取相应地址数据
	nTemp= CBYTE[nAddrH*256+nAddrL];
    // 切回 Flash 区
	FLASHCON = 0x00;
	// 操作结束,恢复现场
    _pop_(IEN0);
	return (nTemp);
}

3. 字节编程

/**
* @brief 字节编程
**/
void EEPromByteProgram(UCHAR nAddrH,UCHAR nAddrL, UCHAR nData){
	// 保护现场
    _push_(IEN0);
    // 关总中断
    IEN0 &=0x7F;
    // 访问 EEPROM 区
	FLASHCON = 0x01;	
	// 从0x00开始
	XPAGE = nAddrH;
	IB_OFFSET = nAddrL;
	// 烧写内容
	IB_DATA = nData;
	IB_CON1	 = 0x6E;
	// 编程时IB_CON2必须为05H
	IB_CON2	 = 0x05;
	// 编程时IB_CON3必须为0AH
	IB_CON3	 = 0x0A;
	// 编程时IB_CON4必须为09H
	IB_CON4	 = 0x09;
    // 增加flag判断,加强抗干扰能力
	if(ssp_flag!=0x5A)
		goto Error;
	// 编程时IB_CON5必须为06H
	IB_CON5	 = 0x06;
	_nop_() ;
	_nop_() ;
	_nop_() ;
	_nop_() ;	
Error:
	ssp_flag = 0;
	IB_CON1 = 0x00;
	IB_CON2 = 0x00;
	IB_CON3 = 0x00;
	IB_CON4 = 0x00;
	IB_CON5 = 0x00;
	// 切回Flash区
	FLASHCON = 0x00;
	// 操作结束,恢复现场
    _pop_(IEN0);
}

运行本文对应代码,观察读出的数据与写入相同。
在这里插入图片描述

本文学习资料来源中颖官方文档
本文代码开源地址:
https://gitee.com/xundh/learn-sinowealth-51

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

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

相关文章

VS2019 VS2022 LNK2019 无法解析的外部符号sprintf

解决方案&#xff1a; 项目属性》配置属性》链接接-》输入》附加依赖项&#xff0c;增加 legacy_stdio_definitions.lib legacy_stdio_definitions.lib 是一个库文件&#xff0c;通常与使用 Visual Studio 编译的 C/C 项目相关。它的作用是解决在使用新版本的 Visual Studio 编…

选以太网不选IB?AI网络构建未来趋势预测

据美国媒体Information报道&#xff0c;OpenAI和微软计划用千亿美金打造一款名为“Stargate”的超级计算机。 在选择网络方案时&#xff0c;即便微软是Infiniband的用户&#xff0c;OpenAI还是更加倾向使用以太网电缆而不是Infiniband电缆&#xff08;简称IB&#xff09;&…

LangChain-10(2) 加餐 编写Agent获取本地Docker运行情况 无技术含量只是思路

可以先查看 上一节内容&#xff0c;会对本节有更好的理解。 安装依赖 pip install langchainhub编写代码 核心代码 tool def get_docker_info(docker_name: str) -> str:"""Get information about a docker pod container info."""result…

Python 复杂密码图形化生成工具,支持选择生成10位和12位复杂密码(初版)

代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2024/3/26 15:22 # Author : wyq # File : 部署测试.py import random import string from tkinter import *def generate_password(length):characters string.ascii_letters string.digits string.p…

Java二叉树(2)

一、二叉树的链式存储 二叉树的存储分为顺序存储和链式存储 &#xff08;本文主要讲解链式存储&#xff09; 二叉树的链式存储是通过一个一个节点引用起来的&#xff0c;常见的表示方式有二叉三叉 // 孩子表示法 class Node { int val; // 数据域 Node left; // 左孩子的引用…

【网站项目】校园订餐小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

寻找可用API中的错误解决

目的&#xff1a;通过API调用大模型提取图像特征 百度 API 1.用百度的api调用llama时报错 Max retries exceeded with url&#xff0c;Caused by SSLError(SSLEOFError(8, EOF occurred in violation of protocol (_ssl.c:1131)))) 解决&#xff1a;试了关闭多余链接等方法…

信号完整性之哪来的串扰?

原文来自微信公众号&#xff1a;工程师看海&#xff0c;与我联系&#xff1a;chunhou0820 看海原创视频教程&#xff1a;《运放秘籍》 大家好&#xff0c;我是工程师看海。 我们经常听说PCB走线间距大于等于3倍线宽时可以抑制70%的信号间干扰&#xff0c;这就是3W原则&#…

大恒相机-程序异常退出后显示被占用

心跳时间代表多久向相机发送一次心跳包&#xff0c;如果超时则设备会认为断开了&#xff0c;停止工作并主动释放占用资源。 在相机打开后添加代码&#xff1a; #ifdef _DEBUG//设置心跳超时时间 3sObjFeatureControlPtr->GetIntFeature("GevHeartbeatTimeout")-&…

Spring Cloud学习笔记:Eureka简介,Eureka简单样例

这是本人学习的总结&#xff0c;主要学习资料如下 - 马士兵教育 [TOC](目录)1、Eureka 1.1、架构 Eureka是SpringCloud Nexflix的核心子模块&#xff0c;其中包含Server和Client。 Server提供服务注册&#xff0c;存储所有可用服务节点。 Client用于简化和Server的通讯复杂…

适用于W波段GaAs开关设计的可扩展p-i-n二极管建模与参数提取技术

来源&#xff1a;Scalable p-i-n Diode Modeling and Parameter Extraction for Use in the Design of W-Band GaAs Switch&#xff08;TIE 21年&#xff09; 摘要 本文介绍了一种针对W波段开关设计的基于毫米波GaAs的p-i-n二极管的可扩展建模与参数提取方法。采用基于晶圆上…

深入理解图形处理器(GPU):加速人工智能和大数据计算的引擎

文章目录 1. 什么是GPU&#xff1f;2. GPU的工作原理3. GPU的应用领域4. GPU与CPU的比较参考与推荐 前言&#xff1a; 图形处理器&#xff08;GPU&#xff09;不再仅仅是用于图形渲染的硬件设备。如今&#xff0c;GPU已经成为加速人工智能、大数据计算和科学研究的关键引擎。本…

基因查询常用汇总网(自备)

目录 NCBI genecards HPA数据库 gepia2 cbioporta kmplot生存分析 ualcan ​​​​​​​ 进行一些常用的基因功能蛋白及表达的网站查询汇总&#xff0c;方便个人使用 NCBI National Center for Biotechnology Information (nih.gov) 查询基因的曾用名和其他ID&…

【c语言】声明变量和初始化变量的区别

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

libVLC 提取视频帧使用QWidget渲染

在前面的文章中&#xff0c;我们使用libvlc_media_player_set_hwnd设置了视频的显示的窗口。 libvlc_media_player_set_hwnd(vlc_mediaPlayer, (void *)ui.widgetShow->winId()); 如果我们想要提取每一帧数据&#xff0c;将数据渲染到QWidget上&#xff0c;该如何操作呢&a…

Java前置一些知识

文章目录 搭建Java环境安装path环境变量Java技术体系 Java执行原理JDK组成跨平台Java内存分配 IDEA管理Java程序 搭建Java环境 安装 oralce官网下载 JDK17 Windows 傻瓜式的点下一步就行&#xff0c;注意&#xff1a;安装目录不要有空格、中文 java 执行工具 javac 编译工具…

AS5047P STM32CubeMX HAL库 调试

AS5047P STM32CubeMX HAL库 调试 1. AS5047使用说明1.1 电源连接1.2 SPI数据格式1.3 AS5047P相关寄存器 2. STM32CubeMX 配置SPI2.1 两种SPI读取方式参考 1. AS5047使用说明 1.1 电源连接 可以选择两种供电方式&#xff1a;3.3V或者5V 1.2 SPI数据格式 1.3 AS5047P相关寄存…

高程-类和对象

面向对象编程&#xff08;OOP&#xff09; 特征&#xff1a;抽象、多态、封装、继承 类 既然有结构体struct了&#xff0c;那么使用类class的好处是什么呢&#xff1f;C中struct的成员可以任意访问&#xff0c;对于一些隐私信息是不允许的。为了保护类中的数据安全&#xff…

Ubuntu系统使用Docker本地部署Android模拟器并实现公网访问

文章目录 1. 虚拟化环境检查2. Android 模拟器部署3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问小结 6. 固定Cpolar公网地址7. 固定地址访问 本文主要介绍如何在Ubuntu系统使用Docker部署docker-android安卓模拟器&#xff0c;并结合cpolar内网穿透工具实现公网远程访问本地…

为什么要纯C语言手搓GPT-2,Karpathy回应网友质疑

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 几天前&#xff0c;前特斯拉 Autopilot 负责人、OpenAI 科学家 Andrej Karpathy 发布了一个仅…