//************************************************************************** void eeprom_erase(void) { DATA_EEPROM_Unlock(); // разблокировка перед записью /* Clear all pending flags */ FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_OPTVERRUSR); /* Data EEPROM Fast Word program of FAST_DATA_32 at addresses defined by DATA_EEPROM_START_ADDR and DATA_EEPROM_END_ADDR */ Address = DATA_EEPROM_START_ADDR; NbrOfPage = ((DATA_EEPROM_END_ADDR - Address) + 1 ) >> 2; /* Erase the Data EEPROM Memory pages by Word (32-bit) */ for(j = 0; j < NbrOfPage; j++) { FLASHStatus = DATA_EEPROM_EraseWord(Address + (4 * j)); } DATA_EEPROM_Lock(); /* Check the correctness of written data */ while(Address < DATA_EEPROM_END_ADDR) { if(*(__IO uint32_t*)Address != 0x0) { DataMemoryProgramStatus = FAILED; //ОШИБКА стирания !!!! return; } Address = Address + 4; } }
/* program half-word */ void DATA_EEPROM_FastProgramHalfWord(uint32_t addr, uint16_t data) { uint32_t tmp = 0, tmpaddr = 0; /* Wait for last operation to be completed */ while (FLASH->SR & FLASH_SR_BSY); /* Clear the FTDW bit */ FLASH->PECR &= (uint32_t)(~((uint32_t)FLASH_PECR_FTDW)); if (data != 0x0000) { /* If the previous operation is completed, proceed to write the new data */ *(volatile uint16_t *)addr = data; /* Wait for last operation to be completed */ while (FLASH->SR & FLASH_SR_BSY); } else { /* fits into word */ if ((addr & 0x3) != 0x3) { tmpaddr = addr & 0xFFFFFFFC; tmp = * (volatile uint32_t *) tmpaddr; tmpaddr = 0xFFFF << (0x8 * (addr & 0x3)); tmp &= ~tmpaddr; /* erase */ DATA_EEPROM_EraseWord(addr & 0xFFFFFFFC); /* reprogram */ DATA_EEPROM_FastProgramWord((addr & 0xFFFFFFFC), tmp); /* does not fit into one word */ } else { DATA_EEPROM_FastProgramByte(addr, data & 0xff); DATA_EEPROM_FastProgramByte(addr + 1, data >> 8); } } }
/* program byte */ void DATA_EEPROM_FastProgramByte(uint32_t addr, uint8_t data) { uint32_t tmp = 0, tmpaddr = 0; /* Wait for last operation to be completed */ while (FLASH->SR & FLASH_SR_BSY); /* Clear the FTDW bit */ FLASH->PECR &= (uint32_t)(~((uint32_t)FLASH_PECR_FTDW)); if (data != 0x00) { /* If the previous operation is completed, proceed to write the new * data */ *(volatile uint8_t *)addr = data; /* Wait for last operation to be completed */ while (FLASH->SR & FLASH_SR_BSY); } else { /* get word */ tmpaddr = addr & 0xFFFFFFFC; tmp = * (volatile uint32_t *) tmpaddr; tmpaddr = 0xFF << (8 * (addr & 0x3)); tmp &= ~tmpaddr; /* clear */ DATA_EEPROM_EraseWord(addr & 0xFFFFFFFC); /* re-program */ DATA_EEPROM_FastProgramWord((addr & 0xFFFFFFFC), tmp); } }
/** * @brief This function will erase the memory region. * @param uint32_t *NVMparam: The pointer to the memory region. * uint8_t Wordlength: The word length. * @retval None */ void WMBus_PhyEraseNVMParam(uint32_t *NVMparam, uint8_t Wordlength) { DATA_EEPROM_Unlock(); for(uint8_t temp=0x00; temp<Wordlength;temp++) DATA_EEPROM_EraseWord(((uint32_t)EEPROM_NVM_BASE)+temp); DATA_EEPROM_Lock(); }
void Internal_EE_Erase32(uint16_t position){ DATA_EEPROM_Unlock(); /* Clear all pending flags */ FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_OPTVERRUSR); DATA_EEPROM_EraseWord(INTERNAL_32BIT_START_ADDRESS+4*position); DATA_EEPROM_Lock(); }
/** * @brief This function will erase the memory region. * @param uint32_t Saddress: The strating address to perform action on. * uint8_t length: The data length to be deleted. * @retval None */ void WMBus_EraseMeterDatabaseFromEEPROM1(uint32_t Saddress, uint8_t Wordlength) { DATA_EEPROM_Unlock(); for(uint8_t temp=0x00; temp<Wordlength;temp++) { DATA_EEPROM_EraseWord(((uint32_t)Saddress)+(temp*4)); } DATA_EEPROM_Lock(); }
void Internal_EE_EraseM32(uint16_t start_position, uint16_t NbrOfPositions){ uint16_t i = 0; DATA_EEPROM_Unlock(); /* Clear all pending flags */ FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_OPTVERRUSR); for(i=0; i<NbrOfPositions; i++){ DATA_EEPROM_EraseWord(INTERNAL_32BIT_START_ADDRESS+start_position+i*4); } DATA_EEPROM_Lock(); }
/** =============================================================================== ##### 8 BITS ##### =============================================================================== */ void Internal_EE_EraseAll8(void){ uint16_t i = 0; uint16_t NbrOfPagesToErase = 0; NbrOfPagesToErase = ((INTERNAL_8BIT_END_ADDRESS - INTERNAL_8BIT_START_ADDRESS)+1)>>2; DATA_EEPROM_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_OPTVERRUSR); for(i = 0; i<NbrOfPagesToErase; i++){ DATA_EEPROM_EraseWord(INTERNAL_8BIT_START_ADDRESS+4*i); } DATA_EEPROM_Lock(); }
/** * @brief This function will erase the memory region. * @param uint32_t Saddress: The strating address to perform action on. * uint8_t length: The data length to be deleted. * @retval None */ void WMBus_EraseMeterDatabaseFromEEPROM(uint8_t *buff, uint32_t Saddress, uint8_t Wordlength) { for(uint8_t eeindex=0; eeindex<10; eeindex++) { switch(eeindex) { case 0: WMBus_PhyReadMeterDatabase(EEPROM_METER1_DATABASE_START,26, EEPROM_METER1_DATABASE_END); if(EEpromMtrData[0] == buff[0]) { Saddress = EEPROM_METER1_DATABASE_START; DATA_EEPROM_Unlock(); for(uint8_t temp=0x00; temp<Wordlength;temp++) { DATA_EEPROM_EraseWord(((uint32_t)Saddress)+(temp*4)); } DATA_EEPROM_Lock(); return; } break; case 1: WMBus_PhyReadMeterDatabase(EEPROM_METER2_DATABASE_START, 26, EEPROM_METER2_DATABASE_END); if(EEpromMtrData[0] == buff[0]) { Saddress = EEPROM_METER2_DATABASE_START; DATA_EEPROM_Unlock(); for(uint8_t temp=0x00; temp<Wordlength;temp++) { DATA_EEPROM_EraseWord(((uint32_t)Saddress)+(temp*4)); } DATA_EEPROM_Lock(); return; } break; case 2: WMBus_PhyReadMeterDatabase(EEPROM_METER3_DATABASE_START, 26, EEPROM_METER3_DATABASE_END); if(EEpromMtrData[0] == buff[0]) { Saddress = EEPROM_METER3_DATABASE_START; DATA_EEPROM_Unlock(); for(uint8_t temp=0x00; temp<Wordlength;temp++) { DATA_EEPROM_EraseWord(((uint32_t)Saddress)+(temp*4)); } DATA_EEPROM_Lock(); return; } break; case 3: WMBus_PhyReadMeterDatabase(EEPROM_METER4_DATABASE_START, 26, EEPROM_METER4_DATABASE_END); if(EEpromMtrData[0] == buff[0]) { Saddress = EEPROM_METER4_DATABASE_START; DATA_EEPROM_Unlock(); for(uint8_t temp=0x00; temp<Wordlength;temp++) { DATA_EEPROM_EraseWord(((uint32_t)Saddress)+(temp*4)); } DATA_EEPROM_Lock(); return; } break; case 4: WMBus_PhyReadMeterDatabase(EEPROM_METER5_DATABASE_START, 26, EEPROM_METER5_DATABASE_END); if(EEpromMtrData[0] == buff[0]) { Saddress = EEPROM_METER5_DATABASE_START; DATA_EEPROM_Unlock(); for(uint8_t temp=0x00; temp<Wordlength;temp++) { DATA_EEPROM_EraseWord(((uint32_t)Saddress)+(temp*4)); } DATA_EEPROM_Lock(); return; } break; case 5: WMBus_PhyReadMeterDatabase(EEPROM_METER6_DATABASE_START, 26, EEPROM_METER6_DATABASE_END); if(EEpromMtrData[0] == buff[0]) { Saddress = EEPROM_METER6_DATABASE_START; DATA_EEPROM_Unlock(); for(uint8_t temp=0x00; temp<Wordlength;temp++) { DATA_EEPROM_EraseWord(((uint32_t)Saddress)+(temp*4)); } DATA_EEPROM_Lock(); return; } break; case 6: WMBus_PhyReadMeterDatabase(EEPROM_METER7_DATABASE_START, 26, EEPROM_METER7_DATABASE_END); if(EEpromMtrData[0] == buff[0]) { Saddress = EEPROM_METER7_DATABASE_START; DATA_EEPROM_Unlock(); for(uint8_t temp=0x00; temp<Wordlength;temp++) { DATA_EEPROM_EraseWord(((uint32_t)Saddress)+(temp*4)); } DATA_EEPROM_Lock(); return; } break; case 7: WMBus_PhyReadMeterDatabase(EEPROM_METER8_DATABASE_START, 26, EEPROM_METER8_DATABASE_END); if(EEpromMtrData[0] == buff[0]) { Saddress = EEPROM_METER8_DATABASE_START; DATA_EEPROM_Unlock(); for(uint8_t temp=0x00; temp<Wordlength;temp++) { DATA_EEPROM_EraseWord(((uint32_t)Saddress)+(temp*4)); } DATA_EEPROM_Lock(); return; } break; case 8: WMBus_PhyReadMeterDatabase(EEPROM_METER9_DATABASE_START, 26, EEPROM_METER9_DATABASE_END); if(EEpromMtrData[0] == buff[0]) { Saddress = EEPROM_METER9_DATABASE_START; DATA_EEPROM_Unlock(); for(uint8_t temp=0x00; temp<Wordlength;temp++) { DATA_EEPROM_EraseWord(((uint32_t)Saddress)+(temp*4)); } DATA_EEPROM_Lock(); return; } break; case 9: WMBus_PhyReadMeterDatabase(EEPROM_METER_10_DATABASE_START, 26, EEPROM_METER_10_DATABASE_END); if(EEpromMtrData[0] == buff[0]) { Saddress = EEPROM_METER_10_DATABASE_START; DATA_EEPROM_Unlock(); for(uint8_t temp=0x00; temp<Wordlength;temp++) { DATA_EEPROM_EraseWord(((uint32_t)Saddress)+(temp*4)); } DATA_EEPROM_Lock(); return; } break; default: break; } } }