历史上的今天
返回首页

历史上的今天

今天是:2025年02月01日(星期六)

2018年02月01日 | STC内部EEPROM应用函数

2018-02-01 来源:eefocus

STC12C5410系列 单片机 内带2K EEPROM,分成4个扇区,每个扇区512byte。使用时注意以下几点: 
1、  有三个基本命令:字节读,字节写,扇区擦除 
2、  没有字节擦除,只有扇区擦除。如果要改变扇区中的某个字节,保留其它字节内容不变,必须先把其它字节读出来保存,然后擦除整个扇区,再把改动的字节内容和保存的其它字节内容写入扇区。 

3、  扇区读写的时间短,擦除的时间比较长,要注意扇区擦除函数的调用位置,比如最好不要放在定时中断中。 
4、  每个扇区用的越少越方便。 
以下是应用函数: 
#include  
#include  
  
#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 (); 
}


推荐阅读

史海拾趣

问答坊 | AI 解惑

最创意的太阳能光合吊灯

 这是由XDESIGN环境质量检测所委托Brooklyn-based Token工作室设计开发的一款太阳能光合吊灯,被名为“GreenLight”,另外也可以说它是一款吊起的花盆,因为除了照明作用外,确实还可以用它种植花草。灯的主体是由手吹玻璃制成,半透明的质感散发 ...…

查看全部问答>

串口通信只能输出3个字符

我编写了一个串口程序,能接收和输出,但是当接收超过4个字符时,就出现显示乱码,不知道是什么设置问题还是程序编写问题,谁能帮忙解决下,谢谢…

查看全部问答>

max3232的误码问题

最近新设计了一块板子 板子上设计了一片MAX3232用于单片机和上位机的串口通讯,板子焊接完毕后 写了一个简单的程序测试了一下,功能是单片机把从PC端接收的数据原样返回,可是发现会有很高的误码率 用示波器测试了一下,从单片机发送至PC的数据经M ...…

查看全部问答>

H.264官方中文文档!~

不用多说了,做视频的应该知道吧!~…

查看全部问答>

xc866实验实例

这是在豆丁上截屏整理的,花费了俺不少时间,现在传上来与大家分享,做的不是很好,大家凑合这看看吧…

查看全部问答>

片内DACbuffer居然不是rail2rail

资料里说,只能输出0.2v ~~ REF-0.2v ( 0e0 ~~ f1c)晕了。不加buffer的阻抗没有提及。估计n百k ?…

查看全部问答>

越来越适应STM32的库方式编程了

越来越适应STM32的库方式编程了 估计这样下去,再过三年就不会别的单片机编程了…

查看全部问答>

请教一段分频器代码的问题

本人刚刚学FPGA,用verilog写了个20分频,占空比是50%的代码,但是结果不对。不知道问题出在哪儿了,请教高手们问题出在哪儿? module fenpin(gclk_20m, encoder_clock);input gclk_20m;output encoder_clock;reg encoder_clock;reg [10:0] cnt = ...…

查看全部问答>

有关淘E淘的建议

今天下午在淘E淘版块逛了几个小时,本来是想找些廉价的板子玩,但是在寻找的过程中发现好多问题,首先有些帖子出售开发板,卖了没卖我们这些人都不知道(因为有些LZ根本没有说,在加上好多帖子又会被新帖给压下去,导致我们查找相关的信息很困难) ...…

查看全部问答>

招兼职ucos相关讲师

招兼职ucos相关讲师,周期短,可周末,如您想挣点外块,积累资源,充实生活,请联系我,要求有实际项目经历,两年以上项目经历,表达能力较好,有意者请联系QQ:2294693830,邮件soft@info-soft.cn。…

查看全部问答>