int HAL_FLASH_Update(const uint8_t *pBuffer, uint32_t address, uint32_t bufferSize, void* reserved) { return FLASH_Update(pBuffer, address, bufferSize); }
void main (void) { unsigned char temp_byte = 0x00; FLADDR start_address = 0x5FFE; char test_write_buff[8] = "ABCDEFG"; char test_write_buff2[3] = "HIJ"; char test_read_buff[8] = {0}; char test_compare_buff[8] = "ABCDEFG"; unsigned char i; bit error_flag = 0; PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer // enable) if ((RSTSRC & 0x02) != 0x02) { if ((RSTSRC & 0x40) == 0x40) { LED = 0; while(1); // Last reset was caused by a Flash // Error Device Reset // LED is off and loop forever to // indicate error } } Oscillator_Init(); // Initialize the internal oscillator // to 24.5 MHz VDDMon_Init(); Port_Init(); LED = 1; SFRPAGE = LEGACY_PAGE; // Initially erase the test page of Flash FLASH_PageErase(start_address); //BEGIN TEST================================================================ // Check if able to Write and Read the Flash-------------------------------- FLASH_ByteWrite(start_address, 0xA5); temp_byte = FLASH_ByteRead(start_address); if (temp_byte != 0xA5) { error_flag = 1; } //-------------------------------------------------------------------------- // Check if able to Erase a page of the Flash------------------------------- FLASH_PageErase(start_address); temp_byte = FLASH_ByteRead(start_address); if (temp_byte != 0xFF) { error_flag = 1; } //-------------------------------------------------------------------------- // Check if able to write and read a series of bytes------------------------ FLASH_Write(start_address, test_write_buff, sizeof(test_write_buff)); FLASH_Read(test_read_buff, start_address, sizeof(test_write_buff)); for (i = 0; i < sizeof(test_write_buff); i++) { if (test_read_buff[i] != test_write_buff[i]) { error_flag = 1; } } //-------------------------------------------------------------------------- // Check if able to Erase a few bytes--------------------------------------- FLASH_Clear(start_address, 2); FLASH_Read(test_read_buff, start_address, sizeof(test_write_buff)); // Simulate the same changes to a data array for comparison test_compare_buff[0] = 0xFF; test_compare_buff[1] = 0xFF; for (i = 0; i < sizeof(test_compare_buff); i++) { if (test_read_buff[i] != test_compare_buff[i]) { error_flag = 1; } } //-------------------------------------------------------------------------- // Check if able to "update" (erase then re-write) a few bytes-------------- FLASH_Update (start_address, test_write_buff2, 3); FLASH_Read(test_read_buff, start_address, sizeof(test_write_buff)); // Simulate the same changes to a data array for comparison test_compare_buff[0] = test_write_buff2[0]; test_compare_buff[1] = test_write_buff2[1]; test_compare_buff[2] = test_write_buff2[2]; for (i = 0; i < sizeof(test_compare_buff); i++) { if (test_read_buff[i] != test_compare_buff[i]) { error_flag = 1; } } //-------------------------------------------------------------------------- // Check if able to copy data in the Flash---------------------------------- FLASH_Copy (start_address+sizeof(test_write_buff), start_address, sizeof(test_write_buff)); FLASH_Read(test_read_buff, start_address+sizeof(test_write_buff), sizeof(test_read_buff)); for (i = 0; i < sizeof(test_write_buff); i++) { if (test_read_buff[i] != test_compare_buff[i]) { error_flag = 1; } } //-------------------------------------------------------------------------- // FLASH test routines------------------------------------------------------ FLASH_Fill (start_address+sizeof(test_write_buff)*2, sizeof(test_write_buff), 0x5A); FLASH_Read(test_read_buff, start_address+sizeof(test_write_buff)*2, sizeof(test_write_buff)); for (i = 0; i < sizeof(test_write_buff); i++) { if (test_read_buff[i] != 0x5A) { error_flag = 1; } } //-------------------------------------------------------------------------- //END OF TEST=============================================================== while (1) // Loop forever { // Blink LED to indicate success if (error_flag == 0) { LED = ~LED; Timer0_Delay_ms (100); } else { LED = 0; } } }
//////////////////////////////////////////////////////////////////////////// /////////////// // 函数名: // 编写者: // 参考资料: // 功 能: // 输入参数: // 输出参数: // 备 注: //////////////////////////////////////////////////////////////////////////// /////////////// void Init_EPROM() { BYTE buf,retrycount=3; _SYSINFO tmpsysinfo;//={0,0}; WORD sum; BOOL eepok; extern BYTE Jdispidx; DelayXms(300); Jiulist.idx=0-1; for(buf=0;buf<MAX_JIULST;buf++ )Jiulist.Jvol[buf]=0xffff; return; #ifndef NVRAM_USE_EEP24CXX do { FLASH_Read(&buf,(FLADDR)EEPROM_ID,1); FLASH_Read((BYTE*)&tmpsysinfo,(FLADDR)(EEP_SYS_TBLSTART),EEP_SYS_LENTH) ; sum= CalChkSum((BYTE*)&tmpsysinfo, EEP_SYS_LENTH); if((buf==BOARD_ID_VER)&&(sum==tmpsysinfo.chksum)){eepok=1;break;} DelayXms(300); }while(retrycount--) ; if(eepok) #endif { //read from flash FLASH_Read((BYTE*)&SysInfo,(FLADDR)(EEP_SYS_TBLSTART),EEP_SYS_LENTH) ; FLASH_Read((BYTE*)&Jiulist,(FLADDR)(EEP_JIULST_TBLSTART),EEP_JIULST_LENTH) ; } #ifndef NVRAM_USE_EEP24CXX else { DisplayCont=DISPLAY_ERR0;Display_All(); //显示初始错误 //初始数据 SysInfo.TRANCODE=0x5555; SysInfo.ADJUST=0; SysInfo.VA=(WORD)((DWORD)DEFAULT_NOCOAL_VA*1024/STANDARD_REF_VOLT); //校准 SysInfo.VB=(WORD)((DWORD )DEFAULT_NOCOAL_VB*1024/STANDARD_REF_VOLT); //校准 SysInfo.VC=(WORD)((DWORD)DEFALT_130PPM_VC*1024/STANDARD_REF_VOLT); //130PPM SysInfo.chksum=CalChkSum((BYTE*)&SysInfo, EEP_SYS_LENTH); FLASH_Update((FLADDR)EEP_SYS_TBLSTART,(BYTE*)&SysInfo,EEP_SYS_LENTH); DPRINTF(printf("-----InitEPROM-----...\r\n")) ; FLASH_Update((FLADDR)EEP_JIULST_TBLSTART,(BYTE*)&Jiulist,EEP_JIULST_LENTH); buf= BOARD_ID_VER; FLASH_Update((FLADDR)EEPROM_ID,(BYTE *)&buf,1) ; } #endif //初始化变量 { if(Jiulist.idx>=MAX_JIULST)Jiulist.idx=0-1; Jdispidx=Jiulist.idx; } }