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
- #ifdef STM32H7xx
78
- #define FLASHWORD_SIZE 32U // STM32H7xx a FLASHWORD is 32 bytes (256 bits)
79
- #define UNLOCK_FLASH () if (!flash_unlocked) { \
80
- HAL_FLASH_Unlock (); \
81
- __HAL_FLASH_CLEAR_FLAG (FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | \
82
- FLASH_FLAG_PGSERR); \
83
- flash_unlocked = true ; \
84
- }
85
- #else
86
- #define FLASHWORD_SIZE 4U // STM32F4xx a FLASHWORD is 4 bytes sizeof(uint32_t)
87
- #define UNLOCK_FLASH () if (!flash_unlocked) { \
88
- HAL_FLASH_Unlock (); \
89
- __HAL_FLASH_CLEAR_FLAG (FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | \
90
- FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); \
91
- flash_unlocked = true ; \
92
- }
93
- #endif
94
-
95
- #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
96
84
97
85
#define EMPTY_UINT32 ((uint32_t )-1 )
98
86
#define EMPTY_UINT8 ((uint8_t )-1 )
@@ -186,7 +174,12 @@ bool PersistentStore::access_finish() {
186
174
EraseInitStruct.NbSectors = 1 ;
187
175
188
176
current_slot = EEPROM_SLOTS - 1 ;
189
- 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
+ }
190
183
191
184
TERN_ (HAS_PAUSE_SERVO_OUTPUT, PAUSE_SERVO_OUTPUT ());
192
185
hal.isr_off ();
@@ -197,26 +190,32 @@ bool PersistentStore::access_finish() {
197
190
DEBUG_ECHOLNPGM (" HAL_FLASHEx_Erase=" , status);
198
191
DEBUG_ECHOLNPGM (" GetError=" , HAL_FLASH_GetError ());
199
192
DEBUG_ECHOLNPGM (" SectorError=" , SectorError);
200
- LOCK_FLASH ();
193
+ if (flash_unlocked) {
194
+ HAL_FLASH_Lock ();
195
+ flash_unlocked = false ;
196
+ }
201
197
return false ;
202
198
}
203
199
}
204
200
205
- UNLOCK_FLASH ();
201
+ if (!flash_unlocked) {
202
+ HAL_FLASH_Unlock ();
203
+ __HAL_FLASH_CLEAR_FLAG (FLASH_FLAGS_TO_CLEAR);
204
+ flash_unlocked = true ;
205
+ }
206
206
207
207
uint32_t offset = 0 ,
208
208
address = SLOT_ADDRESS (current_slot),
209
209
address_end = address + MARLIN_EEPROM_SIZE;
210
- // data = 0;
211
210
212
211
bool success = true ;
213
212
214
213
while (address < address_end) {
215
214
#ifdef STM32H7xx
216
215
status = HAL_FLASH_Program (FLASH_TYPEPROGRAM_FLASHWORD, address, uint32_t (ram_eeprom + offset));
217
216
#else
218
- // memcpy(&data, ram_eeprom + offset, sizeof(data)); // IRON, IMPROVED
219
- // status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data);
217
+ // memcpy(&data, ram_eeprom + offset, sizeof(data)); // IRON, IMPROVED
218
+ // status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data);
220
219
status = HAL_FLASH_Program (FLASH_TYPEPROGRAM_WORD, address, *(uint32_t *)(ram_eeprom + offset)); // IRON, OPTIMIZED
221
220
#endif
222
221
if (status == HAL_OK) {
@@ -232,7 +231,10 @@ bool PersistentStore::access_finish() {
232
231
}
233
232
}
234
233
235
- LOCK_FLASH ();
234
+ if (flash_unlocked) {
235
+ HAL_FLASH_Lock ();
236
+ flash_unlocked = false ;
237
+ }
236
238
237
239
if (success) {
238
240
eeprom_data_written = false ;
0 commit comments