友情提示:这是My_ovo个人工作学习心得资源,如转载或下载请注明出处
2011 10

闪存改写源代码 [单片机]

post by My_ovo / 2011-11-10 9:37 Thursday0 Comments »
/***********************************************************************/ 
/*                                                                     */ 
/*  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) 浏览(9)

2011 9

看门狗定时器 [ARM]

post by My_ovo / 2011-11-9 16:13 Wednesday0 Comments »
被这个东东搞了2个礼拜才搞对头!!!
看门狗用来在控制器遇到故障出错后重启控制器操作,S3C2440A的看门狗定时器能作为16位定时器请求中断服务,看门狗定时器定时益处时产生128PCLK周期的复位信号。
看门狗定时器的运行
看门狗定时器只用PCLK作为它的时钟源,PCLK作为产生相应看门狗定时器时钟的参考时钟,最终这个频率还要被分频。

预扫描(prescaler)器值和分频系数在看门狗定时器控制寄存器(WTCON)中设定。有效的预扫描值为0到28-1,有效的分频系数为16,32.64,128
用下式计算看门狗定时器的时钟频率和每个定时器时钟周期的持续时间:

WTDAT,WTCNT
一旦看门狗定时器使能,看门狗定时器数据寄存器(WTDAT)的值不能被自动重装入定时器计数器(WTCNT)。因此在看门狗定时器开始前要把初始值写入看门狗定时器计数器寄存器(WTCNT)。
若S3C2440A用Embedded ICE调试,则看门狗定时器必须停止。看门狗定时器能自动监测CPU当前是否处于调试模式。
看门狗定时器特殊寄存器
看门狗定时器控制寄存器WTCON
若用户想用看门狗定时器作为普通定时器,则允许中断而禁止看门狗定时器



WTCON[15: 8]    Prescaler value    Prescaler值,范围在0~255      初始值:0x80
WTCON[7: 6]     保留            必须为00                    初始值:00
WTCON[5]       Watchdog timer   允许或禁止看门狗            初始值:1
                      0:禁止
                      1:允许
WTCON[4: 3]     Clock select      时钟分频系数                初始值:00
                      00:16
                      01:32
                      10:64
                      11:128
WTCON[2]       Inerrupt generation 允许或禁止中断              初始值:0
                      0:禁止
                      1:允许
WTCON[1]       保留            必须为0                     初始值:0
WTCON[0]       Reset enable/disable 看门狗输出复位信号控制位   初始值:1
           1:看门狗计时溢出时产生复位信号
                      0:禁止看门狗复位功能
看门狗定时器数据寄存器WTDAT
用于指定定时时间。WTDAT的值在初始华看门狗定时器操作时不能自动重装。但用0x8000(初始值)将引起第一次溢出,WTDAT的值将自动重装入WTCNT

    看门狗定时器计数器寄存器WTCNT
    在正常运行时WTCNT中为看门狗定时器当前计数器的值。注意因为在看门狗定时器初始化启动后WTDAT的值并不能自动重装入WTCNT,所以WTCNT在使能前必须设置一个初始值。

评论(0) 引用(0) 浏览(10)

1 2