yewuyi 发表于 2013-10-9 15:53 
使用带内部EEPROM或者支持FLASH自擦写的MCU。
做一个标志,运行3次后就将该标志置位并写入EEPROM或者FLASH ...
那这段代码是什么意思 能给我详细说明下吗?谢谢
struct pin_str {
char pinbuf[7];
unsigned char nstart;
unsigned char set_pin;
unsigned int pincrc;
};
unsigned int crc_cal(unsigned char *databuf, unsigned char lenth)//???
{
int i;
unsigned int crc_value = 0xffffu;
while (lenth--) {
crc_value ^= *databuf++;
for(i=0; i<8; i++)
{
if(crc_value & 0x0001u)
crc_value = (crc_value>>1)^0xa001;
else
crc_value = crc_value >> 1;
}
}
return(crc_value);
}
unsigned char wt_eedata(unsigned int addr, unsigned char *pbuf, unsigned char len)
{
unsigned char i;
unsigned int tmpaddr;
ClrWdt();
tmpaddr = addr;
for(i=0;i<len;i++)
{
if(!WTE2ROM(tmpaddr, *pbuf))
return(ERR);
pbuf += 1;
tmpaddr += 1;
}
return(OK);
}
void rd_eedata(unsigned int addr, unsigned char *pbuf, unsigned char len)
{
unsigned char i;
unsigned int tmpaddr;
ClrWdt();
tmpaddr = addr;
for(i=0;i<len;i++)
{
*pbuf++ = RDE2ROM(tmpaddr);
tmpaddr += 1;
}
}
#if PIN_SET
void save_pin(void)
{
pin_str.pincrc = crc_cal((unsigned char *)&pin_str, sizeof(pin_str)-2);//??
wt_eedata(EE_ADDR_PIN, (unsigned char *)&pin_str, sizeof(pin_str));
}
void ini_pin(void)
{
pin_str.set_pin = NO_PIN;
pin_str.nstart = 1;
memcpypgm2ram((void *)pin_str.pinbuf, (rom void*)def_pin,PIN_NBITS);
save_pin();
}
void rd_pin(void)
{
rd_eedata(EE_ADDR_PIN, (unsigned char *)&pin_str, sizeof(pin_str));
if(crc_cal((unsigned char *)&pin_str, sizeof(pin_str)-2) != pin_str.pincrc)
{
ini_pin();
}
}
#endif
|