47 #define FLASH_SIZE_WRAPPER (uint32_t)(FLASH_SIZE)
51 #define FLASH_BANK_SIZE_WRAPPER (uint32_t)(FLASH_BANK_SIZE)
55 #define FLASH_PAGE_NB_PER_BANK \
56 (uint32_t)(FLASH_BANK_SIZE_WRAPPER / FLASH_PAGE_SIZE)
90 const uint32_t address,
91 const uint32_t length);
128 const uint32_t range1End,
129 const uint32_t range2Start,
130 const uint32_t range2End);
135 (void)HAL_FLASH_Unlock();
137 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS);
138 (void)HAL_FLASH_Lock();
143 return (address >= FLASH_BASE) &&
148 const uint32_t length)
152 FLASH_OBProgramInitTypeDef obProgram = {0};
155 const uint32_t bankEnd =
FlashGetBank(address + length - 1U);
160 if (bankStart == FLASH_BANK_1)
164 if (bankStart != bankEnd)
170 obProgram.WRPArea = OB_WRPAREA_BANK1_AREAA;
171 HAL_FLASHEx_OBGetConfig(&obProgram);
173 obProgram.WRPEndOffset, pageStart,
180 obProgram.WRPArea = OB_WRPAREA_BANK1_AREAB;
181 HAL_FLASHEx_OBGetConfig(&obProgram);
183 obProgram.WRPEndOffset, pageStart,
191 if (bankEnd == FLASH_BANK_2)
195 if (bankStart != bankEnd)
201 obProgram.WRPArea = OB_WRPAREA_BANK2_AREAA;
202 HAL_FLASHEx_OBGetConfig(&obProgram);
204 obProgram.WRPEndOffset, pageStart,
211 obProgram.WRPArea = OB_WRPAREA_BANK2_AREAB;
212 HAL_FLASHEx_OBGetConfig(&obProgram);
214 obProgram.WRPEndOffset, pageStart,
226 FLASH_OBProgramInitTypeDef obProgram = {0};
229 bool result = (HAL_OK == HAL_FLASH_Unlock());
232 result = (HAL_OK == HAL_FLASH_OB_Unlock());
236 obProgram.WRPArea = OB_WRPAREA_BANK1_AREAA;
237 obProgram.OptionType = OPTIONBYTE_WRP;
238 obProgram.WRPStartOffset = 0xFF;
239 obProgram.WRPEndOffset = 0x00;
242 result = (HAL_OK == HAL_FLASHEx_OBProgram(&obProgram));
246 obProgram.WRPArea = OB_WRPAREA_BANK1_AREAB;
247 obProgram.OptionType = OPTIONBYTE_WRP;
248 obProgram.WRPStartOffset = 0xFF;
249 obProgram.WRPEndOffset = 0x00;
252 result = (HAL_OK == HAL_FLASHEx_OBProgram(&obProgram));
256 obProgram.WRPArea = OB_WRPAREA_BANK2_AREAA;
257 obProgram.OptionType = OPTIONBYTE_WRP;
258 obProgram.WRPStartOffset = 0xFF;
259 obProgram.WRPEndOffset = 0x00;
262 result = (HAL_OK == HAL_FLASHEx_OBProgram(&obProgram));
266 obProgram.WRPArea = OB_WRPAREA_BANK2_AREAB;
267 obProgram.OptionType = OPTIONBYTE_WRP;
268 obProgram.WRPStartOffset = 0xFF;
269 obProgram.WRPEndOffset = 0x00;
272 result = (HAL_OK == HAL_FLASHEx_OBProgram(&obProgram));
279 result = (HAL_OK == HAL_FLASH_OB_Launch());
285 (void)HAL_FLASH_OB_Lock();
286 (void)HAL_FLASH_Lock();
293 FLASH_OBProgramInitTypeDef obProgram = {0};
296 const uint32_t bankEnd =
FlashGetBank(address + length - 1U);
301 bool result = (HAL_OK == HAL_FLASH_Unlock());
304 result = (HAL_OK == HAL_FLASH_OB_Unlock());
308 if (bankStart == FLASH_BANK_1)
312 if (bankStart != bankEnd)
319 obProgram.WRPArea = OB_WRPAREA_BANK1_AREAA;
320 obProgram.OptionType = OPTIONBYTE_WRP;
321 obProgram.WRPStartOffset = pageStart;
322 obProgram.WRPEndOffset = pageEnd;
325 result = (HAL_OK == HAL_FLASHEx_OBProgram(&obProgram));
330 if (bankEnd == FLASH_BANK_2)
334 if (bankStart != bankEnd)
341 obProgram.WRPArea = OB_WRPAREA_BANK2_AREAA;
342 obProgram.OptionType = OPTIONBYTE_WRP;
343 obProgram.WRPStartOffset = pageStart;
344 obProgram.WRPEndOffset = pageEnd;
347 result = (HAL_OK == HAL_FLASHEx_OBProgram(&obProgram));
355 result = (HAL_OK == HAL_FLASH_OB_Launch());
361 (void)HAL_FLASH_OB_Lock();
362 (void)HAL_FLASH_Lock();
368 const uint32_t address,
369 const uint32_t length)
383 result = (memcmp(data, (
const uint8_t*)address, length) == 0);
389 const uint32_t address,
390 const uint32_t length)
392 uint32_t readBytes = 0U;
406 (void)memcpy((
void*)data, (
void*)address, length);
413 const uint32_t address,
414 const uint32_t length)
416 size_t writtenBytes = 0U;
425 (void)HAL_FLASH_Unlock();
434 (void)HAL_FLASH_Lock();
438 writtenBytes += length;
449 __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();
456 HAL_StatusTypeDef status = HAL_OK;
457 FLASH_EraseInitTypeDef eraseInit = {0U};
458 uint32_t pageError = 0U;
461 const uint32_t bankEnd =
FlashGetBank(address + length - 1U);
463 const uint32_t pageEnd =
FlashGetPage(address + length - 1U);
466 if (bankStart != bankEnd)
469 eraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
470 eraseInit.Banks = FLASH_BANK_1;
471 eraseInit.Page = pageStart;
474 status = HAL_FLASHEx_Erase(&eraseInit, &pageError);
475 if ((status == HAL_OK) && (pageError == 0xFFFFFFFFU))
478 eraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
479 eraseInit.Banks = FLASH_BANK_2;
481 eraseInit.NbPages = pageEnd + 1U;
483 status = HAL_FLASHEx_Erase(&eraseInit, &pageError);
484 if ((status == HAL_OK) && (pageError == 0xFFFFFFFFU))
493 eraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
494 eraseInit.Banks = bankStart;
495 eraseInit.Page = pageStart;
496 eraseInit.NbPages = pageEnd - pageStart + 1U;
498 status = HAL_FLASHEx_Erase(&eraseInit, &pageError);
499 if ((status == HAL_OK) && (pageError == 0xFFFFFFFFU))
509 const uint32_t address,
510 const uint32_t length)
512 uint32_t writtenBytes = 0U;
514 for (uint32_t i = 0U; i < length; (i = i + 8U))
516 HAL_StatusTypeDef status = HAL_OK;
517 uint64_t dataChunkValue = 0U;
521 const uint8_t dataChunkSize =
522 ((length - i) < 8U) ? (uint8_t)(length - i) : 8U;
524 (void)memcpy(&dataChunkValue, (
const void*)&data[i], dataChunkSize);
526 status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, (address + i),
529 if (status == HAL_OK)
531 writtenBytes += dataChunkSize;
551 ? ((address - FLASH_BASE) / FLASH_PAGE_SIZE)
557 const uint32_t range1End,
558 const uint32_t range2Start,
559 const uint32_t range2End)
561 bool isOverlap =
false;
562 if ((range1End > range1Start) && (range2End > range2Start))
564 isOverlap = ((range1Start <= range2End) && (range2Start <= range1End));
This file contains the MCU internal flash driver function prototypes for read, write,...
uint32_t FlashRead(uint8_t *const data, const uint32_t address, const uint32_t length)
Read data from the microcontroller flash.
bool FlashEnableWriteProtection(const uint32_t address, const uint32_t length)
Enable flash write protection for the specified region.
#define FLASH_PAGE_NB_PER_BANK
bool FlashCompare(const uint8_t *const data, const uint32_t address, const uint32_t length)
Compare buffer content with microcontroller flash content.
static bool FlashPerformErase(const uint32_t address, const uint32_t length)
Private helper function to perform the actual erase of the required flash pages.
void FlashRemapMemoryToSystemFlash(void)
Remap the microcontroller flash memory to the built-in system flash memory.
bool FlashCheckIfWriteProtectionEnabled(const uint32_t address, const uint32_t length)
Check if flash write protection is enabled for the specified region.
#define FLASH_SIZE_WRAPPER
static uint32_t FlashGetBank(const uint32_t address)
Get the bank where the provided address is located.
static uint32_t FlashPerformWrite(const uint8_t *const data, const uint32_t address, const uint32_t length)
Private helper function to perform the actual writing of the provided data into the flash.
static uint32_t FlashGetPage(const uint32_t address)
Get the page number where the provided address is located.
uint32_t FlashWrite(const uint8_t *const data, const uint32_t address, const uint32_t length)
Write data into the microcontroller flash.
bool FlashCheckIfDataFits(const uint32_t address, const uint32_t length)
Check if an array of data fits into the flash.
#define FLASH_BANK_SIZE_WRAPPER
void FlashClearErrorFlags(void)
Clear all flash error flags.
bool FlashDisableWriteProtection(void)
Disable flash write protection for the application area.
static bool FlashCheckIfPageRangesOverlap(const uint32_t range1Start, const uint32_t range1End, const uint32_t range2Start, const uint32_t range2End)
Check if two flash page ranges overlap.
void RccEnableSysCfg(void)
Enable the SYSCFG clock.
This file includes the microcontroller-specific HAL header files.
This file contains the RCC (Reset and Clock Control) driver function prototypes for enabling and disa...