int iap_entry (unsigned char *data,unsigned int length) { unsigned char ucErr; unsigned int i; unsigned char ramData[256]; // 定义变量区 if(length > 256) length = 256; for(i = 0;i < length;i ++) { ramData[i] = data[i]; } IAP_Entry = (void(*)())IAP_ENTER_ADR; /* 初始化函数指针IAP_Entry */ // __disable_irq(); /* 在IAP操作前必须关闭所有中断 */ parIdRead(); /* 读器件ID */ codeIdBoot(); /* 读Boot版本号 */ sectorPrepare(IAP_SECTOR_NUMBER,IAP_SECTOR_NUMBER); /* 准备扇区1 */ sectorErase(IAP_SECTOR_NUMBER,IAP_SECTOR_NUMBER); /* 擦除扇区1 */ blankChk(IAP_SECTOR_NUMBER,IAP_SECTOR_NUMBER) ; /* 查空扇区1 */ sectorPrepare(IAP_SECTOR_NUMBER,IAP_SECTOR_NUMBER); /* 选择扇区1 */ ramCopy(IAP_ADDRESS, (unsigned int)ramData, 256); /* 写数据到扇区1 */ ucErr = dataCompare(IAP_ADDRESS, (unsigned int)ramData, 256); /* 比较数据 */ // __enable_irq(); if (ucErr == CMD_SUCCESS) { /* 成功 */ } // while (1); }
/*! \fn flashEraseSectorXTest(uint8_t* bufferIn, uint8_t* bufferOut, uint16_t bufferSize) * \brief A Testing wrapper that tests erasing SECTOR_START through SECTOR_END * \param bufferIn One of the two testing buffers -> Should be size of BYTES_PER_PAGE * \param bufferOut One of the two testing buffers -> Should be size of BYTES_PER_PAGE * \param bufferSize Should always be BYTES_PER_PAGE * \return Test Status */ RET_TYPE flashEraseSectorXTest(uint8_t* bufferIn, uint8_t* bufferOut, uint16_t bufferSize) { uint16_t i = 0; uint16_t j = 0; uint16_t k = 0; uint16_t sectorPageOffset = 0; // for each sector for(i = SECTOR_START; i <= SECTOR_END; i++) { // calculate sector page offset sectorPageOffset = PAGE_PER_SECTOR * i; // for each page in sector (populate sector) for(j = 0; j < PAGE_PER_SECTOR; j++) { // write random data initBuffer(bufferIn, bufferSize, FLASH_TEST_INIT_BUFFER_POLICY_RND); memcpy(bufferOut, bufferIn, bufferSize); writeDataToFlash(sectorPageOffset + j, 0, bufferSize, bufferIn); // re-init bufferIn with 0's initBuffer(bufferIn, bufferSize, FLASH_TEST_INIT_BUFFER_POLICY_ZERO); // read data readDataFromFlash(sectorPageOffset + j, 0, bufferSize, bufferIn); // check buffer contents (verify population) for(k = 0; k < bufferSize; k++) { // compare buffers (should match) if(bufferIn[k] != bufferOut[k]) { return RETURN_NO_MATCH; } } // end for each byte in page } // end for each page in sector // issue sector erase sectorErase(i); // init compare buffer (1's) initBuffer(bufferOut, bufferSize, FLASH_TEST_INIT_BUFFER_POLICY_ONE); // for each page in sector (check for erased data) for(j = 0; j < PAGE_PER_SECTOR; j++) { // read flash to bufferIn readDataFromFlash(sectorPageOffset + j, 0, bufferSize, bufferIn); // check buffer contents for(k = 0; k < bufferSize; k++) { // compare -> bufferIn == bufferOut if(bufferIn[k] != bufferOut[k]) { return RETURN_NO_MATCH; } } // end for each byte in page } // end for each page in sector } // end for each sector return RETURN_OK; } // End flashEraseSectorXTest