STC——EEPROM(断电数据保护)

简介: STC——EEPROM(断电数据保护)

IAP15系列没有EEPRMOM,用户可直接操作用户程序区

扇区檫除,没有字节檫除

写入:要先檫除,然后在写入

一、相关寄存器

1.1、数据寄存器IAP_DATA
从Flash读出和写入的数据都放在此处

1.2、地址寄存器IAP_ADDRH和IAP_ADDRL
H:地址寄存器高八位

L:地址寄存器低八位

1.3、命令寄存器IAP_CMD

低2位有效:0待机,1字节读,2字节编程,3扇区檫除

1.4、命令触发寄存器IAP_TRIG
对IAP_TRIG先写5a,在写a5,isp/iap命令才会生效。

1.5、命令寄存器IAP_CONTR

IAPEN:isp/iap功能允许位

SWBS:软件选择复位后从用户程序启动(0),还是系统ISP监控程序区启动,要和SWRST配合使用

SWRST:0不操作,1软件控制产生复位。

CMD_FALL:IAP地址无效,且送了5a a5触发失败,则被置位1

WT2....:等待时间

二、c代码实现

include "stc15.h"

include "intrins.h"

/*sfr IAP_DATA = 0xC2;
sfr IAP_ADDRH = 0xC3;
sfr IAP_ADDRL = 0xC4;
sfr IAP_CMD = 0xC5;
sfr IAP_TRIG = 0xC6;
sfr IAP_CONTR = 0xC7;*/
typedef unsigned char u8;
typedef unsigned int u16;

define CMD_IDLE 0 //命令读,写,檫除

define CMD_READ 1

define CMD_PROGRAM 2

define CMD_ERASE 3

define ENABLE_IAP 0x82 // SYSCLK<20MHz 83 SYSCLK<=12Mhz

define IAP_ADDRESS 0xF000 //第121扇区起始地址

void delay(u16 n)
{
do

{
delay_us(900); 

}

while(--n);

}

//关闭iap
void IapIdle()
{

IAP_CONTR = 0;    //关闭IAP功能
IAP_CMD = 0;    //清楚命令寄存器
IAP_TRIG = 0;    //清除触发寄存器
IAP_ADDRH = 0x80;    //将地址设置到非IAP区
IAP_ADDRL = 0;

}
//扇区檫除
void IapESector(u16 addr)
{

IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_ERASE;    //设置命令
IAP_ADDRL = addr;    //设置地址
IAP_ADDRH = addr>>8;
IAP_TRIG = 0x5a;        //触发命令
IAP_TRIG = 0xa5;
_nop_();                //等待完成
IapIdle();            //关闭IAP

}

//写一字节
void IapProgramByte(u16 addr, u8 dat)
{

IAP_CONTR = ENABLE_IAP;    //使能IAP
IAP_CMD = CMD_PROGRAM;    //设置命令
IAP_ADDRL = addr;        //设置地址
IAP_ADDRH = addr>>8;
IAP_DATA = dat;        //写数据
IAP_TRIG = 0x5a;        //触发
IAP_TRIG = 0xa5;
_nop_();
IapIdle();

}

//读一字节
u8 IapReadByte(u16 addr)
{

u16 dat;
IAP_CONTR = ENABLE_IAP;    //使能IAP
IAP_CMD = CMD_READ;        //设置命令
IAP_ADDRL = addr;            //设置地址
IAP_ADDRH = addr>>8;
IAP_TRIG = 0x5a;            //触发
IAP_TRIG = 0xa5; 
_nop_();
dat = IAP_DATA;            //读数据
IapIdle();
return dat;

}

//写数据
u8 EEPROM_Write()
{

u16 i;

IapESector(IAP_ADDRESS); //檫除
for(i=0; i<512; i++){       //判断是否檫除成功
    if(IapReadByte(IAP_ADDRESS+i)!=0xff)
        return 0;
}
delay(10);
for(i=0; i<512; i++){
    IapProgramByte(IAP_ADDRESS+i, (u8)i );//写入数据
}
delay(10);
return 1;

}

//读
u8 EEPROM_Read()
{

u16 i;

for(i=0; i<512; i++){       //判断是否檫除成功
    if(IapReadByte(IAP_ADDRESS+i)!=(u8)i) //读出后校验是否正确
        return 0;
}
delay(10);
return 1;

}

目录
相关文章
|
5月前
|
芯片
使用EEPROM断电保存数据
本文介绍了Arduino中EEPROM的使用,EEPROM是一种非易失性存储器,用于在断电后保留数据。Arduino的各种控制器如UNO、duemilanove等内置或可外接EEPROM,容量不同。Arduino库提供了`EEPROM.h`来支持读写操作。示例代码展示了如何写入、读取和清除EEPROM的内容。写入时,通过`EEPROM.write()`函数将模拟输入值存入指定地址;读取时,用`EEPROM.read()`函数获取地址处的值;清除则遍历所有地址并写入0。
131 5
单片机 (MCU) 如何才能不死机之 IIC 操作
单片机 (MCU) 如何才能不死机之 IIC 操作
|
5月前
|
芯片
一款外置MOS开关降压型 LED 恒流控制器应用方案
一、基本概述 TX6121 是一款高效率、高精度的降压型大功率 LED 恒流驱动控制器芯片。芯片采用固定关断时间的峰值电流控制方式,关断时间可通过外部电容进行调节,工作频率可根据用户要求而改变。 通过调节外置的电流采样电阻,能控制高亮度 LED 灯的驱动电流,使 LED 灯亮度达到预期恒定亮度。在 DIM 端加 PWM信号,可以进行 LED 灯调光。DIM 端同时支持线性调光。芯片内部集成了 VDD 稳压管以及过温保护电路,减少外围元件并提高系统可靠性。芯片采用 SOT23-6封装 二、产品特点 三、应用领域 电路框图 原理图 四、电气特性 测试条件: HVDD=5.5V,TA
119 1
|
5月前
|
监控 物联网
STC51单片机-双机串口通讯-物联网应用系统设计
STC51单片机-双机串口通讯-物联网应用系统设计
114 0
|
存储 芯片
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
484 0
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
TRICONEX 3006 英维思 关断电流以防止器件损坏
TRICONEX 3006 英维思 关断电流以防止器件损坏
TRICONEX 3006  英维思  关断电流以防止器件损坏
|
传感器 搜索推荐 API
红外热成像仪 EEPROM、 RAM、寄存器说明
EEPROM 地址范围为 0x2400~0x273F,共 832 个字(1664 字节), 前 16 个字包含了唯一 ID 码、工作参数(上电后自动同步到寄存器)、 MLX90640 的 I2C 地址。后面的 816 个字全部是每个像素的校正或者测量参数,数据手册也没有写每个数据到底是什么意思,直接用就是了,不要问为什么。
红外热成像仪  EEPROM、 RAM、寄存器说明
|
固态存储 内存技术
SSD主控与NAND闪存之多通道交互
目前主流的SSD会有4或者8个Channel,SSD主控有一个专门的模块管理不同Channel之间的读写操作。
|
存储 安全
ADC+DMA采集配置能量机关
ADC+DMA采集配置能量机关
198 0