小公司怎样自己建网站投资网
web/
2025/9/27 18:17:30/
文章来源:
小公司怎样自己建网站,投资网,网站头部代码,帮人注册网站_做app中颖51芯片学习5. 类EEPROM操作 一、SH79F9476 Flash存储空间1. 特性2. 分区3. OP_EEPROMSIZE选项设置3. 编程接口4. 代码保护控制模式简介#xff08;1#xff09;**代码保护模式0#xff1a;**#xff08;2#xff09;**代码保护模式1#xff1a;**#xff08;3#… 中颖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编程用数据寄存器5SSP型选择寄存器6SSP流程控制寄存器17 SSP流程控制寄存器28SSP流程控制寄存器39SSP流程控制寄存器410FLASHCON 三、补充知识 C51的存储空间1. C51的RAM空间 四、代码实现1. C语言访问存储区的方法2. 读取可读识别码eeprom_random_id.cmain.c运行示例 3. 扇区删除2. 字节读3. 字节编程 一、SH79F9476 Flash存储空间
1. 特性
SH79F9476 集成了64KB128x512Byte Flash 存储器有以下特性
支持在线编程ICP操作包括写入、读取、擦除支持整体和扇区擦除、编程操作支持代码保护控制模式编程程序区域的编程/擦除次数至少为10,000 次类 EEPROM 区域的编程/擦除次数至少为100,000 次数据保存年限至少为10 年。
2. 分区
SH79F9476 Flash分成两个区
64K可编程Flash支持ICP、SSP4096字节类EEPROM区每个扇区512字节 最多8个扇区。
EEPROM与程序存储区共享空间共享 即EEPROM与程序存储区总和为64K如下图所示
可以通过 OP_EEPROMSIZE配置EEPROM 大小。
3. OP_EEPROMSIZE选项设置
00008 X 512Bytes默认即4K1000H00017 X 512Bytes00106 X 512Bytes00115 X 512Bytes01004 X 512Bytes01013 X 512Bytes01102 X 512Bytes01111 X 512Bytes10000 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代码/数据编程
关闭中断根据地址设置XPAGEIB_OFFSET如果需要写数据设置IB_DATA按照顺序设置IB_CON1 - 5添加4个NOP指令开始编程CPU将进入IDLE模式烧写完成后自动退出IDLE模式如需继续写入数据跳转至第2步XPAGE寄存器清0恢复中断设置。
2扇区擦除
关闭中断按相应的扇区设置XPAGE按照顺序设置IB_CON1 - 5添加4个NOP指令开始擦除CPU将进入IDLE模式擦除完成后自动退出IDLE模式如需要继续擦除数据跳转至第2步XPAGE寄存器清0恢复中断设置。
需要注意的几点
在对类EEPROM进行擦除、写或读之前应首先将FLASHCON寄存器的最低位FAC位置1。类EEPROM的扇区为512字节而不是1024字节。系统时钟不得低于 200kHz 以确保 FLASH 的正常编程。当不需对类 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
5SSP型选择寄存器
地址F2H, Bank0 符号IB_CON1
6SSP流程控制寄存器1
地址F3H, Bank0 符号IB_CON2
7 SSP流程控制寄存器2
地址F4H, Bank0 符号IB_CON3
8SSP流程控制寄存器3
地址F5H, Bank0 符号IB_CON4
9SSP流程控制寄存器4
地址F6H, Bank0 符号IB_CON5
10FLASHCON
A7HBank0第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访问控制 0MOVC指令或者SSP功能访问Main Block区域 1MOVC指令或者SSP功能访问类EEPROM区域或信息存储区
三、补充知识 C51的存储空间
1. C51的RAM空间
C51编译器可以访问8051的所有存储区域声明变量时可以指定分配的存储区下面是关键字
关键字存储空间地址范围访问方式data内部RAM低位128 bytes0x00~0x7F直接寻址idata内部RAM全部256 bytes0x00~0xFF间接寻址bdata内部RAM指定 16 bytes0x20~0x2F位寻址/直接寻址pdata扩展RAM低位256 bytes0x00~0xFF间接寻址xdata扩展RAM最大64K bytes0x0000~0xFFFF间接寻址codeFlash最大64K bytes0x0000~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.hvoid main()
{UCHAR val;// 选择高速时钟highFrequenceClk();// 擦除扇区EEPromSectorErase(0);// EEPROM 0x0100地址写值ssp_flag 0x5A;EEPromByteProgram(0x01,0x00,0x69);//读取EEPROM 0x0100地址的值valEEPromByteRead(0x01,0x00);while (1);
}
运行示例 3. 扇区删除
/**
* brief 扇区擦除
**/
void EEPromSectorErase(UCHAR nAddrH)
{// 保护中断 _push_(IEN0);//关总中断 IEN0 0x7F;// 访问EEPROM区FLASHCON 0x01; XPAGE nAddrH1 ;// 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*256nAddrL];// 切回 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/web/82903.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!