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

中颖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){// 访问类EEPROMFLASHCON = 0x01;r[0] = CBYTE[0x127b];r[1] = CBYTE[0x127c];r[2] = CBYTE[0x127d];r[3] = CBYTE[0x127e];r[4] = CBYTE[0x127f];// 访问 FLASHFLASHCON = 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必须为05HIB_CON2	 = 0x05;// 编程时IB_CON3必须为0AHIB_CON3	 = 0x0A;// 编程时IB_CON4必须为09HIB_CON4	 = 0x09;// 增加flag判断,加强抗干扰能力if(ssp_flag!=0xA5)goto Error;// 编程时IB_CON5必须为06HIB_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必须为05HIB_CON2	 = 0x05;// 编程时IB_CON3必须为0AHIB_CON3	 = 0x0A;// 编程时IB_CON4必须为09HIB_CON4	 = 0x09;// 增加flag判断,加强抗干扰能力if(ssp_flag!=0x5A)goto Error;// 编程时IB_CON5必须为06HIB_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.mzph.cn/news/808670.shtml

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

相关文章

ESXI 中安装 虚拟机 麒麟v10 操作系统

浏览器访问登录ESXI 上传镜像文件 创建新虚拟机 选择虚拟机名称和操作系统 选择存储 配置虚拟机 配置虚拟机 cpu 内存 硬盘 并选择虚拟机驱动 配置完成后&#xff0c;点击下一步&#xff0c;并点击完成。 开机 完成后选择该虚拟机&#xff0c;并打开电源 等待出现以下界面…

2023年通用人工智能AGI等级保护白皮书

今天分享的是人工智能专题系列深度研究报告&#xff1a;《人工智能专题&#xff1a;2023年通用人工智能AGI等级保护白皮书》。 通用人工智能发展现状 本章主要介绍通用人工智能的基本情况&#xff0c;包括其发展历史、现状以及组成架构等内容。本文还将通过从技术角度出发来分…

【复现】浙大恩特客户资源管理系统 SQL注入漏洞_71

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源&#xff0c;提升…

Innodb架构解析

整体架构 通过《面试官&#xff1a;一条SQL是如何执行的&#xff1f;》我们了解了MySQL架构&#xff0c;下面我们看下Innodb架构。 innodb最早由Innobase Oy公司开发&#xff0c;5.5版本开始是MySQL默认存储引擎&#xff0c;该存储引擎是第一个完整支持ACID事务的MySQL存储引…

蓝桥杯-【二分】分巧克力,跳石头

代码及解析: #include<bits/stdc.h> using namespace std; int n,k; const int N100010; int h[N],w[N]; bool check(int d){int num0;for(int i0;i<n;i) num (h[i]/d)*(w[i]/d);if(num>k) return true; //够分else return false; //不够分 } in…

Golang教程一(环境搭建,变量,数据类型,数组切片map)

目录 一、环境搭建 1.windows安装 2.linux安装 3.开发工具 二、变量定义与输入输出 1.变量定义 2.全局变量与局部变量 3.定义多个变量 4.常量定义 5.命名规范 6.输出 7.输入 三、基本数据类型 1.整数型 2.浮点型 3.字符型 4.字符串类型 转义字符 多行字符…

深度学习简介

深度学习简介 一、引言&#xff1a;深度学习的兴起 简短介绍深度学习的历史背景 深度学习&#xff0c;作为人工智能领域的一颗冉冉升起的新星&#xff0c;其根源可以追溯到上世纪的感知机学习算法。这种算法模拟人类的神经元行为&#xff0c;是最早期的尝试之一。然而&#x…

OpenLayers6实战,OpenLayers实现鼠标拖拽方式绘制矩形(拖拽方式绘制长方形和正方形)

专栏目录: OpenLayers实战进阶专栏目录 前言 本章介绍使用OpenLayers在地图上实现鼠标拖拽方式绘制矩形(拖拽方式长方形和正方形)。 OpenLayers本身是可以通过鼠标点击多个点的方式来绘制多边形的,当然也包括长方形和正方形,但是这种多边形绘制出来的图形并不是准确的“…

每天学点儿Python(6) -- 列表和枚举

列表是Python中内置的可变序列&#xff0c;类使用C/C中的数组&#xff0c;使用 [ ] 定义列表&#xff0c;列表中的元素与元素之间用英文逗号&#xff08; , &#xff09;分隔&#xff0c; 但是Python中列表可以存储任意类型的数据&#xff0c;且可以混存&#xff08;即类型可以…

Partisia Blockchain 何以落地隐私技术的高能场景应用?

致力于隐私保护、互操作性和可持续创新的 Layer1 区块链新星&#xff0c;Partisia Blockchain 以安全公平标榜&#xff0c;带给加密用户无忧交易的体验环境。对于这样一个融合零知识证明&#xff08;ZK&#xff09;技术和多方计算&#xff08;MPC&#xff09;的全新项目来说&am…

18_SPI通信外设

SPI通信外设 SPI通信外设SPI外设简介SPI框图SPI基本结构主模式全双工连续传输非连续传输 SPI通信外设 SPI外设简介 STM32内部集成了硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&#xff0c;减轻CPU的负担 可配置8位/16位数据帧、高位先行/低位先…

wsl 2在windows11上的设置

详细参考&#xff1a;Manual installation steps for older versions of WSL | Microsoft Learn 1.系统组件要打开 分别是&#xff1a;Hyper-V、虚拟机平台、适用于Windows的Linux子系统 2.以管理员方式运行命令行&#xff0c;逐步执行下面的命令 update to WSL 2, you must…

opc ua 环境构建(记录一)

1、准备 Siemens Simatic WinCC v7.5 二、配置 SIMATIC NET与S7-200 SMART 集成以太网口OPC 通信(TIA平台) 硬件: ①S7-200 SMART ②PC 机 ( 集成以太网卡) 软件: ① STEP 7-Micro/WIN SMART V2.1 ② STEP 7 Professional(TIA Portal V13 SP1 Upd 9) ③ SIMATIC NET …

在直播间卖云,云厂商终于“疯了”

图片&#xff5c;电影《疯狂的石头》截图 ©自象限原创 作者丨程心 云厂商们&#xff0c;在直播间打起来了&#xff01; 继阿里云在罗永浩直播间亮相、京东云硬刚友商之后&#xff0c;腾讯云也开始在“直播间”送起了福利。 4月8日&#xff0c;腾讯云发布新一代AIGC存…

记录vite打包并上传到npm

开始 起因&#xff1a;我们单位这个项目用的vitereact使用print打印 开发环境没问题、一到打包时就卡住、所以我就想单独打包成组件在引用看看还有问题么、结果还真可以&#xff01;又是离谱的一天 首先需要把npm的分支切换成官网地址、因为只有官网地址才能登陆npm账号 这里说…

FreeRTOS学习 -- 移植

一、添加FreeRTOS源码 在基础工程中新建一个名为FreeRTOS的文件夹&#xff0c;创建FreeRTOS文件夹以后将FreeRTOS的源码添加到这个文件夹中。 portable 文件夹&#xff0c;只需要保留keil、MemMang 和 RVDS这三个文件夹&#xff0c;其他的都可以删除掉。 移植FreeRTOSConfig…

SimOne协作版正式发布!“云+端”一体化,加速自动驾驶技术迭代!

创新的“云端”一体化方案 让11大于2 两端登录 场景共享 本地算法 云端并发 颠覆传统自动驾驶研发工作方式 加速自动驾驶算法迭代与优化 SimOne协作版正式发布&#xff01; 什么是SimOne协作版&#xff1f; SimOne协作版&#xff0c;一个创新的“云端”一体化产品。 它将…

【数学建模】机器人避障问题

已知&#xff1a; 正方形5的左下顶点坐标 ( 80 , 60 ) (80,60) (80,60)&#xff0c;边长 150 150 150机器人与障碍物的距离至少超过 10 10 10个单位规定机器人的行走路径由直线段和圆弧组成&#xff0c;其中圆弧是机器人转弯路径。机器人不能折线转弯&#xff0c;转弯路径由与…

代码随想录-算法训练营day02【数组02:滑动窗口、螺旋矩阵】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG?uc71ed002e4554fee8c262b2a4a4935d8977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II &#xff0c;总结 建议大家先独立做题&#xff0c;…

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具 文章目录 基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具一、软件介绍二、软件功能1、数据输入 2、潮流作业设置3、 潮流结果报表及可视化三、 软件设计思路1 、牛顿拉…