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

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

* * Redistribution and use in source and binary forms, with or without * modification, are permitted, provided that the following conditions are met: * * 1. Redistribution of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of other * contributors to this software may be used to endorse or promote products * derived from this software without specific written permission. * 4. This software, including modifications and/or derivative works of this * software, must execute solely and exclusively on microcontroller or * microprocessor devices manufactured by or for STMicroelectronics. * 5. Redistribution and use of this software other than as permitted under * this license is void and will automatically terminate your rights under * this license. * * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "eeprom_emul.h" #include "flash_interface.h" /** @addtogroup EEPROM_Emulation * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* 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 */ HAL_StatusTypeDef FI_WriteDoubleWord(uint32_t Address, uint64_t Data) { return HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, Data); } /** * @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; FLASH_EraseInitTypeDef s_eraseinit; uint32_t page_error = 0U; s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; s_eraseinit.NbPages = NbPages; s_eraseinit.Page = Page; /* Erase the Page: Set Page status to ERASED status */ if (HAL_FLASHEx_Erase(&s_eraseinit, &page_error) != HAL_OK) { status = EE_ERASE_ERROR; } 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) { EE_Status status = EE_OK; FLASH_EraseInitTypeDef s_eraseinit; s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; s_eraseinit.NbPages = NbPages; s_eraseinit.Page = Page; /* Erase the Page: Set Page status to ERASED status */ if (HAL_FLASHEx_Erase_IT(&s_eraseinit) != HAL_OK) { status = EE_ERASE_ERROR; } return status; } /** * @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) { EE_Status status = EE_OK; /* Set FLASH Programmation bit */ SET_BIT(FLASH->CR, FLASH_CR_PG); /* Program double word of value 0 */ *(__IO uint32_t*)(Address) = (uint32_t)0U; *(__IO uint32_t*)(Address+4U) = (uint32_t)0U; /* Wait programmation completion */ while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)) { } /* Check if error occured */ if((__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PROGERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR))) { status = EE_DELETE_ERROR; } /* Check FLASH End of Operation flag */ if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP)) { /* Clear FLASH End of Operation pending bit */ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); } /* Clear FLASH Programmation bit */ CLEAR_BIT(FLASH->CR, FLASH_CR_PG); /* Clear FLASH ECCD bit */ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ECCD); return status; } /** * @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) { #if defined (FLASH_OPTR_DBANK) FLASH_OBProgramInitTypeDef sOBCfg; EE_Status status; /* Request the Option Byte configuration : - User and RDP level are always returned - WRP and PCROP are not requested */ sOBCfg.WRPArea = 0xFF; sOBCfg.PCROPConfig = 0xFF; HAL_FLASHEx_OBGetConfig(&sOBCfg); /* Check the value of the DBANK user option byte */ if ((sOBCfg.USERConfig & OB_DBANK_64_BITS) != 0) { status = EE_OK; } else { status = EE_INVALID_BANK_CFG; } return status; #else /* No feature 128-bits single bank, so always 64-bits dual bank */ return EE_OK; #endif } /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/