123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709 |
- #include "stm32f3_hal.h"
- #ifdef HAL_FLASH_MODULE_ENABLED
-
- FLASH_ProcessTypeDef pFlash;
- static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data);
- static void FLASH_SetErrorCode(void);
- extern void FLASH_PageErase(uint32_t PageAddress);
-
- HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)
- {
- HAL_StatusTypeDef status = HAL_ERROR;
- uint8_t index = 0U;
- uint8_t nbiterations = 0U;
-
-
- __HAL_LOCK(&pFlash);
-
- assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram));
- assert_param(IS_FLASH_PROGRAM_ADDRESS(Address));
-
- status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
-
- if(status == HAL_OK)
- {
- if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD)
- {
-
- nbiterations = 1U;
- }
- else if(TypeProgram == FLASH_TYPEPROGRAM_WORD)
- {
-
- nbiterations = 2U;
- }
- else
- {
-
- nbiterations = 4U;
- }
- for (index = 0U; index < nbiterations; index++)
- {
- FLASH_Program_HalfWord((Address + (2U*index)), (uint16_t)(Data >> (16U*index)));
-
- status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
-
-
- CLEAR_BIT(FLASH->CR, FLASH_CR_PG);
-
- if (status != HAL_OK)
- {
- break;
- }
- }
- }
-
- __HAL_UNLOCK(&pFlash);
- return status;
- }
- HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data)
- {
- HAL_StatusTypeDef status = HAL_OK;
-
-
- __HAL_LOCK(&pFlash);
-
- assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram));
- assert_param(IS_FLASH_PROGRAM_ADDRESS(Address));
-
- __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP | FLASH_IT_ERR);
-
- pFlash.Address = Address;
- pFlash.Data = Data;
- if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD)
- {
- pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAMHALFWORD;
-
- pFlash.DataRemaining = 1U;
- }
- else if(TypeProgram == FLASH_TYPEPROGRAM_WORD)
- {
- pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAMWORD;
-
- pFlash.DataRemaining = 2U;
- }
- else
- {
- pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAMDOUBLEWORD;
-
- pFlash.DataRemaining = 4U;
- }
-
- FLASH_Program_HalfWord(Address, (uint16_t)Data);
- return status;
- }
- void HAL_FLASH_IRQHandler(void)
- {
- uint32_t addresstmp = 0U;
-
-
- if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) ||__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR))
- {
-
- addresstmp = pFlash.Address;
-
- pFlash.Address = 0xFFFFFFFFU;
-
-
- FLASH_SetErrorCode();
-
-
- HAL_FLASH_OperationErrorCallback(addresstmp);
-
- pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
- }
-
- if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP))
- {
-
- __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
-
-
- if(pFlash.ProcedureOnGoing != FLASH_PROC_NONE)
- {
- if(pFlash.ProcedureOnGoing == FLASH_PROC_PAGEERASE)
- {
-
- pFlash.DataRemaining--;
-
- if(pFlash.DataRemaining != 0U)
- {
- addresstmp = pFlash.Address;
-
- HAL_FLASH_EndOfOperationCallback(addresstmp);
-
- addresstmp = pFlash.Address + FLASH_PAGE_SIZE;
- pFlash.Address = addresstmp;
-
- CLEAR_BIT(FLASH->CR, FLASH_CR_PER);
- FLASH_PageErase(addresstmp);
- }
- else
- {
-
-
- pFlash.Address = addresstmp = 0xFFFFFFFFU;
- pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
-
- HAL_FLASH_EndOfOperationCallback(addresstmp);
- }
- }
- else if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE)
- {
-
- CLEAR_BIT(FLASH->CR, FLASH_CR_MER);
-
-
- HAL_FLASH_EndOfOperationCallback(0U);
-
- pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
- }
- else
- {
-
- pFlash.DataRemaining--;
-
-
- if(pFlash.DataRemaining != 0U)
- {
-
- pFlash.Address += 2U;
- addresstmp = pFlash.Address;
-
-
- pFlash.Data = (pFlash.Data >> 16U);
-
-
- CLEAR_BIT(FLASH->CR, FLASH_CR_PG);
-
- FLASH_Program_HalfWord(addresstmp, (uint16_t)pFlash.Data);
- }
- else
- {
-
-
- if (pFlash.ProcedureOnGoing == FLASH_PROC_PROGRAMHALFWORD)
- {
- HAL_FLASH_EndOfOperationCallback(pFlash.Address);
- }
- else if (pFlash.ProcedureOnGoing == FLASH_PROC_PROGRAMWORD)
- {
- HAL_FLASH_EndOfOperationCallback(pFlash.Address - 2U);
- }
- else
- {
- HAL_FLASH_EndOfOperationCallback(pFlash.Address - 6U);
- }
-
-
- pFlash.Address = 0xFFFFFFFFU;
- pFlash.ProcedureOnGoing = FLASH_PROC_NONE;
- }
- }
- }
- }
-
- if(pFlash.ProcedureOnGoing == FLASH_PROC_NONE)
- {
-
- CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_PER | FLASH_CR_MER));
-
- __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP | FLASH_IT_ERR);
-
- __HAL_UNLOCK(&pFlash);
- }
- }
- __weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue)
- {
-
- UNUSED(ReturnValue);
-
-
- }
- __weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue)
- {
-
- UNUSED(ReturnValue);
-
-
- }
- HAL_StatusTypeDef HAL_FLASH_Unlock(void)
- {
- if (HAL_IS_BIT_SET(FLASH->CR, FLASH_CR_LOCK))
- {
-
- WRITE_REG(FLASH->KEYR, FLASH_KEY1);
- WRITE_REG(FLASH->KEYR, FLASH_KEY2);
- }
- else
- {
- return HAL_ERROR;
- }
- return HAL_OK;
- }
- HAL_StatusTypeDef HAL_FLASH_Lock(void)
- {
-
- SET_BIT(FLASH->CR, FLASH_CR_LOCK);
-
- return HAL_OK;
- }
- HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void)
- {
- if (HAL_IS_BIT_CLR(FLASH->CR, FLASH_CR_OPTWRE))
- {
-
- WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY1);
- WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY2);
- }
- else
- {
- return HAL_ERROR;
- }
-
- return HAL_OK;
- }
- HAL_StatusTypeDef HAL_FLASH_OB_Lock(void)
- {
-
- CLEAR_BIT(FLASH->CR, FLASH_CR_OPTWRE);
-
- return HAL_OK;
- }
-
- HAL_StatusTypeDef HAL_FLASH_OB_Launch(void)
- {
-
- SET_BIT(FLASH->CR, FLASH_CR_OBL_LAUNCH);
-
-
- return(FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE));
- }
-
- uint32_t HAL_FLASH_GetError(void)
- {
- return pFlash.ErrorCode;
- }
- static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data)
- {
-
- pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
-
-
- SET_BIT(FLASH->CR, FLASH_CR_PG);
-
- *(__IO uint16_t*)Address = Data;
- }
- HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout)
- {
-
-
- uint32_t tickstart = HAL_GetTick();
-
- while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY))
- {
- if (Timeout != HAL_MAX_DELAY)
- {
- if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout))
- {
- return HAL_TIMEOUT;
- }
- }
- }
-
-
- if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP))
- {
-
- __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
- }
-
- if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) ||
- __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR))
- {
-
- FLASH_SetErrorCode();
- return HAL_ERROR;
- }
-
- return HAL_OK;
- }
- static void FLASH_SetErrorCode(void)
- {
- uint32_t flags = 0U;
-
- if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR))
- {
- pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP;
- flags |= FLASH_FLAG_WRPERR;
- }
- if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR))
- {
- pFlash.ErrorCode |= HAL_FLASH_ERROR_PROG;
- flags |= FLASH_FLAG_PGERR;
- }
-
- __HAL_FLASH_CLEAR_FLAG(flags);
- }
- #endif
|