@@ -66,12 +66,15 @@ typedef struct {
66
66
67
67
#if defined(STM32F0 )
68
68
69
- static const flash_layout_t flash_layout [] = {
70
- { FLASH_BASE , FLASH_PAGE_SIZE , (FLASH_BANK1_END + 1 - FLASH_BASE ) / FLASH_PAGE_SIZE },
71
- };
69
+ #define FLASH_LAYOUT_IS_HOMOGENEOUS (1)
70
+ #define FLASH_LAYOUT_START_ADDR (FLASH_BASE)
71
+ #define FLASH_LAYOUT_SECTOR_SIZE (FLASH_PAGE_SIZE)
72
+ #define FLASH_LAYOUT_NUM_SECTORS ((FLASH_BANK1_END + 1 - FLASH_BASE) / FLASH_PAGE_SIZE)
72
73
73
74
#elif defined(STM32F4 )
74
75
76
+ #define FLASH_LAYOUT_IS_HOMOGENEOUS (0)
77
+
75
78
static const flash_layout_t flash_layout [] = {
76
79
{ 0x08000000 , 0x04000 , 4 },
77
80
{ 0x08010000 , 0x10000 , 1 },
@@ -88,6 +91,8 @@ static const flash_layout_t flash_layout[] = {
88
91
89
92
#elif defined(STM32F7 )
90
93
94
+ #define FLASH_LAYOUT_IS_HOMOGENEOUS (0)
95
+
91
96
// FLASH_FLAG_PGSERR (Programming Sequence Error) was renamed to
92
97
// FLASH_FLAG_ERSERR (Erasing Sequence Error) in STM32F7
93
98
#define FLASH_FLAG_PGSERR FLASH_FLAG_ERSERR
@@ -113,27 +118,31 @@ static const flash_layout_t flash_layout[] = {
113
118
114
119
#elif defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32L0 ) || defined(STM32L4 ) || defined(STM32WB ) || defined(STM32WL )
115
120
116
- static const flash_layout_t flash_layout [] = {
117
- { (uint32_t )FLASH_BASE , (uint32_t )FLASH_PAGE_SIZE , 512 },
118
- };
121
+ #define FLASH_LAYOUT_IS_HOMOGENEOUS (1)
122
+ #define FLASH_LAYOUT_START_ADDR (FLASH_BASE)
123
+ #define FLASH_LAYOUT_SECTOR_SIZE (FLASH_PAGE_SIZE)
124
+ #define FLASH_LAYOUT_NUM_SECTORS (512)
119
125
120
126
#elif defined(STM32L1 )
121
127
122
- static const flash_layout_t flash_layout [] = {
123
- { (uint32_t )FLASH_BASE , 0x200 , 1024 },
124
- };
128
+ #define FLASH_LAYOUT_IS_HOMOGENEOUS (1)
129
+ #define FLASH_LAYOUT_START_ADDR (FLASH_BASE)
130
+ #define FLASH_LAYOUT_SECTOR_SIZE (0x200)
131
+ #define FLASH_LAYOUT_NUM_SECTORS (1024)
125
132
126
133
#elif defined(STM32H5 )
127
134
128
- static const flash_layout_t flash_layout [] = {
129
- { 0x08000000 , 8192 , 256 },
130
- };
135
+ #define FLASH_LAYOUT_IS_HOMOGENEOUS (1)
136
+ #define FLASH_LAYOUT_START_ADDR (FLASH_BASE_NS)
137
+ #define FLASH_LAYOUT_SECTOR_SIZE (0x2000)
138
+ #define FLASH_LAYOUT_NUM_SECTORS (256)
131
139
132
140
#elif defined(STM32H7 )
133
141
134
- static const flash_layout_t flash_layout [] = {
135
- { 0x08000000 , 0x20000 , 16 },
136
- };
142
+ #define FLASH_LAYOUT_IS_HOMOGENEOUS (1)
143
+ #define FLASH_LAYOUT_START_ADDR (FLASH_BASE)
144
+ #define FLASH_LAYOUT_SECTOR_SIZE (0x20000)
145
+ #define FLASH_LAYOUT_NUM_SECTORS (16)
137
146
138
147
#else
139
148
#error Unsupported processor
@@ -156,14 +165,14 @@ static uint32_t get_bank(uint32_t addr) {
156
165
if (READ_BIT (SYSCFG -> MEMRMP , SYSCFG_MEMRMP_FB_MODE ) == 0 ) {
157
166
#endif
158
167
// no bank swap
159
- if (addr < (FLASH_BASE + FLASH_BANK_SIZE )) {
168
+ if (addr < (FLASH_LAYOUT_START_ADDR + FLASH_BANK_SIZE )) {
160
169
return FLASH_BANK_1 ;
161
170
} else {
162
171
return FLASH_BANK_2 ;
163
172
}
164
173
} else {
165
174
// bank swap
166
- if (addr < (FLASH_BASE + FLASH_BANK_SIZE )) {
175
+ if (addr < (FLASH_LAYOUT_START_ADDR + FLASH_BANK_SIZE )) {
167
176
return FLASH_BANK_2 ;
168
177
} else {
169
178
return FLASH_BANK_1 ;
@@ -174,31 +183,31 @@ static uint32_t get_bank(uint32_t addr) {
174
183
#if (defined(STM32L4 ) && defined(SYSCFG_MEMRMP_FB_MODE ))
175
184
// get the page of a given flash address
176
185
static uint32_t get_page (uint32_t addr ) {
177
- if (addr < (FLASH_BASE + FLASH_BANK_SIZE )) {
186
+ if (addr < (FLASH_LAYOUT_START_ADDR + FLASH_BANK_SIZE )) {
178
187
// bank 1
179
- return (addr - FLASH_BASE ) / FLASH_PAGE_SIZE ;
188
+ return (addr - FLASH_LAYOUT_START_ADDR ) / FLASH_LAYOUT_SECTOR_SIZE ;
180
189
} else {
181
190
// bank 2
182
- return (addr - (FLASH_BASE + FLASH_BANK_SIZE )) / FLASH_PAGE_SIZE ;
191
+ return (addr - (FLASH_LAYOUT_START_ADDR + FLASH_BANK_SIZE )) / FLASH_LAYOUT_SECTOR_SIZE ;
183
192
}
184
193
}
185
194
#endif
186
195
187
196
#elif (defined(STM32L4 ) && !defined(SYSCFG_MEMRMP_FB_MODE )) || defined(STM32WB ) || defined(STM32WL )
188
197
189
198
static uint32_t get_page (uint32_t addr ) {
190
- return (addr - FLASH_BASE ) / FLASH_PAGE_SIZE ;
199
+ return (addr - FLASH_LAYOUT_START_ADDR ) / FLASH_LAYOUT_SECTOR_SIZE ;
191
200
}
192
201
193
202
#elif defined(STM32G0 ) || defined(STM32G4 )
194
203
195
204
static uint32_t get_page (uint32_t addr ) {
196
- return (addr - FLASH_BASE ) / FLASH_PAGE_SIZE ;
205
+ return (addr - FLASH_LAYOUT_START_ADDR ) / FLASH_LAYOUT_SECTOR_SIZE ;
197
206
}
198
207
199
208
static uint32_t get_bank (uint32_t addr ) {
200
209
// no bank swap
201
- if (addr < (FLASH_BASE + FLASH_BANK_SIZE )) {
210
+ if (addr < (FLASH_LAYOUT_START_ADDR + FLASH_BANK_SIZE )) {
202
211
return FLASH_BANK_1 ;
203
212
} else {
204
213
#if defined(FLASH_OPTR_DBANK )
@@ -212,13 +221,33 @@ static uint32_t get_bank(uint32_t addr) {
212
221
#endif
213
222
214
223
bool flash_is_valid_addr (uint32_t addr ) {
224
+ #if FLASH_LAYOUT_IS_HOMOGENEOUS
225
+ uint32_t base = FLASH_LAYOUT_START_ADDR ;
226
+ uint32_t end_of_flash = FLASH_LAYOUT_START_ADDR + FLASH_LAYOUT_NUM_SECTORS * FLASH_LAYOUT_SECTOR_SIZE ;
227
+ #else
228
+ uint32_t base = flash_layout [0 ].base_address ;
215
229
uint8_t last = MP_ARRAY_SIZE (flash_layout ) - 1 ;
216
230
uint32_t end_of_flash = flash_layout [last ].base_address +
217
231
flash_layout [last ].sector_count * flash_layout [last ].sector_size ;
218
- return flash_layout [0 ].base_address <= addr && addr < end_of_flash ;
232
+ #endif
233
+ return base <= addr && addr < end_of_flash ;
219
234
}
220
235
221
236
int32_t flash_get_sector_info (uint32_t addr , uint32_t * start_addr , uint32_t * size ) {
237
+ #if FLASH_LAYOUT_IS_HOMOGENEOUS
238
+ if (addr >= FLASH_LAYOUT_START_ADDR ) {
239
+ uint32_t sector_index = (addr - FLASH_LAYOUT_START_ADDR ) / FLASH_LAYOUT_SECTOR_SIZE ;
240
+ if (sector_index < FLASH_LAYOUT_NUM_SECTORS ) {
241
+ if (start_addr != NULL ) {
242
+ * start_addr = FLASH_LAYOUT_START_ADDR + sector_index * FLASH_LAYOUT_SECTOR_SIZE ;
243
+ }
244
+ if (size != NULL ) {
245
+ * size = FLASH_LAYOUT_SECTOR_SIZE ;
246
+ }
247
+ return sector_index ;
248
+ }
249
+ }
250
+ #else
222
251
if (addr >= flash_layout [0 ].base_address ) {
223
252
uint32_t sector_index = 0 ;
224
253
for (int i = 0 ; i < MP_ARRAY_SIZE (flash_layout ); ++ i ) {
@@ -239,6 +268,7 @@ int32_t flash_get_sector_info(uint32_t addr, uint32_t *start_addr, uint32_t *siz
239
268
}
240
269
}
241
270
}
271
+ #endif
242
272
return -1 ;
243
273
}
244
274
0 commit comments