/** ****************************************************************************** * @file EEPROM_Emul/Porting/STM32L4/flash_interface.c * @author MCD Application Team * @brief This file provides all the EEPROM emulation flash interface functions. ****************************************************************************** * @attention * *

© Copyright (c) 2020 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "eeprom_emul.h" #include "flash_interface.h" __STATIC_FORCEINLINE uint32_t disable_int(void) { uint32_t s = __get_PRIMASK(); __disable_irq(); return s; } __STATIC_FORCEINLINE void restore_int(uint32_t s) { __set_PRIMASK(s); } /** @addtogroup EEPROM_Emulation * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ #if defined(FLASH_BANK_2) static uint32_t GetBankNumber(uint32_t Address); #endif /* Exported functions --------------------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /** @addtogroup EEPROM_Private_Functions * @{ */ /** * @brief Write a double word at the given address in Flash * @param Address Where to write * @param Data What to write * @retval EE_Status * - EE_OK: on success * - EE_WRITE_ERROR: if an error occurs */ EE_Status FI_WriteDoubleWord(uint32_t Address, uint64_t Data) { EE_Status status = EE_OK; uint32_t data0 = (uint32_t)(Data >> 0); uint32_t data1 = (uint32_t)(Data >> 32); uint32_t int_state = disable_int(); if (FLASH_Program2LongWord(Address, data0, data1) == 0) { FLASH_LaunchCMD(); while (FLASH_GetCmdFinshFlag() == 0) { } if (FLASH_CheckErrStatus() != 0) { status = EE_WRITE_ERROR; } } restore_int(int_state); return status; } /** * @brief Erase a page in polling mode * @param Page Page number * @param NbPages Number of pages to erase * @retval EE_Status * - EE_OK: on success * - EE error code: if an error occurs */ EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages) { EE_Status status = EE_OK; uint32_t addr = FLASH_BASE + Page * FLASH_PAGE_SIZE; uint32_t int_state = disable_int(); while (NbPages > 0) { if (FLASH_EraseSector(addr) == 0) { FLASH_LaunchCMD(); while (FLASH_GetCmdFinshFlag() == 0) { } if (FLASH_CheckErrStatus() != 0) { status = EE_ERASE_ERROR; break; } addr += FLASH_PAGE_SIZE; NbPages--; } } restore_int(int_state); return status; } /** * @brief Erase a page with interrupt enabled * @param Page Page number * @param NbPages Number of pages to erase * @retval EE_Status * - EE_OK: on success * - EE error code: if an error occurs */ EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages) { return EE_ERASE_ERROR; } /** * @brief Flush the caches if needed to keep coherency when the flash content is modified */ void FI_CacheFlush() { /* No flush needed. There is no D-Cache for the STM32G0x0 and STM32G0x1 products. */ } #if defined(FLASH_BANK_2) /** * @brief Gets the bank of a given address * @param Address Address of the FLASH Memory * @retval Bank_Number The bank of a given address */ static uint32_t GetBankNumber(uint32_t Address) { uint32_t bank = 0U; if (READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_FB_MODE) == 0U) { /* No Bank swap */ if (Address < (FLASH_BASE + FLASH_BANK_SIZE)) { bank = FLASH_BANK_1; } else { bank = FLASH_BANK_2; } } else { /* Bank swap */ if (Address < (FLASH_BASE + FLASH_BANK_SIZE)) { bank = FLASH_BANK_2; } else { bank = FLASH_BANK_1; } } return bank; } #endif /** * @brief Delete corrupted Flash address, can be called from NMI. No Timeout. * @param Address Address of the FLASH Memory to delete * @retval EE_Status * - EE_OK: on success * - EE error code: if an error occurs */ EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address) { return EE_OK; } /** * @brief Check if the configuration is 128-bits bank or 2*64-bits bank * @param None * @retval EE_Status * - EE_OK: on success * - EE error code: if an error occurs */ EE_Status FI_CheckBankConfig(void) { return EE_OK; } /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/