# HG changeset patch # User Ethan Zonca # Date 2014-09-25 21:17:44 # Node ID e1ff9c2d3789ce6d48bc1d0698cb9ac5f8084207 # Parent 51243b5920db01d1e39b0825d964c72cce8b80bb Initial attempt of minimal eeprom lib, doesn't seem to save properly. diff --git a/main.c b/main.c --- a/main.c +++ b/main.c @@ -328,70 +328,142 @@ uint16_t k_d = 1;*/ #define EEPROM_BASE_ADDR 0x08080000 #define EEPROM_BYTE_SIZE 0x0FFF -/* -uint32_t EEPROM_ReadWord(uint16_t Addr) -{ - uint32 *wAddr; - wAddr=(uint32 *)(EEPROM_BASE_ADDR+Addr); + +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; - uint32 res; - res = *wAddr++; + 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(); - while(Length--){ - *Buffer++=*wAddr++; - } -} -*/ + /* 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; +} void save_settings() { - DATA_EEPROM_Unlock(); + Minimal_EEPROM_Unlock(); // Try programming a word at an address divisible by 4 - DATA_EEPROM_ProgramWord(EEPROM_BASE_ADDR + EEPROM_ADDR_BOOTTOBREW, boottobrew); - DATA_EEPROM_ProgramWord(EEPROM_BASE_ADDR + EEPROM_ADDR_WINDUP_GUARD, windup_guard); - DATA_EEPROM_ProgramWord(EEPROM_BASE_ADDR + EEPROM_ADDR_K_P, k_p); - DATA_EEPROM_ProgramWord(EEPROM_BASE_ADDR + EEPROM_ADDR_K_I, k_i); - DATA_EEPROM_ProgramWord(EEPROM_BASE_ADDR + EEPROM_ADDR_K_D, k_d); - DATA_EEPROM_Lock(); - + Minimal_EEPROM_ProgramWord(EEPROM_BASE_ADDR + EEPROM_ADDR_BOOTTOBREW, boottobrew); + Minimal_EEPROM_ProgramWord(EEPROM_BASE_ADDR + EEPROM_ADDR_WINDUP_GUARD, windup_guard); + Minimal_EEPROM_ProgramWord(EEPROM_BASE_ADDR + EEPROM_ADDR_K_P, k_p); + Minimal_EEPROM_ProgramWord(EEPROM_BASE_ADDR + EEPROM_ADDR_K_I, k_i); + Minimal_EEPROM_ProgramWord(EEPROM_BASE_ADDR + EEPROM_ADDR_K_D, k_d); + Minimal_EEPROM_Lock(); } + void save_setpoints() { - DATA_EEPROM_Unlock(); - DATA_EEPROM_ProgramWord(EEPROM_BASE_ADDR + EEPROM_ADDR_BREWTEMP, setpoint_brew); - DATA_EEPROM_ProgramWord(EEPROM_BASE_ADDR + EEPROM_ADDR_STEAMTEMP, setpoint_steam); - DATA_EEPROM_Lock(); + + Minimal_EEPROM_Unlock(); + Minimal_EEPROM_ProgramWord(EEPROM_BASE_ADDR + EEPROM_ADDR_BREWTEMP, setpoint_brew); + Minimal_EEPROM_ProgramWord(EEPROM_BASE_ADDR + EEPROM_ADDR_STEAMTEMP, setpoint_steam); + Minimal_EEPROM_Lock(); + } // TODO: Save/restore temperature setpoint settings void restore_settings() { - - DATA_EEPROM_Unlock(); - while(FLASH_GetStatus()==FLASH_BUSY); + Minimal_EEPROM_Unlock(); + while(Minimal_FLASH_GetStatus()==FLASH_BUSY); boottobrew = (*(__IO uint32_t*)EEPROM_BASE_ADDR + EEPROM_ADDR_BOOTTOBREW); - while(FLASH_GetStatus()==FLASH_BUSY); + while(Minimal_FLASH_GetStatus()==FLASH_BUSY); windup_guard = (*(__IO uint32_t*)EEPROM_BASE_ADDR + EEPROM_ADDR_WINDUP_GUARD); - while(FLASH_GetStatus()==FLASH_BUSY); + while(Minimal_FLASH_GetStatus()==FLASH_BUSY); k_p = (*(__IO uint32_t*)EEPROM_BASE_ADDR + EEPROM_ADDR_K_P); - while(FLASH_GetStatus()==FLASH_BUSY); + while(Minimal_FLASH_GetStatus()==FLASH_BUSY); k_i = (*(__IO uint32_t*)EEPROM_BASE_ADDR + EEPROM_ADDR_K_I); - while(FLASH_GetStatus()==FLASH_BUSY); + while(Minimal_FLASH_GetStatus()==FLASH_BUSY); k_d = (*(__IO uint32_t*)EEPROM_BASE_ADDR + EEPROM_ADDR_K_D); - while(FLASH_GetStatus()==FLASH_BUSY); + while(Minimal_FLASH_GetStatus()==FLASH_BUSY); setpoint_brew = (*(__IO uint32_t*)EEPROM_BASE_ADDR + EEPROM_ADDR_BREWTEMP); - while(FLASH_GetStatus()==FLASH_BUSY); + while(Minimal_FLASH_GetStatus()==FLASH_BUSY); setpoint_steam = (*(__IO uint32_t*)EEPROM_BASE_ADDR + EEPROM_ADDR_STEAMTEMP); - DATA_EEPROM_Lock(); - + Minimal_EEPROM_Lock(); }