关于STC单片机EEPROM的应用总结

发布者:xxoke624最新更新时间:2015-05-04 来源: 51hei关键字:STC单片机  EEPROM 手机看文章 扫描二维码
随时随地手机看文章
当在程序运行的过程中你希望修改某个变量并且此变量的值在掉电以后不丢失,那么你就可以采用将变量数据写入EEPROM的方式来实现。
什么是EEPROM,即Electrically Erasable ProgrammableRead_Only Memory首先它是一种存储器,并且可以通过高电压来进行反复擦写的存储器。具有掉电数据不丢失的特点。比如常用的24C系列,93C系列的器件。一般这种器件采用I2C的方式与单片机进行通讯,对于这种通讯方式及器件的应用另作总结。这里主要总结一下,STC12C5204AD芯片内部包含的EEPROM的应用方法。
STC12C5201AD系列单片机内部集成了EEPROM是与程序空间分开的,利用ISP/IAP技术可将内部data flash当EEPROM,擦写10万次以上。
EEPROM可分为若干个扇区,每个扇区包含512字节。
使用时建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放在不同的扇区,不一定要用满。数据存储器的擦除操作是按扇区进行的。
在程序中可对EEPROM进行字节读写/字节编程/扇区擦除操作。在工作电压Vcc偏低时,建议不要进行EEPROM/IAP操作。以免发生数据错误。
应用的步骤
1、 声明与EEPROM相关的寄存器
2、 编写EEPROM初始化函数
3、 编写字节擦除函数
4、 编写字节编程函数
5、 编写字节读取函数
6、 在需要读取EEPROM字节内容时直接调用字节读取函数即可
7、 在需要进行写EEPROM字节时,先调用字节擦除函数,将字节内容擦除成FFH后,在调用字节编程函数,将数据写入到EEPROM的地址单元中。
 
与EEPROM应用相关的寄存器

 

符号
描述
地址
位地址及符号
复位值
IAP_DATA
ISP/IAP flash data register
C2H
 
 
 
 
 
 
 
 
1111 1111B
IAP_ADDRH
ISP/IAP flash address high
C3H
 
 
 
 
 
 
 
 
0000 0000B
IAP_ADDRL
ISP/IAP flash address low
C4H
 
 
 
 
 
 
 
 
 
IAP_CMD
ISP/IAP flash command register
C5H
 
 
 
 
 
 
MS1
MS0
 
IAP_TRIG
ISP/IAP flash command trigger
C6H
 
 
 
 
 
 
 
 
xxxxxxxxxB
IAP_CONTR
ISP/IAP control register
C7H
IAPEN
SWBS
SWRST
CMD_FAIL
 
WT2
WT1
WT0
0000X000B
PCON
Power control
87H
SOMD
SMOD0
LVDF
POF
GF1
GF0
PD
IDL
00110000B

 

1、IAP_DATA:ISP/IAP数据寄存器
     ISP/IAP操作时的数据寄存器。
ISP/IAP从FlASH读出的数据存放此处,向flash写的数据也需要放在此处。
2、 IAP_ADDRH和IAP_ADDRL :IAP/ISP地址寄存器
 
 
3、 IAP_CMD:ISP/IAP命令寄存器
 

 

MS1
MS0
命令/操作   模式选择
0
0
Standby 待机模式,无ISP操作
0
1
从用户程序区对“data flash /EEprom区”进行字节读
1
0
从用户的应用程序区对“data flash/eeprom区”进行字节编写
1
1
从用户的应用程序区对“data flash/eeprom区”进行扇区擦除

 

4、IAP_TRIG:ISP/IAP命令触发寄存器
在IAPEN(IAP_CONTR.7)=1时,对IAP——trig先写入5AH,在写入A5H,ISPIAP命令才会生效
ISPIAP操作完成后,IAP地址高8位寄存器IAP_ADDRH、IAP地址低8位寄存器IAP_ADDRL 和IAP命令寄存器IAP_CMD的内容不变。如果接下来要对下一个地址的数据进行IAP/ISP操作,需手动将该地址的高8位和低8位分别写入IAP_ADDRH和IAP_ADDRL寄存器。
每次IAP操作时,都要对IAP_TRIG先写入5AH,再写入A5H,ISP/IAP命令才会生效。
5、IAP_CONTR:ISPIAP控制寄存器

 

SFR name
Address
Bit
B7
B6
B5
B4
B3
B2
B1
B0
IAP_CONTR
C7H
Name
IAPEN
SWBS
SWRST
CMD_FAIL
_
WT2
WT1
WT0

 

IAPEN:ISP/IAP功能允许位:0:禁止IAP读/写/擦除 data flash /eeprom
                       1:允许IAP读/写/擦除 data flash /eeprom
SWBW:软件选择从用户应用程序区启动(送0),还是从系统ISP监控程序启动(送1)。
      要与SWRST直接配合使用才可以实现
SWRST:0:不操作;1:产生软件系统复位,硬件自动复位。
CMD_FAIL:如果送了ISP/IAP命令,并对IAP_TRIG送5AH/A5H触发失败,则为1,需由软件清零。
在用户应用程序区(AP区)软件复位并从用户应用程序区(AP区)开始执行程序。
MOV IAP_CONTR,#00100000B;SWBS=0(选择AP区),SWRST=1(软复位)
在用户应用程序区(AP区)软件复位并从系统ISP监控程序区开始执行程序
MOV IAP_CONTR,#01100000B;SWBS=1(选择ISP区),SWRST=1(软复位)
在系统ISP监控程序区软件复位并从用户应用程序区(AP区)开始执行程序
MOV IAP_CONTR,#00100000B;SWBS=0(选择AP区)SWRST=1(软复位)
在系统ISP监控程序区软件复位并从系统ISP监控程序区开始执行程序。
MOV IAP_CONTR,#01100000B;SWBS=1(选择ISP区),SWRST=1(软复位)
设置等待时间

 

设置等待时间
CPU等待时间(多少个CPU工作时钟)
WT2
WT1
WT0
Read/读
(2个时钟)
Program/编程(=55us)
Sector erase
扇区擦除
=21us
Recommended system clock
跟等待参数对应的推荐系统时钟
 
1
1
1
2个时钟
55个时钟
21012个时钟
<=1MHz
 
1
1
0
2个时钟
110个时钟
42024个时钟
<=2MHz
 
1
0
1
2个时钟
165个时钟
63036个时钟
<=3MHz
 
1
0
0
2个时钟
330个时钟
126072个时钟
<=6MHz
 
0
1
1
2个时钟
660个时钟
252144个时钟
<=12MHz
 
0
1
0
2个时钟
1100个时钟
420240个时钟
<=20MHz
 
0
0
1
2个时钟
1320个时钟
504288个时钟
<=24MHz
 
0
0
0
2个时钟
1760个时钟
672348个时钟
<=30MHz
 

 

12c系列单片机内部EEPROM选型一览表

 

型号
字节数(eeprom)
扇区数
起始扇区首地址
结束扇区末尾地址
STC12C5201AD/PWM
2K
4
0000h
07ffh
STC12C5202AD/PWM
2k
4
0000h
07ffh
STC12C5203AD/PWM
2k
4
0000h
07ffh
STC12C5204AD/PWM
1k
2
0000h
03ffh
STC12C5205AD/PWM
1k
2
0000h
03ffh

[page]

 
大建议:
1、 同一次修改的数据放在同一个扇区中不是同一次修改的数据放在另外的扇区就不须读出保护。
2、 如果一个扇区只用一个字节,那就是真正的EEPROM,STC单片机的Data flash 比外部EEPROM要快很多读一个字节/编程一个字节大概是2个时钟/55微秒。
3、 如果在一个扇区中存放了大量的数据,某次只需要修改其中的一个字节或一部分字节时,则另外的不需要修改的数据须先读出放在STC单片机的RAM中,然后擦除整个扇区,再将需要保留的数据和需修改的数据按字节逐字节写回该扇区中(只有字节写命令,无连续字节写命令)。这时每个扇区使用的字节数是使用的越少越方便(不需要读出一大堆需保留数据)。
常见问题:
1、 IAP指令完成后,地址是否会自动” 加1”或“减1”?
不会
2、 送5A和A5触发之后下一次IAP命令是否还需要送5A和A5触发?
是,一定要。
STC12C5201AD/PWM单片机内部EEPROM地址表

 

第一扇区
第二扇区
第三扇区
第四扇区
每个扇区
512字节
建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放在不同的扇区,不必用满,当然也可以用满。
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
0000h
1FFH
200H
3FFH
400H
5FFH
600H
7FFH
第五扇区
第六扇区
第七扇区
第八扇区
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
800H
9FFH
A00H
BFFH
C00H
DFFH
E00H
FFFH
第九扇区
第十扇区
第十一扇区
第十二扇区
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
1000H
11FFH
1200H
13FFH
1400H
15FFH
1600H
17FFH

 

 
下面就举一个例子来说明一下EEPROM的应用
   程序功能:
三个按键分别是,开关、增大、减小。通过7段数码管将键值显示出来(1-9)。
并将开关键关闭前的键值保存在EEPROM中,系统再次上电时显示上次关闭前的键值。
 
 
 
 
#include//头文件
#include”intrins.h”
/******宏定义*************/
#define uintunsigned int//用unsigned int 代替unsigned int
#define ucharunsigned char//用uchar 替代unsigned char
/*********位定义**************/
sbit SW=P3^2;//开关
sbit INC=P3^3;//增大按键
sbit DEC=P3^4;//减小按键
sbitDATA=P1^5;//595数据流
sbitSHIFT=P1^6;//595移位寄存器
sbitSTORAGE=P1^7;//595存储寄存器
sbitBEEP=P1^4;//蜂鸣器
/数码管显示代码
uchar codenum[]={0x01,0xf3,0x89,0xa1,0xb2,0xa4,0x84,0xf1,0x80,0x20} ; //0-9代码
 
//变量声明
bit kai=0,biaozhi=0;
uchar MA,dat;
/*定义与EEPROM相关的特殊功能寄存器*/
sfrIAP_DATA=0XC2;//FLASH data register
sfrIAP_ADDRH=0XC3;//FLASH address high
sfrIAP_ADDRL=0XC4;//FLASH address low
sfrIAP_CMD=0XC5;//FLASH command register
sfrIAP_TRIG=0XC6;//FLSH command trigger
sfrIAP_CONTR=0XC7;//flash control register
/*定义IAP/ISP/EEPROM命令*/
#define CMD_IDLE0//stand_by
#define CMD_READ1//byte_read
#defineCMD_PROGRAM 2//byte_program
#defineCMD_ERASE   3//sector_erase
/*定义与EEPROM相关的寄存器 */
//#defineENABLE_IAP 0X80  //if sysclk<30MHz
//#defineENABLE_IAP 0X81  //if sysclk<24MHz
//#defineENABLE_IAP 0X82  //if sysclk<20MHz
#defineENABLE_IAP 0X83  //if sysclk<12MHz//定义控制寄存器
//#defineENABLE_IAP 0X84  //if sysclk<6MHz
//#defineENABLE_IAP 0X85  //if sysclk<3MHz
//#define ENABLE_IAP  0X86 //if sysclk<2MHz
//#defineENABLE_IAP 0X87  //if sysclk<1MHz
 
/*定义EEPROM 的起始地址*/
#defineIAP_ADDRESS 0X0000
 
/****初始化函数**********/
Void iapidle()
{
 IAP_CONTR=0;//关闭IAP功能
 IAP_CMD=0;//CMD寄存器初始化
 IAP_TRIG=0;//清空触发寄存器
 IAP_ADDRH=0X80;//数据指针指向非EEPROM区
 IAP_ADDRL=0;//CLEAR IAP address to preventmisuse
}
/*读EEPROM的一个字节地址的内容
 输入:地址
 输出:EEPROM字节数据
 */
uchar iapreadbyte(uint addr)
{
 
 IAP_CONTR=ENABLE_IAP;//设置IAP控制寄存器
 IAP_CMD=CMD_READ;//设置IAP的命令寄存器为读状态
 IAP_ADDRL=addr;//设置EERPROM的低8位地址
 IAP_ADDRH=addr>>8;
 IAP_TRIG=0X5A;
 IAP_TRIG=0XA5;
 _nop_();
 dat=IAP_DATA;
 iapidle();
 return dat;
 
}
/*写一个字节的IAP/ISP/EEPROM空间
 输入: 字节地址
        要写入的数据
Void iapprogrambyte(uint addr,uchar dat)
{
IAP_CONTR=ENABLE_IAP;//打开IAP功能并设置等待时间
IAP_CMD=CMD_PROGRAM;//设置写命令
IAP_ADDRL=addr;//设置字节地址低8位
IAP_ADDRH=addr>>8;//设置字节地址的高8位
IAP_DATA=dat;//写内容
IAP_TRIG=0X5A;//发送触发命令1
IAP_TRIG=0XA5;//发送触发命令2
_nop_();//等待直到写操作完成
Iapidle();
}
/*扇区擦除
输入:地址
Void iaperasesector(uint 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();
}
/********写595函数*******************/
void write_595(uchar x)
{
 uchar j;
 for(j=0;j<8;j++)
        {
          x=x<<1;
          SHIFT=0;
          _nop_();
          _nop_();
          _nop_();
          DATA=CY;
          SHIFT=1;
          _nop_();
          _nop_();
          _nop_();
          SHIFT=0;
 
         }
 
}[page]
/********595输出函数函数*******************/
void out_595(void)
{
 STORAGE=0;
 _nop_();
 _nop_();
 STORAGE=1;
 _nop_();
 _nop_();
 STORAGE=0;
 
}                
 
/*软件延时 */
void delay(uchar t)
{ uchar x;
while(t--)
 {
for(x=0;x<250;x++)
 {
  _nop_();
  _nop_();
  _nop_();
  _nop_();
 }
 }
}
/******按键检测函数**********************/
void keycheck(void)
{
 if(SW==0)//判断开关按键是否按下
    {delay(10);//抗干扰
     if(SW==0)//确实按下
                {kai=~kai;
                    }
                    while(!SW)//一直按下
                    {BEEP=1;}//蜂鸣器响
                    BEEP=0;//松开按键,蜂鸣器关闭
           }
 if(INC==0&kai==1&MA<9)//如果处于开的状态并且数字小于9则按下增大键执行
        {
          delay(10);
          if(INC==0&kai&MA<9)
                 {MA++;}
                   while(!INC)
                   {BEEP=1;}
                   BEEP=0;
         }
 if(DEC==0&kai&MA>1)
      {
          delay(10);
          if(DEC==0&kai&MA>1)
                 {MA--;}
                   while(!DEC)
                   {BEEP=1;}
                   BEEP=0;
         }
  if(kai==1) //如果电源打开了,则将电源开的状态标志置1
  {biaozhi=1;}
  if(biaozhi==1&kai==0)//判断电源打开后被关闭,目的是只在开关键关闭时,写一次EEPROM,避免不停的擦写EEPROM
    { biaozhi=0;
            iaperasesector(0x00);
            programbyte(0x00,MA);
                        // 执行EEPROM写程
           }
   }
//主函数
Void main(void )
{
 
  BEEP=0; //关闭蜂鸣器
 iapreadbyte(0x00);//读出EEPROM的值
MA=dat;
if(MA<1|MA>9)//如果读出的值不在1-9范围内则强制为5.
{MA=5;}
 while(1)
 {
 keycheck();//执行按键扫描程序
 write_595(num[MA]);
 write_595(num[MA]);
 out_595();
 }
}
这只是一个简单的读写一个字节的简单测试程序,对于扇区擦除的结果也没有进行验证。
想要验证需要在加一段代码。具体请参照STC的数据手册。
关键字:STC单片机  EEPROM 引用地址:关于STC单片机EEPROM的应用总结

上一篇:74HC595在单片机上的应用及程序
下一篇:LCD1602.h头文件下载(完美液晶驱动文件)

推荐阅读最新更新时间:2024-03-16 14:00

ATmega64 EEPROM数据存储器
EEPROM 数据存储器 ATmega64 包含2K 字节的 EEPROM 数据存储器。它是作为一个独立的数据空间而存在 的,可以按字节读写。EEPROM 的寿命至少为100,000 次擦除周期。EEPROM 的访问 由地址寄存器、数据寄存器和控制寄存器决定。 P281“ 存储器编程” 包含使用SPI、JTAG 或并行编程模式对EEPROM 编程。 EEPROM 读/ 写访问 EEPROM 的访问寄存器位于I/O 空间。 EEPROM 的写访问时间由 Table 2 给出。自定时功能可以让用户软件监测何时可以开始 写下一字节。用户操作EEPROM 需要注意如下问题:在电源滤波时间常数比较大的电路 中,上电/ 下电
[单片机]
ATmega64 <font color='red'>EEPROM</font>数据存储器
STC单片机的IAP 实现不掉电下载程序
下面介绍不掉电载程序的实现过程。先要了解一点基础知识。单片机的复位,下载流等等。。。 首先说一下复位。STC89C52有的复位有两种,一种是上电复位,也就是冷启动,复位后检测串口那里有没有下载流,有的话跑去下载程序那里。还有一种是平时的按键复位,高电平有效那种的,不检测是否有下载流。 下载流是什么?就是串口发送给单片机要烧写程序的信息。STC89C52的下载流是0x7F,连续12个好像(官方公布是大于16 )。如果我们上位机点下载,它就通过一直发送0x7F给单片机。如果这是有上电复位,就烧写程序进去单片机。 我们的程序里面就是要用到这些,再介绍一下基本思路。我们需要单片机正常运行过程中检测是否有下载流(0x7F),如
[单片机]
<font color='red'>STC单片机</font>的IAP 实现不掉电下载程序
AT93C46/56/55串行EEPROM及单片机程序
摘要:AT93C46/56/66是Atmel公司生产的低功耗、低电压、电可擦除、可编程只读存储器,采用CMOS工艺技术制造并带有3线串行接口,其容量分别为1kB/4kB,可重复写100万次,数据可保存100年以上。文中介绍了该存储器的引脚功能和指令时序,给出了AT93C46/56/66和单片机的接口应用电路和软件程序。 关键词:EEPROM 存储器 接口应用 程序 AT93C46/56/66 16位单片机以其适于高速控制场合及功能多等优点已在工业控制领域中占领了一定的市场。由于EEPROM能在不脱离系统的情况下修改其存储单元中的内容,故在16位单片机中的应用愈来愈广泛。本文结合16位机的特点,详细介绍AT93系列EEPROM
[应用]
MAX16047A/MAX16049A EEPROM可配置系
 MAX16047A /MAX16049A EEPROM 可配置系统管理器能够对多个系统电压进行监测、排序和跟踪。MAX16047A可以同时管理12路系统电压,MAX16049A可以管理8路电源电压。该系列器件都集成了用于监控电源电压的模/数转换器(ADC)和用于排序、跟踪电源(在上电和掉电时)的可配置输出。非易失EEPROM寄存器可配置用于记录电压的上限和下限,根据要求设置定时和排序,也可以存储关键的故障数据,以便在发生故障后回读故障信息。   内部1%精度的10位ADC对每路输入进行测量,并将结果与上、下限电压门限以及一路可配置为上限或下限的电压进行比较。当检测电压超出设定门限时,产生故障报警信号。针对不同的故障条件可以
[模拟电子]
MAX16047A/MAX16049A <font color='red'>EEPROM</font>可配置系
STM8S_010_I2C读写EEPROM(硬件方式)
Ⅰ、写在前面 相信看过前面那篇文章“ 更加深入理解I2C总线、协议及应用 ”的人对I2C都有一定的了解了。那篇文章是针对I2C,使用单片机IO模拟I2C方式实现读写操作。 本文将讲述硬件I2C读写操作,也就是由处理器自身硬件的I2C实现时钟、数据的传输过程。 为方便大家阅读,本文内容已经整理成PDF文件: http://pan.baidu.com/s/1i5uWhJR 作者:strongerHuang 版权所有,未经允许,禁止用于其它商业用途!!! Ⅱ、STM8硬件I2C知识 STM8S的I2C模块不仅可以接收和发送数据,还可以在接收时将数据从串行转换成并行数据,在发送时将数据从并行转换成串行数据。可以开启或禁止
[单片机]
读写24LCxx系列的EEPROM的实例程序
读写24LCxx系列的EEPROM的实例程序 ;******************************************************** ;* * ;* ? P IC 16F877A ?I2C Master 家Α???﹃?Α EEPROM ?絛ㄒ祘Α * ;* * ;* Written by: Richard Yang * ;* Sr. Corporate Application Engineer * ;* Micro Chip Technology Inc.
[单片机]
STC单片机利用IAP技术实现EEPROM设计
STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次以上,先来介绍下ISP与IAP的区别和特点。 知识点:ISP与IAP介绍 ISP:In System Programable 是指在系统编程,通俗的讲,就是片子已经焊板子上,不用取下,就可以简单而方便地对其进行编程。比如我们通过电脑给STC单片机下载程序,或给AT89S51单片机下载程序,这就是利用了ISP技术。 IAP:In Application Programable 是指在应用编程,就是片子提供一系列的机制(硬件/软件
[单片机]
<font color='red'>STC单片机</font>利用IAP技术实现<font color='red'>EEPROM</font>设计
STC15F104E的STC单片机自动下载系统设计
引言 STC单片机是我国宏晶公司研制的一系列51单片机。STC单片机以传统的8051单片机为基础,经过技术改进和资源扩展,具有片内资源丰富、运算速度快、价格低等优点。STC单片机下载程序不需要编程器烧写,可以通过串口下载。美中不足的是,STC单片机下载时必须进行冷启动,即下载信号加到单片机串口以后必须对单片机断电再上电,这给用户带来了一些不便。尤其是反复调试程序需要多次下载时,显得更加繁琐。 为了解决这一问题,有必要研制一种STC单片机专用的自动下载系统,使系统接收到上位机发往单片机的下载信号后,自动冷启动STC单片机,完成下载任务。 1 原理分析 STC单片机下载时,需要使用宏晶公司提供的STCISP软件。下载开始时
[单片机]
STC15F104E的<font color='red'>STC单片机</font>自动下载系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved