搜索
bottom↓
回复: 8

求助R8C2L闪存如何改写

[复制链接]

出0入0汤圆

发表于 2011-4-12 17:56:08 | 显示全部楼层 |阅读模式
看数据手册和文档都没改写成功
有改写成功的朋友吗?

出0入0汤圆

 楼主| 发表于 2011-4-12 20:55:43 | 显示全部楼层
FMR01=0;
        FMR01=1;
        FMR11=0;
        FMR11=1;
        FMR02=0;
        FMR02=1;
        FRM15=1;
        FMR16=1;
启动CPU模式改写,EW1方式

出0入0汤圆

 楼主| 发表于 2011-4-13 09:46:14 | 显示全部楼层
/***********************************************************************/
/*                                                                     */
/*  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[RECORD_SIZE];   /*  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[0]=40;
    data[10]=50;
    data[12]=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[j] != 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   "); */

    return  erase_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;
}

出0入0汤圆

 楼主| 发表于 2011-4-13 09:47:00 | 显示全部楼层
这是我找到最好的
正在验证

出0入0汤圆

 楼主| 发表于 2011-4-13 11:37:54 | 显示全部楼层
上面的程序可以使用
有两次错误
我就不说了
有助于大家彻底掌握闪存改写

出0入0汤圆

发表于 2011-6-5 09:09:54 | 显示全部楼层
2L闪存

出0入0汤圆

发表于 2011-8-29 23:22:53 | 显示全部楼层
这程序是自动生成的吗,什么会有错的呢

出0入0汤圆

发表于 2011-9-1 22:38:39 | 显示全部楼层
R8C的FLASH操作例程在官网上有现成的

EW0模式
http://documentation.renesas.com/eng/products/mpumcu/apn/rej05b1103_r8cap.pdf

EW1模式
http://documentation.renesas.com/eng/products/region/rtcn/mpumcu/apn/rcj05b0038_r8c13ap.pdf
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-3 08:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表