87 #ifdef HAL_FLASH_MODULE_ENABLED
94 #define FLASH_TIMEOUT_VALUE 50000U
114 static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data);
115 static void FLASH_Program_Word(uint32_t Address, uint32_t Data);
116 static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data);
117 static void FLASH_Program_Byte(uint32_t Address, uint8_t Data);
118 static void FLASH_SetErrorCode(
void);
156 HAL_StatusTypeDef status = HAL_ERROR;
162 assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram));
167 if (status == HAL_OK)
169 if (TypeProgram == FLASH_TYPEPROGRAM_BYTE)
172 FLASH_Program_Byte(Address, (uint8_t) Data);
174 else if (TypeProgram == FLASH_TYPEPROGRAM_HALFWORD)
177 FLASH_Program_HalfWord(Address, (uint16_t) Data);
179 else if (TypeProgram == FLASH_TYPEPROGRAM_WORD)
182 FLASH_Program_Word(Address, (uint32_t) Data);
187 FLASH_Program_DoubleWord(Address, Data);
194 FLASH->CR &= (~FLASH_CR_PG);
198 __HAL_UNLOCK(&pFlash);
214 HAL_StatusTypeDef status = HAL_OK;
217 assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram));
220 __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP);
223 __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR);
225 pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM;
226 pFlash.Address = Address;
228 if (TypeProgram == FLASH_TYPEPROGRAM_BYTE)
231 FLASH_Program_Byte(Address, (uint8_t) Data);
233 else if (TypeProgram == FLASH_TYPEPROGRAM_HALFWORD)
236 FLASH_Program_HalfWord(Address, (uint16_t) Data);
238 else if (TypeProgram == FLASH_TYPEPROGRAM_WORD)
241 FLASH_Program_Word(Address, (uint32_t) Data);
246 FLASH_Program_DoubleWord(Address, Data);
258 uint32_t addresstmp = 0U;
261 #if defined(FLASH_SR_RDERR)
262 if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \
263 FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET)
265 if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \
266 FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET)
269 if (pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE)
272 addresstmp = pFlash.Sector;
273 pFlash.Sector = 0xFFFFFFFFU;
275 else if (pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE)
278 addresstmp = pFlash.Bank;
283 addresstmp = pFlash.Address;
287 FLASH_SetErrorCode();
293 pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
297 if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET)
300 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
302 if (pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE)
305 pFlash.NbSectorsToErase--;
308 if (pFlash.NbSectorsToErase != 0U)
310 addresstmp = pFlash.Sector;
316 addresstmp = pFlash.Sector;
323 pFlash.Sector = addresstmp = 0xFFFFFFFFU;
324 pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
335 if (pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE)
350 pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
354 if (pFlash.ProcedureOnGoing == FLASH_PROC_NONE)
357 CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_SER | FLASH_CR_SNB | FLASH_MER_BIT));
360 __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP);
363 __HAL_FLASH_DISABLE_IT(FLASH_IT_ERR);
427 HAL_StatusTypeDef status = HAL_OK;
429 if (READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET)
432 WRITE_REG(FLASH->KEYR, FLASH_KEY1);
433 WRITE_REG(FLASH->KEYR, FLASH_KEY2);
436 if (READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET)
452 FLASH->CR |= FLASH_CR_LOCK;
463 if ((FLASH->OPTCR & FLASH_OPTCR_OPTLOCK) != RESET)
466 FLASH->OPTKEYR = FLASH_OPT_KEY1;
467 FLASH->OPTKEYR = FLASH_OPT_KEY2;
484 FLASH->OPTCR |= FLASH_OPTCR_OPTLOCK;
496 *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT;
532 return pFlash.ErrorCode;
546 uint32_t tickstart = 0U;
549 pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
557 while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET)
559 if (Timeout != HAL_MAX_DELAY)
561 if ((Timeout == 0U) || ((
HAL_GetTick() - tickstart) > Timeout))
569 if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET)
572 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
574 #if defined(FLASH_SR_RDERR)
575 if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \
576 FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET)
578 if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \
579 FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET)
583 FLASH_SetErrorCode();
604 static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data)
607 assert_param(IS_FLASH_ADDRESS(Address));
610 CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE);
611 FLASH->CR |= FLASH_PSIZE_DOUBLE_WORD;
612 FLASH->CR |= FLASH_CR_PG;
615 *(__IO uint32_t *)Address = (uint32_t)Data;
622 *(__IO uint32_t *)(Address + 4) = (uint32_t)(Data >> 32);
638 static void FLASH_Program_Word(uint32_t Address, uint32_t Data)
641 assert_param(IS_FLASH_ADDRESS(Address));
644 CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE);
645 FLASH->CR |= FLASH_PSIZE_WORD;
646 FLASH->CR |= FLASH_CR_PG;
648 *(__IO uint32_t *)Address = Data;
663 static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data)
666 assert_param(IS_FLASH_ADDRESS(Address));
669 CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE);
670 FLASH->CR |= FLASH_PSIZE_HALF_WORD;
671 FLASH->CR |= FLASH_CR_PG;
673 *(__IO uint16_t *)Address = Data;
688 static void FLASH_Program_Byte(uint32_t Address, uint8_t Data)
691 assert_param(IS_FLASH_ADDRESS(Address));
694 CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE);
695 FLASH->CR |= FLASH_PSIZE_BYTE;
696 FLASH->CR |= FLASH_CR_PG;
698 *(__IO uint8_t *)Address = Data;
705 static void FLASH_SetErrorCode(
void)
707 if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) != RESET)
709 pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP;
712 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR);
715 if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR) != RESET)
717 pFlash.ErrorCode |= HAL_FLASH_ERROR_PGA;
720 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR);
723 if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGPERR) != RESET)
725 pFlash.ErrorCode |= HAL_FLASH_ERROR_PGP;
728 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR);
731 if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR) != RESET)
733 pFlash.ErrorCode |= HAL_FLASH_ERROR_PGS;
736 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR);
738 #if defined(FLASH_SR_RDERR)
739 if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) != RESET)
741 pFlash.ErrorCode |= HAL_FLASH_ERROR_RD;
744 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_RDERR);
747 if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR) != RESET)
749 pFlash.ErrorCode |= HAL_FLASH_ERROR_OPERATION;
752 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR);
void FLASH_FlushCaches(void)
Flush the instruction and data caches.
void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange)
Erase the specified FLASH memory sector.
void HAL_FLASH_IRQHandler(void)
This function handles FLASH interrupt request.
void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue)
FLASH operation error interrupt callback.
void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue)
FLASH end of operation interrupt callback.
HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data)
Program byte, halfword, word or double word at a specified address with interrupt enabled.
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)
Program byte, halfword, word or double word at a specified address.
HAL_StatusTypeDef HAL_FLASH_OB_Launch(void)
Launch the option byte loading.
HAL_StatusTypeDef HAL_FLASH_Unlock(void)
Unlock the FLASH control register access.
HAL_StatusTypeDef HAL_FLASH_OB_Lock(void)
Lock the FLASH Option Control Registers access.
HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void)
Unlock the FLASH Option Control Registers access.
HAL_StatusTypeDef HAL_FLASH_Lock(void)
Locks the FLASH control register access.
uint32_t HAL_FLASH_GetError(void)
Get the specific FLASH error flag.
FLASH handle Structure definition.
HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout)
Wait for a FLASH operation to complete.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
This file contains all the functions prototypes for the HAL module driver.