#include "EEPROM.H" const APP_VER RUNAPPVer __at(RunAPPInfoAddr); const APP_VER NEWAPPVer __at(NewAPPInfoAddr); unsigned short PrintBuf[SECTOR_SIZE>>1]={0}; //写入EEPROM缓冲区 u16 EEHalfWord_Read(u32 EEAddr) { return *(vu16*)EEAddr; } void EESector_Erase(u32 EEAddr) { EEAddr=EEAddr/(SECTOR_SIZE)*(SECTOR_SIZE); FLASH_ErasePage(EEAddr); } void EEHalfWord_Write(u32 EEAddr,u16 EEData) { FLASH_ProgramHalfWord( EEAddr, EEData) ; } //pBuf 结构体首指针 //cLen 结构体长度 //iAddr 保存地址偏移,相对于保存扇区首地址的偏移 uint32_t EEWriteStruct(void* pBuf,uint32_t cLen,uint32_t iAddr) { uint32_t result = 0; u32 i,j,k,ProtectedPages; u32 Addr; u32 iLen = cLen>>1; //双字节个数 u32 cBufCnt ; if(cLen==0) return result; //开始保存的地址 Addr = iAddr/(SECTOR_SIZE)*(SECTOR_SIZE); //起始保存的扇区首地址 iAddr %= (SECTOR_SIZE); //相对扇区的偏移 cBufCnt = (cLen+iAddr)/(SECTOR_SIZE) //需要写几次? +(((cLen+iAddr)%(SECTOR_SIZE))>0?1:0); //不足一个算一个 //要写入几次? i = j = k = ProtectedPages = 0; if(0!=iAddr%2) //没有两字节对其,退出 return result; //全部锁定则退出编程 Flash_ProtectMode(&ProtectedPages ); // if(0==ProtectedPages) return result; for(j=0;j>1); for(i=0;i>1):0),k=0;i<(SECTOR_SIZE>>1);i++,k++) { PrintBuf[i] = *((vu16*)pBuf+k); // if(--iLen==0) { __nop(); break; } } //讲缓冲写入扇区 //擦除Flash区 FLASH_Unlock(); EESector_Erase(Addr+j*SECTOR_SIZE); //擦除扇区 //写入内容; for(i=0;i>1;i++) { EEHalfWord_Write(Addr+(SECTOR_SIZE)*j+(i<<1),PrintBuf[i]); } FLASH_Lock(); result = 0xFF; } return result; } void EEReadStruct(void* pBuf,uint32_t cLen,uint32_t Addr) { uint32_t i; uint16_t *pcBuf = (uint16_t *)pBuf; cLen>>=1; for(i=0;i