8000 stm32/flash: Simplify sector calculation for homogeneous flash layout. · pimoroni/micropython@cf11591 · GitHub
[go: up one dir, main page]

Skip to content

Commit cf11591

Browse files
committed
stm32/flash: Simplify sector calculation for homogeneous flash layout.
Newer STM32 parts have homogeneous flash layout, and in this case the MCU configuration and page/sector calculation can be simplified. The affected functions are `flash_is_valid_addr()` and `flash_get_sector_info()`, which are now simpler for homogeneous flash. Signed-off-by: Damien George <damien@micropython.org>
1 parent cd0f750 commit cf11591

File tree

1 file changed

+54
-24
lines changed

1 file changed

+54
-24
lines changed

ports/stm32/flash.c

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,15 @@ typedef struct {
6666

6767
#if defined(STM32F0)
6868

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)
7273

7374
#elif defined(STM32F4)
7475

76+
#define FLASH_LAYOUT_IS_HOMOGENEOUS (0)
77+
7578
static const flash_layout_t flash_layout[] = {
7679
{ 0x08000000, 0x04000, 4 },
7780
{ 0x08010000, 0x10000, 1 },
@@ -88,6 +91,8 @@ static const flash_layout_t flash_layout[] = {
8891

8992
#elif defined(STM32F7)
9093

94+
#define FLASH_LAYOUT_IS_HOMOGENEOUS (0)
95+
9196
// FLASH_FLAG_PGSERR (Programming Sequence Error) was renamed to
9297
// FLASH_FLAG_ERSERR (Erasing Sequence Error) in STM32F7
9398
#define FLASH_FLAG_PGSERR FLASH_FLAG_ERSERR
@@ -113,27 +118,31 @@ static const flash_layout_t flash_layout[] = {
113118

114119
#elif defined(STM32G0) || defined(STM32G4) || defined(STM32L0) || defined(STM32L4) || defined(STM32WB) || defined(STM32WL)
115120

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)
119125

120126
#elif defined(STM32L1)
121127

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)
125132

126133
#elif defined(STM32H5)
127134

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)
131139

132140
#elif defined(STM32H7)
133141

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)
137146

138147
#else
139148
#error Unsupported processor
@@ -156,14 +165,14 @@ static uint32_t get_bank(uint32_t addr) {
156165
if (READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_FB_MODE) == 0) {
157166
#endif
158167
// no bank swap
159-
if (addr < (FLASH_BASE + FLASH_BANK_SIZE)) {
168+
if (addr < (FLASH_LAYOUT_START_ADDR + FLASH_BANK_SIZE)) {
160169
return FLASH_BANK_1;
161170
} else {
162171
return FLASH_BANK_2;
163172
}
164173
} else {
165174
// bank swap
166-
if (addr < (FLASH_BASE + FLASH_BANK_SIZE)) {
175+
if (addr < (FLASH_LAYOUT_START_ADDR + FLASH_BANK_SIZE)) {
167176
return FLASH_BANK_2;
168177
} else {
169178
return FLASH_BANK_1;
@@ -174,31 +183,31 @@ static uint32_t get_bank(uint32_t addr) {
174183
#if (defined(STM32L4) && defined(SYSCFG_MEMRMP_FB_MODE))
175184
// get the page of a given flash address
176185
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)) {
178187
// bank 1
179-
return (addr - FLASH_BASE) / FLASH_PAGE_SIZE;
188+
return (addr - FLASH_LAYOUT_START_ADDR) / FLASH_LAYOUT_SECTOR_SIZE;
180189
} else {
181190
// 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;
183192
}
184193
}
185194
#endif
186195

187196
#elif (defined(STM32L4) && !defined(SYSCFG_MEMRMP_FB_MODE)) || defined(STM32WB) || defined(STM32WL)
188197

189198
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;
191200
}
192201

193202
#elif defined(STM32G0) || defined(STM32G4)
194203

195204
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;
197206
}
198207

199208
static uint32_t get_bank(uint32_t addr) {
200209
// no bank swap
201-
if (addr < (FLASH_BASE + FLASH_BANK_SIZE)) {
210+
if (addr < (FLASH_LAYOUT_START_ADDR + FLASH_BANK_SIZE)) {
202211
return FLASH_BANK_1;
203212
} else {
204213
#if defined(FLASH_OPTR_DBANK)
@@ -212,13 +221,33 @@ static uint32_t get_bank(uint32_t addr) {
212221
#endif
213222

214223
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;
215229
uint8_t last = MP_ARRAY_SIZE(flash_layout) - 1;
216230
uint32_t end_of_flash = flash_layout[last].base_address +
217231
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;
219234
}
220235

221236
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
222251
if (addr >= flash_layout[0].base_address) {
223252
uint32_t sector_index = 0;
224253
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
239268
}
240269
}
241270
}
271+
#endif
242272
return -1;
243273
}
244274

0 commit comments

Comments
 (0)
0