📄 code_upgrade.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 + -