原创 STC内部EEPROM应用函数

2009-2-13 16:17 2844 6 7 分类: MCU/ 嵌入式
STC12C5410系列单片机内带2K EEPROM,分成4个扇区,每个扇区512byte。使用时注意以下几点:

1、  有三个基本命令:字节读,字节写,扇区擦除

2、  没有字节擦除,只有扇区擦除。如果要改变扇区中的某个字节,保留其它字节内容不变,必须先把其它字节读出来保存,然后擦除整个扇区,再把改动的字节内容和保存的其它字节内容写入扇区。

3、  扇区读写的时间短,擦除的时间比较长,要注意扇区擦除函数的调用位置,比如最好不要放在定时中断中。

4、  每个扇区用的越少越方便。

以下是应用函数:

#include <function.h>

#include <stc12cxxxx.h>

 

#define ISP_IAP_BYTE_READ 0x1;                       //字节读

#define ISP_IAP_BYTE_PROGRAM 0x2;                //字节编程, 可以将1 写成0 ,要将1 变成0 ,必须执行字节编程

#define ISP_IAP_SECTOR_ERASE 0x3;                 //扇区擦除, 可以将0 擦成1 ,要将0 变成1 ,必须擦除整个扇区

                                                                             //定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数

#define ENABLE_ISP 0x81;                             //系统工作时钟<24MHz 时,对ISP_CONTR 寄存器设置此值

 

#define DATA_FLASH_START_ADDRESS 0x2e00;  //STC12C5410AD 系列单片机的EEPROM 测试起始地址

 

void iap_disable () {

        ISP_ADDRL = 0xff;

        ISP_ADDRH = 0xff;

        ISP_CONTR = 0;                                           //关闭 IAP 功能

        ISP_CMD = 0;                                               //清命令寄存器,使命令寄存器无命令,此句可不用

        ISP_TRIG = 0;                                               //清命令触发寄存器,使命令触发寄存器无触发,此句可不用

}

uchar byte_read (uint address){

       uchar i;

    

       ISP_ADDRL = address;                            //设置目标单元地址

       ISP_ADDRH = address >> 8;

       ISP_CONTR = ENABLE_ISP;                                 //打开 IAP 功能, 设置 Flash 操作等待时间

       ISP_CMD = ISP_IAP_BYTE_READ;                //设置为IAP/ISP/EEPROM 字节读模式命令

       //EA=0;

       ISP_TRIG = 0x46;

       ISP_TRIG = 0xb9;                                    //先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此,送完B9h 后,ISP/IAP 命令立即被触发起动

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

      

       //EA=1;

       iap_disable ();                                           //;关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关

       i = ISP_DATA;                                                //读出的数据在ISP_DATA 单元中,送入累加器A

      

       return i;

 

}

 

void byte_program (uint address,uchar wr_data) {

        uchar i;

        

        ISP_ADDRL = address;                                  //设置目标单元地址

     ISP_ADDRH = address >> 8;

        ISP_DATA = wr_data;                              //要编程的数据先送进ISP_DATA 寄存器

        ISP_CONTR = ENABLE_ISP;                        //打开 IAP 功能, 设置 Flash 操作等待时间

        ISP_CMD = ISP_IAP_BYTE_PROGRAM;             //设置为IAP/ISP/EEPROM 字节编程模式命令

        //EA=0;

        ISP_TRIG = 0x46;

        ISP_TRIG = 0xb9;                                         //先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此,送完B9h 后,ISP/IAP 命令立即被触发起动

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

        //EA=1;

        iap_disable ();                                         //;关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态

}

void sector_erase (uint address) {

        uchar i;

        ISP_ADDRL = address;                                  //设置目标单元地址

     ISP_ADDRH = address >> 8;

        ISP_CONTR = ENABLE_ISP;                        //打开 IAP 功能, 设置 Flash 操作等待时间

        ISP_CMD = ISP_IAP_SECTOR_ERASE;        //设置为IAP/ISP/EEPROM 扇区擦除模式命令

        

        //EA=0;

        ISP_TRIG = 0x46;

        ISP_TRIG = 0xb9;                                         //先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此,送完B9h 后,ISP/IAP 命令立即被触发起动

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

        //EA=1;

        iap_disable ();

}
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1613410 2009-3-30 14:40

很好啊,学习了,谢谢
相关推荐阅读
用户1035191 2012-05-18 16:36
根据年月日计算星期
在门禁系统中要用到星期,但是在设置时间的时候,一般只设置年月日时分秒,不会去设置星期,那么如何根据年月日来得到星期?有一个公式: (年+年/4+年/400-年/100-年基数+月基数+日)%7...
用户1035191 2012-05-09 12:40
串口扩展芯片VK3214使用总结
最近一个项目需要用到3个串口,但是用的MCU只有2个串口,选择多串口的单片机成本太高,最后打算用串口扩展芯片VK3214扩展2个串口。 VK3214可以用单片机的一个串口扩展出4个子串口,每个...
用户1035191 2011-10-12 17:54
STM32串口发送时序图分析
下面是STM32使用手册上的串口发送时序图:1、 使能串口发送TE,此时USART_DR为空,此时应查询TXE是否置1,TXE置1,TX脚先发送一个空闲帧,把F1帧写入USART_DR,TXE被清零。...
用户1035191 2011-09-30 14:52
STM32的RTC实现日历功能程序
STM32的RTC只有一个32位的计数器用来计时,没有寄存器来存年月日时分秒等。通过设置可以让这个计数器1秒加1,从0-0XFFFFFFFF大概可以计时136年。程序要设置一个时间起点表示0,一般设...
用户1035191 2011-09-14 17:30
C语言计算时间差
以前曾写过一篇文章C51计算时间差,采用的算法是网上查到的,虽然测试没有问题,但是感觉那种算法不便于理解。最近重新考虑了一种算法。 用2个BCD码数组存储进场时间和出场时间: unsigned ch...
用户1035191 2011-08-24 17:06
C51扩展外部RAM释放P2口
51单片机经常要使用一些外部器件,有些器件内部有寄存器,一般都把这些寄存器当做外部RAM读写。以IC卡读卡芯片RC500为例,这个芯片有D0-D7共8个数据线,接在51的P0口,D0-D7既做>...
EE直播间
更多
我要评论
1
6
关闭 站长推荐上一条 /3 下一条