示例#1
0
文件: eeprom.c 项目: htol/ultramicron
//**************************************************************************
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;
  }
  
}
示例#2
0
/* 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);
		}
	}
}
示例#3
0
/* 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();
}
示例#5
0
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();
}
示例#7
0
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
0
/** 
 ===============================================================================
              ##### 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;
    }
  }
}