原创 hcs08系列单片机flash模拟eeprom函数例程

2009-5-6 19:14 2938 2 3 分类: MCU/ 嵌入式

/**********************EEPROM.C***********************/
/********作者:sly *************版本:1.0.0********/


#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */


#pragma DATA_SEG MY_ZEROPAGE
unsigned char RAM_CODE[60],pdata;
unsigned int faddr;



unsigned char Page_Erase(void)
 {
  static unsigned char * paddr;
 
  if (FSTAT&0x10){                     //Check to see if FACCERR is set
        FSTAT = FSTAT | 0x10;            //write a 1 to FACCERR to clear
    }
   
   paddr=(unsigned char *)faddr;
   *paddr=0xff;
    FCMD="0x40";
    FSTAT = FSTAT | 0x80;                //Put FCBEF at 1.
    _asm NOP;                            //Wait 4 cycles
    _asm NOP;
    _asm NOP;
    _asm NOP;
    if (FSTAT&0x30){                     //check to see if FACCERR or FVIOL are set
    return 0xFF;                         //if so, error.
    }
    while ((FSTAT&0x40)==0){ }            //else wait for command to complete
  
    return 0x00;
    }
   
   


unsigned char Program_Byte(void)
 {
  static unsigned char * paddr;
 
  if (FSTAT&0x10){                     //Check to see if FACCERR is set
        FSTAT = FSTAT | 0x10;            //write a 1 to FACCERR to clear
    }
   
   paddr=(unsigned char *)faddr;
   *paddr=pdata;
    FCMD="0x20";
    FSTAT = FSTAT | 0x80;                //Put FCBEF at 1.
    _asm NOP;                            //Wait 4 cycles
    _asm NOP;
    _asm NOP;
    _asm NOP;
    if (FSTAT&0x30){                     //check to see if FACCERR or FVIOL are set
    return 0xFF;                         //if so, error.
    }
    while ((FSTAT&0x40)==0){ }            //else wait for command to comple
    return 0x00;
 }  



void write_eeprom(unsigned char *data,unsigned char length,unsigned int first_addr)
{
  static unsigned char i;
  static void (*funcPtr)();
  static unsigned char *src,*dest;
     
  funcPtr =Program_Byte;
  i=60;
  src= (unsigned char *) funcPtr;
  dest= (unsigned char *)&RAM_CODE[0];
  do {
   *dest++ = *src++;
   }
    while(--i);
   
     faddr="first"_addr;
      for(i=0; i< length; i++)
      {
         pdata=*data++;
         asm (jsr RAM_CODE ) ;
         faddr++;
         }  
}


void erase(void) {


    static unsigned char i;
  static void (*funcPtr)();
  static unsigned char *src,*dest;
    funcPtr =Page_Erase;
    src= (unsigned char *) funcPtr;
    dest= (unsigned char *)&RAM_CODE[0];
    i="60";
    do{
        *dest++ = *src++;
    }
    while(--i);  
    faddr="0xf800";  
    asm (jsr RAM_CODE ) ;       // do page erase
}


在对flash编程时注意要点:


1先擦除,再写入。


2擦除只有也擦除,所以修改一个存储单元的值时,要将所有的单元读入ram中,修改后,将所有单元重新写入。


3写flash的时钟要确保在150k~200kHz之间。


以上函数经过freescale codewarrior 5.1版本测试通过。  


 
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2013-7-11 11:08

好!正好用着!
相关推荐阅读
用户226160 2009-05-06 20:14
ISL8502典型应用
VOUT = (R75/(R77+R78)+1)*0.6F = 48000000/R74...
用户226160 2009-05-06 19:36
ARM学习(1)
  今天本人的arm学习终于正式开始了,我的第一目标就是在arm上跑裸机,当做单片机使用。哈哈!高手不要笑我,循序渐进,是我的风格。说白了就是比较笨。首先我选择了用汇编入门,也许你会说为什么不用c呢?...
用户226160 2009-05-06 19:21
keil中关于使用_at_绝对地址定位问题
在网上看到有人提到在keil中使用_at_进行绝对地址定位问题,我简单介绍一下它的用法。 使用_at_关键字对存储器进行绝对地址定位程序如下#i nclude<reg51.h>char x...
用户226160 2009-05-06 19:19
韦根34发送程序
/****************wiegand34_v1.0 Head File***********************//**作者:SLY*************************版...
EE直播间
更多
我要评论
1
2
关闭 站长推荐上一条 /3 下一条