okARM 发表于 2011-4-13 11:39:08

闪存改写源代码

/***********************************************************************/
/*                                                                     */
/*FILE      :R5F212L.c                                             */
/*This file is generated by Renesas Project Generator (Ver.4.12).    */
/*            //对一个块中的数据写入时,必须对整个的块擦除                                                       */
/***********************************************************************/
#include "sfr_r82l.h"

/*Definition of const data    */
#define BLOCK_A   ((unsigned char *)0x2400)       /*BLOCK A first address   */
#define BLOCK_A_END ((unsigned char *)0x27ff)       /*BLOCK A last address    */
#define BLOCK_B   ((unsigned char *)0x2800)       /*BLOCK B first address   */
#define BLOCK_B_END ((unsigned char *)0x2Bff)       /*BLOCK B last address    */

#define RECORD_PER_BLOCK    1          /*Record number per 1 block   */
#define RECORD_SIZE         1024         /*Record size */

#define BLOCK_A_SELECT      0         /*Use BLOCK A */
#define BLOCK_B_SELECT      1         /*Use BLOCK B */

#define COMPLETE            0x00      /*FLASH write/erase complete*/
#define PROGRAM_ERR         0x01      /*FLASH data write error*/
#define ERASE_ERR         0x02      /*FLASH erase error   */


/* Definition of RAM area */
unsigned char *write_addr;            /*Write address   */
unsigned char block_select;             /*Block select flag   */

unsigned char*write_addr_temp1;
unsigned char*write_addr_temp2;

/* Declaration of function prototype */
void write_address_init(void);
unsigned char flash_write(unsigned char *data);
unsigned char block_erase(unsigned char *ers_addr);
unsigned char data_write(unsigned char *write_data);
void make_data(unsigned char *write_data);
void main(void)
{
    static unsigned char write_data;   /*wirte data*/
    unsigned char result;
   unsigned int i = 0;

    /*-----------------------------------------------
    -Change on-chip oscillator clock to Main clock-
    -------------------------------------------------*/
    prc0 = 1;                               /* Protect off */
    cm13 = 1;                               /* Xin Xout */
    cm15 = 1;                               /* XCIN-XCOUT drive capacity select bit : HIGH */
    cm05 = 0;                               /* Xin on */
    while( i <= 255 ) i++;                  /* This setting is an example of waiting time for the */
                                          /* oscillation stabilization. Please evaluate the time*/
                                          /* for oscillation stabilization by a user. */
    ocd2 = 0;                               /* Main clock change */
    cm16 = 0;                               /* Main clock = No division mode */
    cm17 = 0;
    cm06 = 0;                               /* CM16 and CM17 enable */
    prc0 = 0;                               /* Protect on */

    /*-----------------------------------
    -   Initialize SFR                  -
    -----------------------------------*/
    prcr = 0x02;
    pm1 = 0x01;                         /*Data block enable   */
    prcr = 0;
    fmr4 = 0x00;                        /*Erase suspend mode disable*/
   
    write_address_init();               /*   Write address pointer initialize   */
    make_data(write_data);          /*Make write data   */
      /*Data write*/
    result = flash_write(write_data);
    if( (result & PROGRAM_ERR) != 0 )
    {
      /*Program error   */
    }
    if( (result & ERASE_ERR) != 0)
    {
       /*Erase error */
   }
   write_addr_temp1 = BLOCK_A;
    write_addr_temp2 = BLOCK_A+10;


    while(1)
    {
         
         
      
    }   
   
}
/************************************************************************************
Name:      make_data
Parameters:Record data pointer
Returns:   None
Description: Make record data
************************************************************************************/
void make_data(unsigned char *data)
{
    /*Make record data    */
    data=40;
    data=50;
    data=60;
}
/************************************************************************************
Name:      write_address_init
Parameters:None
Returns:   None
Description: Write address initialize
************************************************************************************/
void write_address_init(void)
{
    int i;
    int j;

    write_addr = BLOCK_A;                   /*first sarch address */
   
    /*Brank record check*/
    while( write_addr <= BLOCK_B_END )
    {
      /*Record all ff check */
      for(j = 0; j < RECORD_SIZE; j++)
      {
            if( write_addr != 0xff )
            {
                break;
            }
      }
      if (j == RECORD_SIZE)
      {
            break;
      }
      write_addr = write_addr + RECORD_SIZE;            /*Check address renew */
    }
   
    if(write_addr >= BLOCK_B_END+1)
    {
      /*if BLOCK A and BLOCK B are full then BLOCK A erase*/
      block_erase(BLOCK_A);
      write_addr = BLOCK_A;
      block_select = BLOCK_A_SELECT;
    }
    else if(write_addr >= BLOCK_B)
    {
      /*Use BLOCK B */
      block_select = BLOCK_B_SELECT;
    }
    else
    {
      /*Use BLOCK A */
      block_select = BLOCK_A_SELECT;
    }
}


/************************************************************************************
Name:      flash_write
Parameters:Write record data
Returns:   Result (Complete or program error or erase error)
Description: Initial setting of SFR registers
************************************************************************************/
unsigned char flash_write(unsigned char *data)
{
    unsigned char result = COMPLETE;
   
    if( data_write( data ) != COMPLETE )
    {
      /*Program error occurence */
      result = result | PROGRAM_ERR;      /*if program error    */
    }
    /*Next write address update   */
    write_addr = write_addr + RECORD_SIZE;
   
    if( (block_select == BLOCK_A_SELECT) && (write_addr > BLOCK_A_END) )
    {
      /*BLOCK A all write   */
      if( block_erase( BLOCK_B ) != COMPLETE )
      {
            /*Erase error occurence   */
            result = result | ERASE_ERR;
      }
      block_select = BLOCK_B_SELECT;
      write_addr = BLOCK_B;
    }
    else if( (block_select == BLOCK_B_SELECT) && (write_addr > BLOCK_B_END) )
    {
      /*BLOCK B all write   */
      if( block_erase( BLOCK_A ) != COMPLETE )
      {
            /*Erase error occurence   */
            result = result | ERASE_ERR;
      }
      block_select = BLOCK_A_SELECT;
      write_addr = BLOCK_A;
    }
   
    return result;
   
}

/************************************************************************************
Name:      block_erase
Parameters:Erase block address
Returns:   Erase result
Description: Block erase
************************************************************************************/
unsigned char block_erase(unsigned char *ers_addr){
    unsigned char erase_result;
    /*If use interrupt then clear i flag...   */
    /*asm("fclr   i   "); */
   
    /*flash control register set*/
    fmr0 = 0x01;
    asm(" ");       /*Description for preventing the abbreviation by optimization */
    fmr0 = 0x03;                        /*CPU rewrite enable*/
    fmr1 = 0x80;
    asm(" ");       /*Description for preventing the abbreviation by optimization */
    fmr1 = 0x82;                        /*EW1 mode    */
   
    *ers_addr = 0x20;                   /*Block erase command write   */
    *ers_addr = 0xd0;                   /*Block erase command write   */
    while( fmr00 != 1 );                /*Ready check */
   
    /*Erase status check*/
    if( fmr07 == 1 ){
      *ers_addr = 0x50;               /*Clear stutus register   */
      erase_result = ERASE_ERR;
    }else{
      erase_result = COMPLETE;
    }
    /*flash control register reset    */
    fmr0 = 0x01;                  /*CPU rewrite disable */

    /*If use interrupt then set i flag... */
    /*asm("fset   i   "); */

    returnerase_result;
}


/************************************************************************************
Name:      data_write
Parameters:Record data address
Returns:   Program result
Description: Record program
************************************************************************************/
unsigned char data_write( unsigned char *write_data )
{
    unsigned char program_result = COMPLETE;
    int i;                              /*loop counter    */
   
    /*If use interrupt then clear i flag...   */
    /*asm("fclr   i   "); */

    /*flash control register set*/
    fmr0 = 0x01;
    asm(" ");       /*Description for preventing the abbreviation by optimization */
    fmr0 = 0x03;                        /*CPU rewrite enable*/
    fmr1 = 0x80;
    asm(" ");       /*Description for preventing the abbreviation by optimization */
    fmr1 = 0x82;                        /*EW1 mode    */
   
    for( i = 0; i < RECORD_SIZE; i++ )
    {
      write_addr = 0x40;
      write_addr = write_data;
      while( fmr00 != 1 );            /*Ready check */
      /*Program status check    */
      if( fmr06 == 1 )
      {
            /*Program error   */
            *write_addr = 0x50;         /*Clear stutus register   */
            program_result = PROGRAM_ERR;
            break;
      }
    }
   
    /*flash control register reset    */
    fmr0 = 0x01;                        /*CPU rewrite disable */
   
    /*If use interrupt then set i flag... */
    /*asm("fset   i   "); */

    return program_result;
}
页: [1]
查看完整版本: 闪存改写源代码