查看: 1309|回复: 0
打印 上一主题 下一主题

单片机内部EEPROM应用函数

[复制链接]
跳转到指定楼层
沙发
发表于 2015-9-25 13:27:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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_ADDRESS0x2e00;  //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,ucharwr_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 ();
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表