void FLASH_Update (FLADDR dest, char *src, unsigned int numbytes) { int numbytestmp=numbytes; // Pause_Measure(); do{ if(numbytestmp>FLASH_PAGESIZE)numbytes=FLASH_PAGESIZE; else numbytes=numbytestmp; // 1. Erase <numbytes> starting from <dest> FLASH_Clear (dest, numbytes); // 2. Write <numbytes> from <src> to <dest> FLASH_Write (dest, src, numbytes); numbytestmp=numbytestmp-FLASH_PAGESIZE; dest=dest+FLASH_PAGESIZE; src=src+FLASH_PAGESIZE; }while(numbytestmp>0); // Restart_Measure() ; }
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; } } }