Skip to content

Commit 71becdc

Browse files
hshosesalkinium
andcommitted
[flash] STM32G4 flash erase dual bank BKER bit
Co-authored-by: Niklas Hauser <[email protected]>
1 parent 4c79529 commit 71becdc

File tree

2 files changed

+25
-9
lines changed

2 files changed

+25
-9
lines changed

src/modm/platform/flash/stm32/flash.cpp.in

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,21 @@ Flash::erase(uint8_t index)
9191
FLASH->CR = FLASH_CR_STRT | FLASH_CR_SER | uint32_t(size) |
9292
((index << FLASH_CR_SNB_Pos) & FLASH_CR_SNB_Msk);
9393
%% else
94-
%% if family in ["g0","g4"]
94+
%% if family in ["g0", "g4"]
95+
%% if dual_bank
96+
uint32_t cr = FLASH_CR_STRT | FLASH_CR_PER;
97+
uint32_t page = index;
98+
if (FLASH->OPTR & {{dual_bank}} and index >= (Size/2 >> 11))
99+
{
100+
// second bank index starts back at zero again
101+
page -= (Size/2 >> 11);
102+
cr |= FLASH_CR_BKER;
103+
}
104+
FLASH->CR = cr | ((page << FLASH_CR_PNB_Pos) & FLASH_CR_PNB_Msk);
105+
%% else
95106
FLASH->CR = FLASH_CR_STRT | FLASH_CR_PER |
96107
((index << FLASH_CR_PNB_Pos) & FLASH_CR_PNB_Msk);
108+
%% endif
97109
%% else
98110
FLASH->CR &= ~FLASH_CR_STRT;
99111
FLASH->CR |= FLASH_CR_PER;

src/modm/platform/flash/stm32/module.lb

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,26 +31,29 @@ def build(env):
3131
memories = listify(env[":target"].get_driver("core")["memory"])
3232
flash = next(filter(lambda m: m["name"] == "flash", memories))
3333

34+
dual_bank = False
3435
family = target.family
36+
busy_bit = "FLASH_SR_BSY"
37+
ftype = "page"
3538
if target.family in ["f4"]:
3639
block_shift = 17
3740
ftype = "sector"
38-
busy_bit = "FLASH_SR_BSY"
3941
elif target.family in ["f1"]:
4042
if target.name in ["05", "07"] or int(flash["size"]) >= 262144:
4143
block_shift = 11
4244
else:
4345
block_shift = 10
44-
ftype = "page"
45-
busy_bit = "FLASH_SR_BSY"
4646
elif target.family in ["g0"]:
47-
block_shift = 11
48-
ftype = "page"
4947
busy_bit = "FLASH_SR_BSY1"
48+
block_shift = 11
49+
if target.name[0] in ["b", "c"]:
50+
dual_bank = "FLASH_OPTR_DUAL_BANK"
5051
elif target.family in ["g4"]:
5152
block_shift = 11
52-
ftype = "page"
53-
busy_bit = "FLASH_SR_BSY"
53+
# Only Cat3 devices have dual bank, so g47x or g48x
54+
if target.name[0] in ["7", "8"]:
55+
dual_bank = "FLASH_OPTR_DBANK"
56+
block_shift = "(FLASH->OPTR & FLASH_OPTR_DBANK ? 11 : 12)"
5457

5558
env.substitutions = {
5659
"start": int(flash["start"], 16),
@@ -59,7 +62,8 @@ def build(env):
5962
"shift": block_shift,
6063
"has_sectors": ftype == "sector",
6164
"busy_bit": busy_bit,
62-
"family": family
65+
"family": family,
66+
"dual_bank": dual_bank
6367
}
6468
env.outbasepath = "modm/src/modm/platform/flash"
6569
env.template("flash.hpp.in")

0 commit comments

Comments
 (0)