[STM32F1] Simpler Flash EEPROM (#14829)
This commit is contained in:
committed by
Scott Lahteine
parent
0745d48993
commit
9c5086e6af
@ -42,7 +42,6 @@
|
||||
// Store settings in the last two pages
|
||||
// Flash pages must be erased before writing, so keep track.
|
||||
bool firstWrite = false;
|
||||
uint32_t pageBase = EEPROM_START_ADDRESS;
|
||||
|
||||
bool PersistentStore::access_start() {
|
||||
firstWrite = true;
|
||||
@ -67,42 +66,27 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
||||
firstWrite = false;
|
||||
}
|
||||
|
||||
// First write full words
|
||||
int i = 0;
|
||||
int wordsToWrite = size / sizeof(uint16_t);
|
||||
uint16_t* wordBuffer = (uint16_t *)value;
|
||||
while (wordsToWrite) {
|
||||
status = FLASH_ProgramHalfWord(pageBase + pos + (i * 2), wordBuffer[i]);
|
||||
if (status != FLASH_COMPLETE) return true;
|
||||
wordsToWrite--;
|
||||
i++;
|
||||
}
|
||||
|
||||
// Now, write any remaining single byte
|
||||
const uint16_t odd = size & 1;
|
||||
if (odd) {
|
||||
uint16_t temp = value[size - 1];
|
||||
status = FLASH_ProgramHalfWord(pageBase + pos + i, temp);
|
||||
if (status != FLASH_COMPLETE) return true;
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
if (FLASH_ProgramHalfWord(EEPROM_PAGE0_BASE + (pos + i) * 2, value[i]) != FLASH_COMPLETE)
|
||||
return true;
|
||||
}
|
||||
|
||||
crc16(crc, value, size);
|
||||
pos += size + odd;
|
||||
pos += size;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||
for (uint16_t i = 0; i < size; i++) {
|
||||
byte* accessPoint = (byte*)(pageBase + pos + i);
|
||||
uint8_t c = *accessPoint;
|
||||
if (writing) value[i] = c;
|
||||
crc16(crc, &c, 1);
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
uint8_t v = *(uint16_t *)(EEPROM_PAGE0_BASE + (pos + i) * 2);
|
||||
if (writing) value[i] = v;
|
||||
crc16(crc, &v, 1);
|
||||
}
|
||||
pos += ((size + 1) & ~1); // i.e., size+(size&1), round up odd values
|
||||
pos += size;
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t PersistentStore::capacity() { return E2END + 1; }
|
||||
size_t PersistentStore::capacity() { return size_t(E2END + 1); }
|
||||
|
||||
#endif // EEPROM_SETTINGS && EEPROM FLASH
|
||||
#endif // __STM32F1__
|
||||
|
Reference in New Issue
Block a user