Skip to content

Commit e5d9368

Browse files
authored
Merge pull request #1129 from FRASTM/eeprom_l0
[WIP] stm32L0xx soc series has an embedded EEPROM
2 parents 2d5bd28 + d85772f commit e5d9368

File tree

2 files changed

+57
-30
lines changed

2 files changed

+57
-30
lines changed

cores/arduino/stm32/stm32_eeprom.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,25 @@ extern "C" {
8080
*/
8181
#define FLASH_PAGE_SIZE ((uint32_t)(16*1024)) /* 16kB page */
8282
#endif
83+
84+
#if defined(DATA_EEPROM_BASE) || defined(FLASH_EEPROM_BASE)
85+
86+
#if defined (DATA_EEPROM_END)
87+
#define E2END (DATA_EEPROM_END - DATA_EEPROM_BASE)
88+
#elif defined (DATA_EEPROM_BANK2_END)
89+
/* assuming two contiguous banks */
90+
#define DATA_EEPROM_END DATA_EEPROM_BANK2_END
91+
#define E2END (DATA_EEPROM_BANK2_END - DATA_EEPROM_BASE)
92+
#elif defined (FLASH_EEPROM_END)
93+
#define DATA_EEPROM_BASE FLASH_EEPROM_BASE
94+
#define DATA_EEPROM_END FLASH_EEPROM_END
95+
#define E2END (DATA_EEPROM_END - DATA_EEPROM_BASE)
96+
#endif /* __EEPROM_END */
97+
98+
#else /* _EEPROM_BASE */
8399
#define E2END (FLASH_PAGE_SIZE - 1)
100+
#endif /* _EEPROM_BASE */
101+
84102
#endif
85103

86104
/* Exported macro ------------------------------------------------------------*/
@@ -89,10 +107,12 @@ extern "C" {
89107
uint8_t eeprom_read_byte(const uint32_t pos);
90108
void eeprom_write_byte(uint32_t pos, uint8_t value);
91109

110+
#if !defined(DATA_EEPROM_BASE)
92111
void eeprom_buffer_fill();
93112
void eeprom_buffer_flush();
94113
uint8_t eeprom_buffered_read_byte(const uint32_t pos);
95114
void eeprom_buffered_write_byte(uint32_t pos, uint8_t value);
115+
#endif /* ! DATA_EEPROM_BASE */
96116

97117
#ifdef __cplusplus
98118
}

libraries/SrcWrapper/src/stm32/stm32_eeprom.c

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ extern "C" {
4242
/* Be able to change FLASH_BANK_NUMBER to use if relevant */
4343
#if !defined(FLASH_BANK_NUMBER) &&\
4444
(defined(STM32F0xx) || defined(STM32F1xx) || defined(STM32G4xx) ||\
45-
defined(STM32H7xx) || defined(STM32L1xx) || defined(STM32L4xx))
46-
/* Fo STM32F0xx, FLASH_BANK_1 is not defined only FLASH_BANK1_END is defined */
45+
defined(STM32H7xx) || defined(STM32L4xx))
46+
/* For STM32F0xx, FLASH_BANK_1 is not defined only FLASH_BANK1_END is defined */
4747
#if defined(STM32F0xx)
4848
#define FLASH_BANK_1 1U
4949
#endif
@@ -58,7 +58,7 @@ extern "C" {
5858
#endif /* !FLASH_BANK_NUMBER */
5959

6060
/* Be able to change FLASH_DATA_SECTOR to use if relevant */
61-
#if defined(STM32F2xx) || defined(STM32F4xx) || defined(STM32F7xx) ||\
61+
#if defined(STM32F2xx) || defined(STM32F4xx) || defined(STM32F7xx) ||\
6262
defined(STM32H7xx)
6363
#if !defined(FLASH_DATA_SECTOR)
6464
#define FLASH_DATA_SECTOR ((uint32_t)(FLASH_SECTOR_TOTAL - 1))
@@ -77,8 +77,8 @@ extern "C" {
7777
#endif /* !FLASH_PAGE_NUMBER */
7878

7979
/* Be able to change FLASH_END to use */
80-
#if !defined(FLASH_END) && !defined(STM32L0xx)
81-
#if defined (STM32F0xx) || defined (STM32F1xx) || defined(STM32L1xx)
80+
#if !defined(FLASH_END)
81+
#if defined (STM32F0xx) || defined (STM32F1xx)
8282
#if defined (FLASH_BANK2_END) && (FLASH_BANK_NUMBER == FLASH_BANK_2)
8383
#define FLASH_END FLASH_BANK2_END
8484
#elif defined (FLASH_BANK1_END) && (FLASH_BANK_NUMBER == FLASH_BANK_1)
@@ -117,6 +117,8 @@ static inline uint32_t get_flash_end(void)
117117
#define FLASH_END ((uint32_t)(FLASH_BASE + (((FLASH_PAGE_NUMBER +1) * FLASH_PAGE_SIZE))-1))
118118
#elif defined(EEPROM_RETRAM_MODE)
119119
#define FLASH_END ((uint32_t)(EEPROM_RETRAM_START_ADDRESS + EEPROM_RETRAM_MODE_SIZE -1))
120+
#elif defined(DATA_EEPROM_END)
121+
#define FLASH_END DATA_EEPROM_END
120122
#endif
121123
#ifndef FLASH_END
122124
#error "FLASH_END could not be defined"
@@ -130,9 +132,7 @@ static inline uint32_t get_flash_end(void)
130132
* in order to prevent overwritting
131133
* program data
132134
*/
133-
#if defined(STM32L0xx)
134-
#define FLASH_BASE_ADDRESS ((uint32_t)(DATA_EEPROM_BASE))
135-
#elif defined(EEPROM_RETRAM_MODE)
135+
#if defined(EEPROM_RETRAM_MODE)
136136
#define FLASH_BASE_ADDRESS EEPROM_RETRAM_START_ADDRESS
137137
#else
138138
#define FLASH_BASE_ADDRESS ((uint32_t)((FLASH_END + 1) - FLASH_PAGE_SIZE))
@@ -142,7 +142,9 @@ static inline uint32_t get_flash_end(void)
142142
#endif
143143
#endif /* FLASH_BASE_ADDRESS */
144144

145+
#if !defined(DATA_EEPROM_BASE)
145146
static uint8_t eeprom_buffer[E2END + 1] __attribute__((aligned(8))) = {0};
147+
#endif
146148

147149
/**
148150
* @brief Function reads a byte from emulated eeprom (flash)
@@ -151,8 +153,17 @@ static uint8_t eeprom_buffer[E2END + 1] __attribute__((aligned(8))) = {0};
151153
*/
152154
uint8_t eeprom_read_byte(const uint32_t pos)
153155
{
156+
#if defined(DATA_EEPROM_BASE)
157+
__IO uint8_t data = 0;
158+
if (pos <= (DATA_EEPROM_END - DATA_EEPROM_BASE)) {
159+
/* with actual EEPROM, pos is a relative address */
160+
data = *(__IO uint8_t *)(DATA_EEPROM_BASE + pos);
161+
}
162+
return (uint8_t)data;
163+
#else
154164
eeprom_buffer_fill();
155165
return eeprom_buffered_read_byte(pos);
166+
#endif /* _EEPROM_BASE */
156167
}
157168

158169
/**
@@ -163,10 +174,22 @@ uint8_t eeprom_read_byte(const uint32_t pos)
163174
*/
164175
void eeprom_write_byte(uint32_t pos, uint8_t value)
165176
{
177+
#if defined(DATA_EEPROM_BASE)
178+
/* with actual EEPROM, pos is a relative address */
179+
if (pos <= (DATA_EEPROM_END - DATA_EEPROM_BASE)) {
180+
if (HAL_FLASHEx_DATAEEPROM_Unlock() == HAL_OK) {
181+
HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, (pos + DATA_EEPROM_BASE), (uint32_t)value);
182+
HAL_FLASHEx_DATAEEPROM_Lock();
183+
}
184+
}
185+
#else
166186
eeprom_buffered_write_byte(pos, value);
167187
eeprom_buffer_flush();
188+
#endif /* _EEPROM_BASE */
168189
}
169190

191+
#if !defined(DATA_EEPROM_BASE)
192+
170193
/**
171194
* @brief Function reads a byte from the eeprom buffer
172195
* @param pos : address to read
@@ -224,8 +247,8 @@ void eeprom_buffer_flush(void)
224247
uint32_t address = FLASH_BASE_ADDRESS;
225248
uint32_t address_end = FLASH_BASE_ADDRESS + E2END;
226249
#if defined (STM32F0xx) || defined (STM32F1xx) || defined (STM32F3xx) || \
227-
defined (STM32G0xx) || defined (STM32G4xx) || defined (STM32L0xx) || \
228-
defined (STM32L1xx) || defined (STM32L4xx) || defined (STM32WBxx)
250+
defined (STM32G0xx) || defined (STM32G4xx) || \
251+
defined (STM32L4xx) || defined (STM32WBxx)
229252
uint32_t pageError = 0;
230253
uint64_t data = 0;
231254

@@ -243,38 +266,20 @@ void eeprom_buffer_flush(void)
243266
EraseInitStruct.NbPages = 1;
244267

245268
if (HAL_FLASH_Unlock() == HAL_OK) {
246-
#if defined(STM32L0xx)
247-
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \
248-
FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_RDERR | \
249-
FLASH_FLAG_FWWERR | FLASH_FLAG_NOTZEROERR);
250-
#elif defined(STM32L1xx)
251-
#if defined(FLASH_SR_RDERR)
252-
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \
253-
FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_RDERR);
254-
#else
255-
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \
256-
FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR);
257-
#endif
258-
#elif defined (STM32G0xx) || defined (STM32G4xx) || defined (STM32L4xx) || \
269+
#if defined (STM32G0xx) || defined (STM32G4xx) || defined (STM32L4xx) || \
259270
defined (STM32WBxx)
260271
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS);
261272
#else
262273
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR);
263274
#endif
264275
if (HAL_FLASHEx_Erase(&EraseInitStruct, &pageError) == HAL_OK) {
265276
while (address <= address_end) {
266-
#if defined(STM32L0xx) || defined(STM32L1xx)
267-
memcpy(&data, eeprom_buffer + offset, sizeof(uint32_t));
268-
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data) == HAL_OK) {
269-
address += 4;
270-
offset += 4;
271-
#else
277+
272278
data = *((uint64_t *)((uint8_t *)eeprom_buffer + offset));
273279

274280
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, address, data) == HAL_OK) {
275281
address += 8;
276282
offset += 8;
277-
#endif
278283
} else {
279284
address = address_end + 1;
280285
}
@@ -326,6 +331,8 @@ void eeprom_buffer_flush(void)
326331

327332
#endif /* defined(EEPROM_RETRAM_MODE) */
328333

334+
#endif /* ! DATA_EEPROM_BASE */
335+
329336
#ifdef __cplusplus
330337
}
331338
#endif

0 commit comments

Comments
 (0)