74
74
#define EEPROM_SLOTS ((FLASH_UNIT_SIZE) / (MARLIN_EEPROM_SIZE))
75
75
#define SLOT_ADDRESS (slot ) (FLASH_ADDRESS_START + (slot * (MARLIN_EEPROM_SIZE)))
76
76
77
- #define UNLOCK_FLASH () if (!flash_unlocked) { \
78
- HAL_FLASH_Unlock (); \
79
- __HAL_FLASH_CLEAR_FLAG (FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | \
80
- FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); \
81
- flash_unlocked = true ; \
82
- }
83
- #define LOCK_FLASH () if (flash_unlocked) { HAL_FLASH_Lock (); flash_unlocked = false ; }
77
+ #ifdef STM32H7xx
78
+ # define FLASHWORD_SIZE 32U // STM32H7xx a FLASHWORD is 32 bytes (256 bits)
79
+ # define FLASH_FLAGS_TO_CLEAR (FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGSERR)
80
+ # else
81
+ # define FLASHWORD_SIZE 4U // STM32F4xx a FLASHWORD is 4 bytes sizeof(uint32_t)
82
+ # define FLASH_FLAGS_TO_CLEAR (FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)
83
+ #endif
84
84
85
85
#define EMPTY_UINT32 ((uint32_t )-1 )
86
86
#define EMPTY_UINT8 ((uint8_t )-1 )
87
87
88
88
static uint8_t ram_eeprom[MARLIN_EEPROM_SIZE] __attribute__((aligned(4 ))) = {0 };
89
89
static int current_slot = -1 ;
90
90
91
- static_assert (0 == MARLIN_EEPROM_SIZE % 4 , " MARLIN_EEPROM_SIZE must be a multiple of 4 " ); // Ensure copying as uint32_t is safe
91
+ static_assert (0 == MARLIN_EEPROM_SIZE % FLASHWORD_SIZE , " MARLIN_EEPROM_SIZE must be a multiple of the FLASHWORD size " ); // Ensure copying as uint32_t is safe
92
92
static_assert (0 == FLASH_UNIT_SIZE % MARLIN_EEPROM_SIZE, " MARLIN_EEPROM_SIZE must divide evenly into your FLASH_UNIT_SIZE" );
93
93
static_assert (FLASH_UNIT_SIZE >= MARLIN_EEPROM_SIZE, " FLASH_UNIT_SIZE must be greater than or equal to your MARLIN_EEPROM_SIZE" );
94
94
static_assert (IS_FLASH_SECTOR(FLASH_SECTOR), "FLASH_SECTOR is invalid");
@@ -147,11 +147,15 @@ bool PersistentStore::access_start() {
147
147
bool PersistentStore::access_finish () {
148
148
149
149
if (eeprom_data_written) {
150
+
150
151
#ifdef STM32F4xx
151
152
// MCU may come up with flash error bits which prevent some flash operations.
152
153
// Clear flags prior to flash operations to prevent errors.
153
154
__HAL_FLASH_CLEAR_FLAG (FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
154
155
#endif
156
+ #ifdef STM32H7xx
157
+ __HAL_FLASH_CLEAR_FLAG (FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGSERR);
158
+ #endif
155
159
156
160
#if ENABLED(FLASH_EEPROM_LEVELING)
157
161
@@ -170,7 +174,12 @@ bool PersistentStore::access_finish() {
170
174
EraseInitStruct.NbSectors = 1 ;
171
175
172
176
current_slot = EEPROM_SLOTS - 1 ;
173
- UNLOCK_FLASH ();
177
+
178
+ if (!flash_unlocked) {
179
+ HAL_FLASH_Unlock ();
180
+ __HAL_FLASH_CLEAR_FLAG (FLASH_FLAGS_TO_CLEAR);
181
+ flash_unlocked = true ;
182
+ }
174
183
175
184
TERN_ (HAS_PAUSE_SERVO_OUTPUT, PAUSE_SERVO_OUTPUT ());
176
185
hal.isr_off ();
@@ -181,26 +190,37 @@ bool PersistentStore::access_finish() {
181
190
DEBUG_ECHOLNPGM (" HAL_FLASHEx_Erase=" , status);
182
191
DEBUG_ECHOLNPGM (" GetError=" , HAL_FLASH_GetError ());
183
192
DEBUG_ECHOLNPGM (" SectorError=" , SectorError);
184
- LOCK_FLASH ();
193
+ if (flash_unlocked) {
194
+ HAL_FLASH_Lock ();
195
+ flash_unlocked = false ;
196
+ }
185
197
return false ;
186
198
}
187
199
}
188
200
189
- UNLOCK_FLASH ();
201
+ if (!flash_unlocked) {
202
+ HAL_FLASH_Unlock ();
203
+ __HAL_FLASH_CLEAR_FLAG (FLASH_FLAGS_TO_CLEAR);
204
+ flash_unlocked = true ;
205
+ }
190
206
191
207
uint32_t offset = 0 ,
192
208
address = SLOT_ADDRESS (current_slot),
193
- address_end = address + MARLIN_EEPROM_SIZE,
194
- data = 0 ;
209
+ address_end = address + MARLIN_EEPROM_SIZE;
195
210
196
211
bool success = true ;
197
212
198
213
while (address < address_end) {
199
- memcpy (&data, ram_eeprom + offset, sizeof (data));
200
- status = HAL_FLASH_Program (FLASH_TYPEPROGRAM_WORD, address, data);
214
+ #ifdef STM32H7xx
215
+ status = HAL_FLASH_Program (FLASH_TYPEPROGRAM_FLASHWORD, address, uint32_t (ram_eeprom + offset));
216
+ #else
217
+ // memcpy(&data, ram_eeprom + offset, sizeof(data)); // IRON, IMPROVED
218
+ // status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data);
219
+ status = HAL_FLASH_Program (FLASH_TYPEPROGRAM_WORD, address, *(uint32_t *)(ram_eeprom + offset)); // IRON, OPTIMIZED
220
+ #endif
201
221
if (status == HAL_OK) {
202
- address += sizeof ( uint32_t ) ;
203
- offset += sizeof ( uint32_t ) ;
222
+ address += FLASHWORD_SIZE ;
223
+ offset += FLASHWORD_SIZE ;
204
224
}
205
225
else {
206
226
DEBUG_ECHOLNPGM (" HAL_FLASH_Program=" , status);
@@ -211,7 +231,10 @@ bool PersistentStore::access_finish() {
211
231
}
212
232
}
213
233
214
- LOCK_FLASH ();
234
+ if (flash_unlocked) {
235
+ HAL_FLASH_Lock ();
236
+ flash_unlocked = false ;
237
+ }
215
238
216
239
if (success) {
217
240
eeprom_data_written = false ;
0 commit comments