⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 code_upgrade.c

📁 shengji chengxu daoshi hezai xiaznai
💻 C
字号:
#include "uart.h"
#include "hal.h"
#include  "code_upgrade.h"

/* write flash word
*/
void flash_write_byte(unsigned char *flash_ptr, unsigned char byte)  
{
    _clr_wdt();
        
    FCTL3 = FWKEY; //Clear LOCK
    FCTL1 = FWKEY+WRT; //Enable write
    *flash_ptr = byte;  //write dataword into Flash
    FCTL1 = FWKEY;     //Clear WRT
    FCTL3 = FWKEY+LOCK;  //Set LOCK 
}


/* erase flash sector
*/
void flash_erase(unsigned char *flash_ptr)  
{
    _clr_wdt();
        
    FCTL3 = FWKEY; //Clear LOCK
    FCTL1 = FWKEY+ERASE; //Enable erase  
    *flash_ptr = 0;   //erase Flash segment
    FCTL3 = FWKEY+LOCK;  //Set LOCK 
}

/* currently, information FLASH only 
*/
int flash_block_write(unsigned char* flash_ptr, unsigned char* Sram_ptr, int len)  
{
    int k;
    int rc = 0;
        
    for(k=0; k<len; k++)
    {
        flash_write_byte(flash_ptr+k, Sram_ptr[k]);

        if(flash_ptr[k] != Sram_ptr[k]) 
        {
            rc = -1;
            break;
        }
    }  
    return rc;

}

void erase_all_user_code(void)
{
    unsigned char ii;

    for(ii=0;ii<SEG_CNT;ii++)
    {  
        flash_erase((unsigned char *)(USER_CODE_STA+ii*0x200));
    }
}

unsigned char do_upgrade(unsigned char*data)  
{
    unsigned char ii;
    unsigned short offset=USER_CODE_STA+*(unsigned short *)&data[XM_FLASH_PTR];
    
    /* set the clock of the flash controler as SMCLK/3. for the require of the flash controler, 
     the clock must be 257kHz~476kHz. now is about SMCK/3=(4*1048576)/(4*3)=349.5kHz*/ 
    FCTL2 = FWKEY+FSSEL1+FN3+FN1+FN0;
    if( ECC_CorrectData((unsigned short *)offset,&data[XM_DAT])==ERROR)
    {
        return ERROR;
    }
   
    if(flash_block_write((unsigned char*)offset,&data[XM_DAT], 128))
    {
        return ERROR;
    }
    // varify
    for(ii=0;ii<128;ii++)
    {
        if(data[XM_DAT+ii]!=*(unsigned char *)(offset+ii))
        {
            return ERROR;
        }
    }
    *(unsigned short *)&data[XM_FLASH_PTR]+=128;
    return OK;
}

unsigned char  CountNumberOfOnes(unsigned char num)
{
    unsigned char count = 0;
    while(num)
    {
        num=num&(num-1);
        count++;
    }
    return count;
}

 int ECC_CorrectData(  unsigned short* ExistingECC, unsigned short* NewECC)
{
    unsigned char i, numOnes;
    unsigned int  xorECC[ECC_BUFF_LEN];
    if( (ExistingECC == NULL) || (NewECC == NULL))
    {
        return ERROR;
    }
    for(i=0; i<ECC_BUFF_LEN; i++)
    {
        xorECC[i] = ExistingECC[i] ^ NewECC[i];
    }
    numOnes = 0;
    for(i=0; i<ECC_BUFF_LEN; i++)		
    {
        numOnes += CountNumberOfOnes(xorECC[i]);
    }
    switch(numOnes)
    {
        case NO_DATA_ERROR:				
        return OK;

        case ECC_ERROR:						
        return ERROR;

        case CORRECTABLE_ERROR:
        break;

        default:						
        return ERROR;
    }
		
    return OK;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -