新闻  |   论坛  |   博客  |   在线研讨会
hcs08系列单片机flash模拟eeprom函数例程
0750long | 2009-05-14 11:32:00    阅读:2957   发布文章

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

/**********************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版本测试通过。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客