【51单片机快速入门指南】7:片上EEPROM

发布者:Tianran2021最新更新时间:2022-07-14 来源: csdn关键字:51单片机  快速入门  片上EEPROM 手机看文章 扫描二维码
随时随地手机看文章

硬知识

       摘自《STC89C52系列单片机器件手册》


       STC89C5x系列单片机内部集成了的EEPROM是与程序空间是分开的,利用ISP/IAP技术可将内部Data Flash当EEPROM,擦写次数在10万次以上。EEPROM可分为若干个扇区,每个扇区包含512字节。使用时,建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放在不同的扇区,不一定要用满。数据存储器的擦除操作是按扇区进行的。

       EEPROM可用于保存一些需要在应用过程中修改并且掉电不丢失的参数数据。在用户程序中,可以对EEPROM进行字节读/字节编程/扇区擦除操作。在工作电压Vcc偏低时,建议不要进行EEPROM/IAP操作。


IAP及EEPROM新增特殊功能寄存器介绍

在这里插入图片描述

ISP/IAP数据寄存器ISP_DATA

       ISP_DATA : ISP/IAP操作时的数据寄存器。

       ISP/IAP 从Flash读出的数据放在此处,向Flash写的数据也需放在此处

ISP/IAP地址寄存器ISP_ADDRH和ISP_ADDRL

       ISP_ADDRH : ISP/IAP 操作时的地址寄存器高八位。 该寄存器地址为E3H,复位后值为00H.

       ISP_ADDRL : ISP/IAP 操作时的地址寄存器低八位。 该寄存器地址为E4H,复位后值为00H.

ISP/IAP命令寄存器ISP_CMD

       ISP/IAP命令寄存器IAP_CMD格式如下:

在这里插入图片描述
在这里插入图片描述

       程序在系统ISP程序区时可以对用户应用程序区/数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除;程序在用户应用程序区时,仅可以对数据Flash 区(EEPROM)进行字节读/字节编程/扇区擦除。已经固化有ISP引导码,并设置为上电复位进入ISP

ISP/IA命令触发寄存器ISP_TRIG

       ISP_TRIG: ISP/IAP 操作时的命令触发寄存器。 在ISPEN(ISP_CONTR.7) = 1 时,对ISP_TRIG先写入46h,再写入B9h,ISP/IAP 命令才会生效。

       ISP/IAP操作完成后,ISP地址高八位寄存器ISP_ADDRH、ISP地址低八位寄存器ISP_ADDRL和ISP命令寄存器ISP_CMD的内容不变。如果接下来要对下一个地址的数据进行ISP/IAP操作,需手动将该地址的高8位和低8位分别写入ISP_ADDRH和ISP_ADDRL寄存器。

       每次ISP操作时,都要对ISP_TRIG先写入46H,再写入B9H,ISP/IAP命令才会生效。

ISP/IAP命令寄存器ISP_CONTR

       ISP/IAP控制寄存器IAP_CONTR格式如下:

在这里插入图片描述

       ISPEN: ISP/IAP功能允许位。

              0:禁止IAP/ISP读/写/擦除Data Flash/EEPROM

              1: 允许IAP/ISP读/写/擦除Data Flash/EEPROM

       SWBS: 软件选择从用户应用程序区启动(送0),还是从系统 ISP监控程序区启动(送1)。要与SWRST直接配合才可以实现

       SWRST:

              0: 不操作;

              1: 产生软件系统复位,硬件自动复位。

       ;在用户应用程序区(AP区)软件复位并从系统ISP监控程序区开始执行程序

              MOV ISP_CONTR, #01100000B ;SWBS = 1(选择ISP区), SWRST = 1(软复位)

       ;在系统ISP监控程序区软件复位并从用户应用程序区(AP 区)开始执行程序

              MOV ISP_CONTR, #00100000B ;SWBS = 0(选择AP 区), SWRST = 1(软复位)

在这里插入图片描述

EEPROM空间大小及地址

内部可用EEPROM的地址与程序空间是分开的:程序在用户应用程序区时,可以对EEPROM 进行IAP/ISP操作。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小常识

       3个基本命令——字节读,字节编程,扇区擦除

       字节编程:将"1"写成"1"或"0",将"0"写成"0"。如果某字节是FFH,才可对其进行字节编程。如果该字节不是FFH,则须先将整个扇区擦除,因为只有“扇区擦除”才可以将"0"变为"1"。

       扇区擦除:只有“扇区擦除”才可能将"0"擦除为"1"。


大建议

同一次修改的数据放在同一扇区中,不是同一次修改的数据放在另外的扇区,就不需读出保护。

如果一个扇区只用一个字节,那就是真正的EEPROM,STC单片机的Data Flash比外部EPROM要快很多,读一个字节/编程一个字节大概是10us/60us/10ms

如果在一个扇区中存放了大量的数据,某次只需要修改其中的一个字节或一部分字节时,则另外的不需要修改的数据须先读出放在STC单片机的RAM中,然后擦除整个扇区,再将需要保留的数据和需修改的数据按字节逐字节写回该扇区中(只有字节写命令,无连续字节写命令)。这时每个扇区使用的字节数是使用的越少越方便(不需读出一大堆需保留数据)。

常见问题

IAP指令完成后,地址是否会自动“加1”或“减1”? 答:不会。

送46和B9触发后,下一次IAP命令是否还需要送46和B9触发?答:是,一定要。

示例程序

改自官方例程。


EEPROM.c

/*------------------------------------------------------------------*/

/* --- STC MCU Limited ---------------------------------------------*/

/* --- STC89-90xx Series MCU ISP/IAP/EEPROM Demo -------------------*/

/* --- Mobile: (86)13922805190 -------------------------------------*/

/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/

/* --- Tel: 86-0513-55012928,55012929,55012966----------------------*/

/* --- Web: www.STCMCU.com -----------------------------------------*/

/* --- Web: www.GXWMCU.com -----------------------------------------*/

/* If you want to use the program or the program referenced in the  */

/* article, please specify in which data and procedures from STC    */

/*------------------------------------------------------------------*/


#include

#include "EEPROM.h"

#include "intrins.h"


/*Declare SFR associated with the IAP */

sfr IAP_DATA    =   0xE2;           //Flash data register

sfr IAP_ADDRH   =   0xE3;           //Flash address HIGH

sfr IAP_ADDRL   =   0xE4;           //Flash address LOW

sfr IAP_CMD     =   0xE5;           //Flash command register

sfr IAP_TRIG    =   0xE6;           //Flash command trigger

sfr IAP_CONTR   =   0xE7;           //Flash control register


/*Define ISP/IAP/EEPROM command*/

#define CMD_IDLE    0               //Stand-By

#define CMD_READ    1               //Byte-Read

#define CMD_PROGRAM 2               //Byte-Program

#define CMD_ERASE   3               //Sector-Erase


void Delay(unsigned char n);

void IapIdle();


/*----------------------------

Disable ISP/IAP/EEPROM function

Make MCU in a safe state

----------------------------*/

void IapIdle()

{

    IAP_CONTR = 0;                  //Close IAP function

    IAP_CMD = 0;                    //Clear command to standby

    IAP_TRIG = 0;                   //Clear trigger register

    IAP_ADDRH = 0x80;               //Data ptr point to non-EEPROM area

    IAP_ADDRL = 0;                  //Clear IAP address to prevent misuse

}


/*----------------------------

Read one byte from ISP/IAP/EEPROM area

Input: addr (ISP/IAP/EEPROM address)

Output:Flash data

----------------------------*/

unsigned char IapReadByte(unsigned short addr)

{

    unsigned char dat;                       //Data buffer


    IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time

    IAP_CMD = CMD_READ;             //Set ISP/IAP/EEPROM READ command

    IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low

    IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high

    IAP_TRIG = 0x46;                //Send trigger command1 (0x46)

    IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)

    _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete

    dat = IAP_DATA;                 //Read ISP/IAP/EEPROM data

    IapIdle();                      //Close ISP/IAP/EEPROM function


    return dat;                     //Return Flash data

}


/*----------------------------

Program one byte to ISP/IAP/EEPROM area

Input: addr (ISP/IAP/EEPROM address)

       dat (ISP/IAP/EEPROM data)

Output:-

----------------------------*/

void IapProgramByte(unsigned short addr, unsigned char dat)

{

    IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time

    IAP_CMD = CMD_PROGRAM;          //Set ISP/IAP/EEPROM PROGRAM command

    IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low

    IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high

    IAP_DATA = dat;                 //Write ISP/IAP/EEPROM data

    IAP_TRIG = 0x46;                //Send trigger command1 (0x46)

    IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)

    _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete

    IapIdle();

}


/*----------------------------

Erase one sector area

Input: addr (ISP/IAP/EEPROM address)

Output:-

----------------------------*/

void IapEraseSector(unsigned short addr)

{

    IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time

    IAP_CMD = CMD_ERASE;            //Set ISP/IAP/EEPROM ERASE command

    IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low

    IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high

    IAP_TRIG = 0x46;                //Send trigger command1 (0x46)

    IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)

    _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete

    IapIdle();

}


unsigned char IapWriteBytes(unsigned short addr, unsigned char * pData, unsigned short len)

{

unsigned char temp[512], Addr = addr;

unsigned short i;

Addr >>= 9;

Addr <<= 9;

addr %= 512;

for(i = 0; i < 512; ++i)

{

temp[i] = IapReadByte(Addr + i);

}

for(i = 0; i < len; ++i)

{

temp[addr + i] = *(pData + i);

}

IapEraseSector(Addr);    //Erase current sector

    for (i = 0; i < 512; ++i)           //Program 512 bytes data into data flash

[1] [2]
关键字:51单片机  快速入门  片上EEPROM 引用地址:【51单片机快速入门指南】7:片上EEPROM

上一篇:【51单片机快速入门指南】8:看门狗定时器(WDT)
下一篇:【51单片机快速入门指南】6.4:DHT11、DHT22单总线温湿度传感器

推荐阅读最新更新时间:2024-11-13 10:20

51单片机8*8点阵LED程序
在8X8点阵LED上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。 1. 程序设计内容 8X8点阵LED工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述: 一根竖柱:对应的列置1,而行则采用扫描的方法来实现。 一根横柱:对应的行置0,而列则采用扫描的方法来实现。 2. 硬件电路 3.汇编源程序 ORG 00
[单片机]
<font color='red'>51单片机</font>8*8点阵LED程序
51单片机系统中使用8155
简介:单片机自身的 RAM 存储空间和引脚数目往往有些不足,当需要在外部拓展不太多的时候,8155 芯片就是首选了。 一片8155,可以提供256字节的RAM,3个并行IO接口和一个14位的定时器。 8155的内部还集成了地址锁存器,如果只是需要扩展8155,就可以省去常用的地址锁存器74LS373。 下面,先写一个使用单片机自身资源来驱动16个LED进行流水的程序。 然后,再把它改造为利用8155来驱动。 利用51单片机驱动16个LED流水灯的汇编语言程序如下。 ;========================================================= ;16个LED接到P0
[单片机]
在<font color='red'>51单片机</font>系统中使用8155
51单片机lcd代码
#include ../delay/delay.h #include lcd.h /*==================================================== 判断写入命令/数据函数 =====================================================*/ void lcd_write(unsigned char byte, unsigned char flag) { if(flag) { RS = 1; //选择数据寄存器 } else {
[单片机]
51单片机接收数组知识
简介:最近在做一个项目,其中有一模块是需要通过串口使单片机与电脑进行通信,在单片机中我是用C语言进行编程,在应用程序中是用.net编程。其中有一个要求是电脑一次发送十个数据,单片机里定义一个数组,接收这10个数据。 可是在进行检验的过程中却发现接收的数据会移位,比如我从电脑中发送的数据是a,b,c,d,e,f,i,j,k,l.那么理论上我在单片机中定义的数组array 应该也是array ={a,b,c,d,e,f,i,j,k,l.可实际上却不是这样子的,正真接收的数据是array ={l,a,b,c,d,e,f,i,j,k,};也就是移了一位,第十位跑到了第一位,第一位到了第二位。之后的就不会再移位,出现这样的原因是因为单片
[单片机]
8051单片机定时器溢出中断误差补偿示例
  1 前言   单片机内部一般有若干个定时器。如8051单片机内部有定时器0和定时器1。在定时器计数溢出时,便向CPU发出中断请求。当CPU正在执行某指令或某中断服务程序时,它响应定时器溢出中断往往延迟一段时间。这种延时虽对单片机低频控制系统影响甚微,但对单片机高频控制系统的实时控制精度却有较大的影响,有时还可能造成控制事故。为扩大单片机的应用范围,本文介绍它的定时器溢出中断与CPU响应中断的时间误差、补偿误差的方法和实例。   2 误差原因、大小及特点   产生单片机定时器溢出中断与CPU响应中断的时间误差有两个原因。一是定时器溢出中断信号时,CPU正在执行某指令;二是定时器溢出中断信号时,CPU正在执行某中断服务程序。
[单片机]
AT89C51单片机在LED显示屏控制电路设计中的应用
LED显示屏又叫电子显示屏,是由LED点阵组成,通过红色或绿色灯珠的亮灭来显示文字、图片、动画、视频,内容可以随时更换,通常由显示模块、控制系统及电源系统组成。显示模块由LED灯组成的点阵构成,负责发光显示;控制系统通过控制相应区域的亮灭,可以让屏幕显示文字、图片、视频等内容,恒舞动卡主要是播放动画的;电源系统负责将输入电压电流转为显示屏需要的电压电流。 LED显示屏广泛应用于信息指示灯,大屏幕显示,液晶显示的背光灯,固体照明等。本文设计一种由4个16×16点阵LED模块组成的显示屏,由单片机作控制器,平滑移动显示任意多个文字或图形符号,本电路可级联扩展实现由任意多个16×16点阵LED模块组成的显示屏。 一、控制电路设计 控制电
[电源管理]
AT89C<font color='red'>51单片机</font>在LED显示屏控制电路设计中的应用
51单片机-数码管
共阴极是指所有发光二极管阴极连接在一起,这个共阴极可以用来做片选。 如图,这里有8个发光二极管,到底哪个亮需要进行片选。 段选:8段数码管每一段的控制段叫段选 位选:就是进行哪个8段数码管亮的选择 TX-1C使用两片锁存器74HC573实现位选和段选 这里的D0 7是连在单片机的I/O口上,当为高电平时,Q与D中的数据一致,遇到负跳变沿时Q中的 数据保持住,D中的数据即使变化也不会影响Q。 MCU Version2使用的是74HC245和38译码器74HC138 74HC245有一个缓冲和驱动的作用,这样可以使led显示的更加稳定, 数码管显示分动
[单片机]
<font color='red'>51单片机</font>-数码管
基于51单片机的电动车手机充电器设计
0 引言 众所周知,现在车载充电器在汽车产业中是非常普遍。在全球提倡环保和低碳节能的重要时期,骑自行车或电动自行车的人也越来越普遍,然而,现在的电动自行车都没有为手机充电的功能,因此,设计一种电动自行车车载手机充电器无疑是非常有必要的。本文就是利用电动车的太阳能电池板作为电源,设计一种种电动车车载手机充电器,以使骑电动车的人不再为手机充电发愁。 1 系统原理 在电动车的车篮上方位置处安装一块太阳能电池板套件,再将单片机控制电路与套件通过线路相连接,在太阳光充足的情况下,太阳能电池板可以工作,将吸收来的光辐射转换电能,为单片机控制电路提供电流和电压,再通过单片机控制电路为手机充电。太阳能电池板套件工作时,既可以为充电器单路
[单片机]
基于<font color='red'>51单片机</font>的电动车手机充电器设计
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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