void Minimal_EEPROM_Unlock(void) { if((FLASH->PECR & FLASH_PECR_PELOCK) != RESET) { /* Unlocking the Data memory and FLASH_PECR register access*/ FLASH->PEKEYR = FLASH_PEKEY1; FLASH->PEKEYR = FLASH_PEKEY2; } } void Minimal_EEPROM_Lock(void) { /* Set the PELOCK Bit to lock the data memory and FLASH_PECR register access */ FLASH->PECR |= FLASH_PECR_PELOCK; } FLASH_Status Minimal_FLASH_GetStatus(void) { FLASH_Status FLASHstatus = FLASH_COMPLETE; if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY) { FLASHstatus = FLASH_BUSY; } else { if((FLASH->SR & (uint32_t)FLASH_FLAG_WRPERR)!= (uint32_t)0x00) { FLASHstatus = FLASH_ERROR_WRP; } else { if((FLASH->SR & (uint32_t)0x1E00) != (uint32_t)0x00) { FLASHstatus = FLASH_ERROR_PROGRAM; } else { FLASHstatus = FLASH_COMPLETE; } } } /* Return the FLASH Status */ return FLASHstatus; } FLASH_Status Minimal_FLASH_WaitForLastOperation(uint32_t Timeout) { __IO FLASH_Status status = FLASH_COMPLETE; /* Check for the FLASH Status */ status = Minimal_FLASH_GetStatus(); /* Wait for a FLASH operation to complete or a TIMEOUT to occur */ while((status == FLASH_BUSY) && (Timeout != 0x00)) { status = Minimal_FLASH_GetStatus(); Timeout--; } if(Timeout == 0x00 ) { status = FLASH_TIMEOUT; } /* Return the operation status */ return status; } void Minimal_EEPROM_ProgramWord(uint32_t Address, uint32_t Data) { // Wait for last operation to be completed FLASH_Status status = FLASH_COMPLETE; status = Minimal_FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); if(status == FLASH_COMPLETE) { *(__IO uint32_t *)Address = Data; // Wait for last operation to be completed status = Minimal_FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); } // Return the Write Status return status; }