EEPROM emulation (STM algorithm described in the application notes: AN4061, AN3969, AN2594, AN3390, AN4056) with added multipage possibility. For Nucleo-F030 and others boards with similar microcontrolers.

Dependencies:   mbed

Description in AN4061 from STM.

Changed (compared with the original code AN4061):

  • possibility of a larger size of emulated EEPROM (using multiple Flash pages)
  • dummy variables prevent overwrite code in Flash by algorithm of EEPROM emulation



Macro PAGE_NB_PVP (in eeprom.h) defines the size of the virtual page. Eg. For F030 where Flash page are 1kB value 4 gives 4kB.

Size 4kB virtual page gives you the ability to use max. approx. 1k of 16-bit variables.

Committer:
mega64
Date:
Sat Sep 24 00:52:55 2016 +0000
Revision:
0:2eda09ff61d0
Added possibility to increase size of virtual pages of emulation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mega64 0:2eda09ff61d0 1 /**
mega64 0:2eda09ff61d0 2 ******************************************************************************
mega64 0:2eda09ff61d0 3 * @file EEPROM_Emulation/inc/eeprom.h
mega64 0:2eda09ff61d0 4 * @author MCD Application Team
mega64 0:2eda09ff61d0 5 * @version V1.6.0
mega64 0:2eda09ff61d0 6 * @date 27-May-2016
mega64 0:2eda09ff61d0 7 * @brief This file contains all the functions prototypes for the EEPROM
mega64 0:2eda09ff61d0 8 * emulation firmware library.
mega64 0:2eda09ff61d0 9 ******************************************************************************
mega64 0:2eda09ff61d0 10 * @attention
mega64 0:2eda09ff61d0 11 *
mega64 0:2eda09ff61d0 12 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
mega64 0:2eda09ff61d0 13 *
mega64 0:2eda09ff61d0 14 * Redistribution and use in source and binary forms, with or without modification,
mega64 0:2eda09ff61d0 15 * are permitted provided that the following conditions are met:
mega64 0:2eda09ff61d0 16 * 1. Redistributions of source code must retain the above copyright notice,
mega64 0:2eda09ff61d0 17 * this list of conditions and the following disclaimer.
mega64 0:2eda09ff61d0 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
mega64 0:2eda09ff61d0 19 * this list of conditions and the following disclaimer in the documentation
mega64 0:2eda09ff61d0 20 * and/or other materials provided with the distribution.
mega64 0:2eda09ff61d0 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mega64 0:2eda09ff61d0 22 * may be used to endorse or promote products derived from this software
mega64 0:2eda09ff61d0 23 * without specific prior written permission.
mega64 0:2eda09ff61d0 24 *
mega64 0:2eda09ff61d0 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mega64 0:2eda09ff61d0 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mega64 0:2eda09ff61d0 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mega64 0:2eda09ff61d0 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mega64 0:2eda09ff61d0 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mega64 0:2eda09ff61d0 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mega64 0:2eda09ff61d0 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mega64 0:2eda09ff61d0 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mega64 0:2eda09ff61d0 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mega64 0:2eda09ff61d0 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mega64 0:2eda09ff61d0 35 *
mega64 0:2eda09ff61d0 36 ******************************************************************************
mega64 0:2eda09ff61d0 37 */
mega64 0:2eda09ff61d0 38
mega64 0:2eda09ff61d0 39 /* Define to prevent recursive inclusion -------------------------------------*/
mega64 0:2eda09ff61d0 40 #ifndef __EEPROM_H
mega64 0:2eda09ff61d0 41 #define __EEPROM_H
mega64 0:2eda09ff61d0 42
mega64 0:2eda09ff61d0 43 /* Includes ------------------------------------------------------------------*/
mega64 0:2eda09ff61d0 44 #include "stm32f0xx_hal.h"
mega64 0:2eda09ff61d0 45
mega64 0:2eda09ff61d0 46 /* Exported constants --------------------------------------------------------*/
mega64 0:2eda09ff61d0 47
mega64 0:2eda09ff61d0 48 /* Base address of the Flash sectors STM32F030R8 */
mega64 0:2eda09ff61d0 49 #define ADDR_FLASH_PAGE_0 ((uint32_t)0x08000000) /* Base @ of Page 0, 1 Kbyte */
mega64 0:2eda09ff61d0 50 #define ADDR_FLASH_PAGE_1 ((uint32_t)0x08000400) /* Base @ of Page 1, 1 Kbyte */
mega64 0:2eda09ff61d0 51 #define ADDR_FLASH_PAGE_2 ((uint32_t)0x08000800) /* Base @ of Page 2, 1 Kbyte */
mega64 0:2eda09ff61d0 52 #define ADDR_FLASH_PAGE_3 ((uint32_t)0x08000C00) /* Base @ of Page 3, 1 Kbyte */
mega64 0:2eda09ff61d0 53 #define ADDR_FLASH_PAGE_4 ((uint32_t)0x08001000) /* Base @ of Page 4, 1 Kbyte */
mega64 0:2eda09ff61d0 54 #define ADDR_FLASH_PAGE_5 ((uint32_t)0x08001400) /* Base @ of Page 5, 1 Kbyte */
mega64 0:2eda09ff61d0 55 #define ADDR_FLASH_PAGE_6 ((uint32_t)0x08001800) /* Base @ of Page 6, 1 Kbyte */
mega64 0:2eda09ff61d0 56 #define ADDR_FLASH_PAGE_7 ((uint32_t)0x08001C00) /* Base @ of Page 7, 1 Kbyte */
mega64 0:2eda09ff61d0 57 #define ADDR_FLASH_PAGE_8 ((uint32_t)0x08002000) /* Base @ of Page 8, 1 Kbyte */
mega64 0:2eda09ff61d0 58 #define ADDR_FLASH_PAGE_9 ((uint32_t)0x08002400) /* Base @ of Page 9, 1 Kbyte */
mega64 0:2eda09ff61d0 59 #define ADDR_FLASH_PAGE_10 ((uint32_t)0x08002800) /* Base @ of Page 10, 1 Kbyte */
mega64 0:2eda09ff61d0 60 #define ADDR_FLASH_PAGE_11 ((uint32_t)0x08002C00) /* Base @ of Page 11, 1 Kbyte */
mega64 0:2eda09ff61d0 61 #define ADDR_FLASH_PAGE_12 ((uint32_t)0x08003000) /* Base @ of Page 12, 1 Kbyte */
mega64 0:2eda09ff61d0 62 #define ADDR_FLASH_PAGE_13 ((uint32_t)0x08003400) /* Base @ of Page 13, 1 Kbyte */
mega64 0:2eda09ff61d0 63 #define ADDR_FLASH_PAGE_14 ((uint32_t)0x08003800) /* Base @ of Page 14, 1 Kbyte */
mega64 0:2eda09ff61d0 64 #define ADDR_FLASH_PAGE_15 ((uint32_t)0x08003C00) /* Base @ of Page 15, 1 Kbyte */
mega64 0:2eda09ff61d0 65 #define ADDR_FLASH_PAGE_16 ((uint32_t)0x08004000) /* Base @ of Page 16, 1 Kbyte */
mega64 0:2eda09ff61d0 66 #define ADDR_FLASH_PAGE_17 ((uint32_t)0x08004400) /* Base @ of Page 17, 1 Kbyte */
mega64 0:2eda09ff61d0 67 #define ADDR_FLASH_PAGE_18 ((uint32_t)0x08004800) /* Base @ of Page 18, 1 Kbyte */
mega64 0:2eda09ff61d0 68 #define ADDR_FLASH_PAGE_19 ((uint32_t)0x08004C00) /* Base @ of Page 19, 1 Kbyte */
mega64 0:2eda09ff61d0 69 #define ADDR_FLASH_PAGE_20 ((uint32_t)0x08005000) /* Base @ of Page 20, 1 Kbyte */
mega64 0:2eda09ff61d0 70 #define ADDR_FLASH_PAGE_21 ((uint32_t)0x08005400) /* Base @ of Page 21, 1 Kbyte */
mega64 0:2eda09ff61d0 71 #define ADDR_FLASH_PAGE_22 ((uint32_t)0x08005800) /* Base @ of Page 22, 1 Kbyte */
mega64 0:2eda09ff61d0 72 #define ADDR_FLASH_PAGE_23 ((uint32_t)0x08005C00) /* Base @ of Page 23, 1 Kbyte */
mega64 0:2eda09ff61d0 73 #define ADDR_FLASH_PAGE_24 ((uint32_t)0x08006000) /* Base @ of Page 24, 1 Kbyte */
mega64 0:2eda09ff61d0 74 #define ADDR_FLASH_PAGE_25 ((uint32_t)0x08006400) /* Base @ of Page 25, 1 Kbyte */
mega64 0:2eda09ff61d0 75 #define ADDR_FLASH_PAGE_26 ((uint32_t)0x08006800) /* Base @ of Page 26, 1 Kbyte */
mega64 0:2eda09ff61d0 76 #define ADDR_FLASH_PAGE_27 ((uint32_t)0x08006C00) /* Base @ of Page 27, 1 Kbyte */
mega64 0:2eda09ff61d0 77 #define ADDR_FLASH_PAGE_28 ((uint32_t)0x08007000) /* Base @ of Page 28, 1 Kbyte */
mega64 0:2eda09ff61d0 78 #define ADDR_FLASH_PAGE_29 ((uint32_t)0x08007400) /* Base @ of Page 29, 1 Kbyte */
mega64 0:2eda09ff61d0 79 #define ADDR_FLASH_PAGE_30 ((uint32_t)0x08007800) /* Base @ of Page 30, 1 Kbyte */
mega64 0:2eda09ff61d0 80 #define ADDR_FLASH_PAGE_31 ((uint32_t)0x08007C00) /* Base @ of Page 31, 1 Kbyte */
mega64 0:2eda09ff61d0 81 #define ADDR_FLASH_PAGE_32 ((uint32_t)0x08008000) /* Base @ of Page 32, 1 Kbyte */
mega64 0:2eda09ff61d0 82 #define ADDR_FLASH_PAGE_33 ((uint32_t)0x08008400) /* Base @ of Page 33, 1 Kbyte */
mega64 0:2eda09ff61d0 83 #define ADDR_FLASH_PAGE_34 ((uint32_t)0x08008800) /* Base @ of Page 34, 1 Kbyte */
mega64 0:2eda09ff61d0 84 #define ADDR_FLASH_PAGE_35 ((uint32_t)0x08008C00) /* Base @ of Page 35, 1 Kbyte */
mega64 0:2eda09ff61d0 85 #define ADDR_FLASH_PAGE_36 ((uint32_t)0x08009000) /* Base @ of Page 36, 1 Kbyte */
mega64 0:2eda09ff61d0 86 #define ADDR_FLASH_PAGE_37 ((uint32_t)0x08009400) /* Base @ of Page 37, 1 Kbyte */
mega64 0:2eda09ff61d0 87 #define ADDR_FLASH_PAGE_38 ((uint32_t)0x08009800) /* Base @ of Page 38, 1 Kbyte */
mega64 0:2eda09ff61d0 88 #define ADDR_FLASH_PAGE_39 ((uint32_t)0x08009C00) /* Base @ of Page 39, 1 Kbyte */
mega64 0:2eda09ff61d0 89 #define ADDR_FLASH_PAGE_40 ((uint32_t)0x0800A000) /* Base @ of Page 40, 1 Kbyte */
mega64 0:2eda09ff61d0 90 #define ADDR_FLASH_PAGE_41 ((uint32_t)0x0800A400) /* Base @ of Page 41, 1 Kbyte */
mega64 0:2eda09ff61d0 91 #define ADDR_FLASH_PAGE_42 ((uint32_t)0x0800A800) /* Base @ of Page 42, 1 Kbyte */
mega64 0:2eda09ff61d0 92 #define ADDR_FLASH_PAGE_43 ((uint32_t)0x0800AC00) /* Base @ of Page 43, 1 Kbyte */
mega64 0:2eda09ff61d0 93 #define ADDR_FLASH_PAGE_44 ((uint32_t)0x0800B000) /* Base @ of Page 44, 1 Kbyte */
mega64 0:2eda09ff61d0 94 #define ADDR_FLASH_PAGE_45 ((uint32_t)0x0800B400) /* Base @ of Page 45, 1 Kbyte */
mega64 0:2eda09ff61d0 95 #define ADDR_FLASH_PAGE_46 ((uint32_t)0x0800B800) /* Base @ of Page 46, 1 Kbyte */
mega64 0:2eda09ff61d0 96 #define ADDR_FLASH_PAGE_47 ((uint32_t)0x0800BC00) /* Base @ of Page 47, 1 Kbyte */
mega64 0:2eda09ff61d0 97 #define ADDR_FLASH_PAGE_48 ((uint32_t)0x0800C000) /* Base @ of Page 48, 1 Kbyte */
mega64 0:2eda09ff61d0 98 #define ADDR_FLASH_PAGE_49 ((uint32_t)0x0800C400) /* Base @ of Page 49, 1 Kbyte */
mega64 0:2eda09ff61d0 99 #define ADDR_FLASH_PAGE_50 ((uint32_t)0x0800C800) /* Base @ of Page 50, 1 Kbyte */
mega64 0:2eda09ff61d0 100 #define ADDR_FLASH_PAGE_51 ((uint32_t)0x0800CC00) /* Base @ of Page 51, 1 Kbyte */
mega64 0:2eda09ff61d0 101 #define ADDR_FLASH_PAGE_52 ((uint32_t)0x0800D000) /* Base @ of Page 52, 1 Kbyte */
mega64 0:2eda09ff61d0 102 #define ADDR_FLASH_PAGE_53 ((uint32_t)0x0800D400) /* Base @ of Page 53, 1 Kbyte */
mega64 0:2eda09ff61d0 103 #define ADDR_FLASH_PAGE_54 ((uint32_t)0x0800D800) /* Base @ of Page 54, 1 Kbyte */
mega64 0:2eda09ff61d0 104 #define ADDR_FLASH_PAGE_55 ((uint32_t)0x0800DC00) /* Base @ of Page 55, 1 Kbyte */
mega64 0:2eda09ff61d0 105 #define ADDR_FLASH_PAGE_56 ((uint32_t)0x0800E000) /* Base @ of Page 56, 1 Kbyte */
mega64 0:2eda09ff61d0 106 #define ADDR_FLASH_PAGE_57 ((uint32_t)0x0800E400) /* Base @ of Page 57, 1 Kbyte */
mega64 0:2eda09ff61d0 107 #define ADDR_FLASH_PAGE_58 ((uint32_t)0x0800E800) /* Base @ of Page 58, 1 Kbyte */
mega64 0:2eda09ff61d0 108 #define ADDR_FLASH_PAGE_59 ((uint32_t)0x0800EC00) /* Base @ of Page 59, 1 Kbyte */
mega64 0:2eda09ff61d0 109 #define ADDR_FLASH_PAGE_60 ((uint32_t)0x0800F000) /* Base @ of Page 60, 1 Kbyte */
mega64 0:2eda09ff61d0 110 #define ADDR_FLASH_PAGE_61 ((uint32_t)0x0800F400) /* Base @ of Page 61, 1 Kbyte */
mega64 0:2eda09ff61d0 111 #define ADDR_FLASH_PAGE_62 ((uint32_t)0x0800F800) /* Base @ of Page 62, 1 Kbyte */
mega64 0:2eda09ff61d0 112 #define ADDR_FLASH_PAGE_63 ((uint32_t)0x0800FC00) /* Base @ of Page 63, 1 Kbyte */
mega64 0:2eda09ff61d0 113
mega64 0:2eda09ff61d0 114
mega64 0:2eda09ff61d0 115 /* Define the number of physical pages per virtual page of algorithm*/
mega64 0:2eda09ff61d0 116 #define PAGE_NB_PVP ((uint32_t) 4)
mega64 0:2eda09ff61d0 117
mega64 0:2eda09ff61d0 118 /* Define the size of the sectors to be used */
mega64 0:2eda09ff61d0 119 #define PAGE_SIZE ((uint32_t)FLASH_PAGE_SIZE * PAGE_NB_PVP) /* Page size */
mega64 0:2eda09ff61d0 120
mega64 0:2eda09ff61d0 121 /* EEPROM start address in Flash */
mega64 0:2eda09ff61d0 122 #define EEPROM_START_ADDRESS ((uint32_t)ADDR_FLASH_PAGE_16) /* EEPROM emulation start address */
mega64 0:2eda09ff61d0 123
mega64 0:2eda09ff61d0 124 /* Pages 0 and 1 base and end addresses */
mega64 0:2eda09ff61d0 125 #define PAGE0_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + 0x0000))
mega64 0:2eda09ff61d0 126 #define PAGE0_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + (PAGE_SIZE - 1)))
mega64 0:2eda09ff61d0 127
mega64 0:2eda09ff61d0 128 #define PAGE1_BASE_ADDRESS ((uint32_t)(ADDR_FLASH_PAGE_48))
mega64 0:2eda09ff61d0 129 #define PAGE1_END_ADDRESS ((uint32_t)(ADDR_FLASH_PAGE_48 + PAGE_SIZE - 1))
mega64 0:2eda09ff61d0 130
mega64 0:2eda09ff61d0 131 /* Used Flash pages for EEPROM emulation */
mega64 0:2eda09ff61d0 132 #define PAGE0 ((uint16_t)0x0000)
mega64 0:2eda09ff61d0 133 #define PAGE1 ((uint16_t)((PAGE1_BASE_ADDRESS-PAGE0_BASE_ADDRESS)/PAGE_SIZE)) /* Virtual page nb between PAGE0_BASE_ADDRESS & PAGE1_BASE_ADDRESS*/
mega64 0:2eda09ff61d0 134
mega64 0:2eda09ff61d0 135 /* No valid page define */
mega64 0:2eda09ff61d0 136 #define NO_VALID_PAGE ((uint16_t)0xFFFF)
mega64 0:2eda09ff61d0 137
mega64 0:2eda09ff61d0 138 /* Page status definitions */
mega64 0:2eda09ff61d0 139 #define ERASED ((uint16_t)0xFFFF) /* Page is empty */
mega64 0:2eda09ff61d0 140 #define RECEIVE_DATA ((uint16_t)0xEEEE) /* Page is marked to receive data */
mega64 0:2eda09ff61d0 141 #define VALID_PAGE ((uint16_t)0x0000) /* Page containing valid data */
mega64 0:2eda09ff61d0 142
mega64 0:2eda09ff61d0 143 /* Valid pages in read and write defines */
mega64 0:2eda09ff61d0 144 #define READ_FROM_VALID_PAGE ((uint8_t)0x00)
mega64 0:2eda09ff61d0 145 #define WRITE_IN_VALID_PAGE ((uint8_t)0x01)
mega64 0:2eda09ff61d0 146
mega64 0:2eda09ff61d0 147 /* Page full define */
mega64 0:2eda09ff61d0 148 #define PAGE_FULL ((uint8_t)0x80)
mega64 0:2eda09ff61d0 149
mega64 0:2eda09ff61d0 150 /* Variables' number */
mega64 0:2eda09ff61d0 151 #define NB_OF_VAR ((uint8_t)0x03)
mega64 0:2eda09ff61d0 152
mega64 0:2eda09ff61d0 153 /* Exported types ------------------------------------------------------------*/
mega64 0:2eda09ff61d0 154 /* Exported macro ------------------------------------------------------------*/
mega64 0:2eda09ff61d0 155 /* Exported functions ------------------------------------------------------- */
mega64 0:2eda09ff61d0 156 uint16_t EE_Init(void);
mega64 0:2eda09ff61d0 157 uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data);
mega64 0:2eda09ff61d0 158 uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data);
mega64 0:2eda09ff61d0 159
mega64 0:2eda09ff61d0 160 #endif /* __EEPROM_H */
mega64 0:2eda09ff61d0 161
mega64 0:2eda09ff61d0 162 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/