/** ****************************************************************************** * @file flash_if.c * @author MCD Application Team * @version V1.0.0 * @date 31-October-2011 * @brief This file provides high level routines to manage internal Flash * programming (erase and write). ****************************************************************************** * @attention * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * *

© COPYRIGHT 2011 STMicroelectronics

****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "flash_if.h" #include "httpserver.h" #include "common_config.h" #include "wdg.h" #include "tinystdio.h" /** * @brief Чтение данных из flash * @param address * @retval data */ uint32_t flash_read(uint32_t address) { return (*(__IO uint32_t*) address); } /** * @brief Unlocks Flash for write access * @param None * @retval None */ void FLASH_If_Init(void) { FLASH_Unlock(); } /** * @brief This function does an erase of all user flash area * @param StartSector: start of user flash area * @retval 0: user flash area successfully erased * 1: error occurred */ int8_t FLASH_If_Erase(uint32_t StartSector) { uint32_t FlashAddress; FlashAddress = StartSector; /* Device voltage range supposed to be [2.7V to 3.6V], the operation will be done by word */ if (FlashAddress <= (uint32_t) USER_FLASH_LAST_PAGE_ADDRESS) { FLASH_Unlock(); GPIOE->ODR ^= WDT_PIN; FLASH_EraseSector(FLASH_Sector_5, VoltageRange_3); /* 128 Kbyte */ GPIOE->ODR ^= WDT_PIN; FLASH_EraseSector(FLASH_Sector_6, VoltageRange_3); /* 128 Kbyte */ GPIOE->ODR ^= WDT_PIN; FLASH_EraseSector(FLASH_Sector_7, VoltageRange_3); /* 128 Kbyte */ GPIOE->ODR ^= WDT_PIN; /* Check if we use more than 512K flash */ if (USER_FLASH_END_ADDRESS > 0x08000000 + 0x7FFFF) { FLASH_EraseSector(FLASH_Sector_8, VoltageRange_3); /* 128 Kbyte */ GPIOE->ODR ^= WDT_PIN; FLASH_EraseSector(FLASH_Sector_9, VoltageRange_3); /* 128 Kbyte */ GPIOE->ODR ^= WDT_PIN; } FLASH_Lock(); } else { return (1); } return (0); } /** * @brief This function writes a data buffer in flash (data are 32-bit aligned). * @note After writing data buffer, the flash content is checked. * @param FlashAddress: start address for writing data buffer * @param Data: pointer on data buffer * @param DataLength: length of data buffer (unit is 32-bit word) * @retval 0: Data successfully written to Flash memory * 1: Error occurred while writing data in Flash memory * 2: Written Data in flash memory is different from expected one */ uint32_t FLASH_If_Write(__IO uint32_t* FlashAddress, uint32_t* Data ,uint16_t DataLength) { uint32_t i = 0; uint32_t delta; /* delta = 0x0805FFFF - *FlashAddress; // ReturnFlashWriteAddress(); printf("%i", delta); if ((delta < 1460) && (DataLength != 1)) DataLength = delta / 4; */ for (i = 0; (i < DataLength) && (*FlashAddress <= (USER_FLASH_END_ADDRESS)); i++) { /* Device voltage range supposed to be [2.7V to 3.6V], the operation will be done by word */ if (FLASH_ProgramWord(*FlashAddress, *(uint32_t*)(Data+i)) == FLASH_COMPLETE) { /* Check the written value */ if (*(uint32_t*)*FlashAddress != *(uint32_t*)(Data+i)) { /* Flash content doesn't match SRAM content */ return(2); } /* Increment FLASH destination address */ *FlashAddress += 4; } else { /* Error occurred while writing data in Flash memory */ return (1); } } return (0); } /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/