数据载入中...  
数据载入中...
时 间 记 忆
数据载入中...
最 新 评 论
数据载入中...
专 题 分 类
数据载入中...
最 新 日 志
数据载入中...
最 新 留 言
数据载入中...
搜 索
用 户 登 录
数据载入中...
友 情 连 接
博 客 信 息
数据载入中...


 
hcs08系列单片机flash模拟eeprom函数例程
[ 2008-4-24 9:30:00 | By: 龙狼传 ]
 

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

#i nclude <hidef.h> /* for EnableInterrupts macro */
#i nclude "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版本测试通过。  

 
  • 标签:freescale flash eeprom 
  • 发表评论:
    数据载入中...
    Powered by McuBLog.