Skip to content

Commit 7dcb130

Browse files
Fixes for STM32H7 & STM32G0B1 devices
- Fixed flash lock for STM32H7 dual bank devices - Fixed flash erase issue on STM32G0B1 (Closes #1321)
1 parent 509d60e commit 7dcb130

File tree

2 files changed

+13
-17
lines changed

2 files changed

+13
-17
lines changed

src/stlink-lib/calculate.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ uint32_t calculate_L4_page(stlink_t *sl, uint32_t flashaddr) {
6666
if (sl->chip_id == STM32_CHIPID_L4 ||
6767
sl->chip_id == STM32_CHIPID_L496x_L4A6x ||
6868
sl->chip_id == STM32_CHIPID_L4Rx) {
69-
// this chip use dual banked flash
69+
// these chips use dual bank flash
7070
if (flashopt & (uint32_t)(1lu << FLASH_L4_OPTR_DUALBANK)) {
7171
uint32_t banksize = sl->flash_size / 2;
7272

src/stlink-lib/common_flash.c

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,11 @@ void lock_flash(stlink_t *sl) {
101101
cr_lock_shift = FLASH_Gx_CR_LOCK;
102102
} else if (sl->flash_type == STM32_FLASH_TYPE_H7) {
103103
cr_reg = FLASH_H7_CR1;
104+
if (sl->chip_flags & CHIP_F_HAS_DUAL_BANK) {
105+
cr2_reg = FLASH_H7_CR2;
106+
}
107+
cr_lock_shift = FLASH_H7_CR_LOCK;
108+
cr_mask = ~(1u << FLASH_H7_CR_SER);
104109
} else if (sl->flash_type == STM32_FLASH_TYPE_L0_L1) {
105110
cr_reg = get_stm32l0_flash_base(sl) + FLASH_PECR_OFF;
106111
cr_lock_shift = FLASH_L0_PELOCK;
@@ -113,11 +118,6 @@ void lock_flash(stlink_t *sl) {
113118
} else if (sl->flash_type == STM32_FLASH_TYPE_WB_WL) {
114119
cr_reg = FLASH_WB_CR;
115120
cr_lock_shift = FLASH_WB_CR_LOCK;
116-
if (sl->chip_flags & CHIP_F_HAS_DUAL_BANK) {
117-
cr2_reg = FLASH_H7_CR2;
118-
}
119-
cr_lock_shift = FLASH_H7_CR_LOCK;
120-
cr_mask = ~(1u << FLASH_H7_CR_SER);
121121
} else {
122122
ELOG("unsupported flash method, abort\n");
123123
return;
@@ -1014,11 +1014,7 @@ int32_t stlink_erase_flash_page(stlink_t *sl, stm32_addr_t flashaddr) {
10141014
unlock_flash_if(sl);
10151015

10161016
// select the page to erase
1017-
if ((sl->chip_id == STM32_CHIPID_L4) ||
1018-
(sl->chip_id == STM32_CHIPID_L43x_L44x) ||
1019-
(sl->chip_id == STM32_CHIPID_L45x_L46x) ||
1020-
(sl->chip_id == STM32_CHIPID_L496x_L4A6x) ||
1021-
(sl->chip_id == STM32_CHIPID_L4Rx)) {
1017+
if (sl->flash_type == STM32_FLASH_TYPE_L4) {
10221018
// calculate the actual bank+page from the address
10231019
uint32_t page = calculate_L4_page(sl, flashaddr);
10241020

@@ -1121,16 +1117,16 @@ int32_t stlink_erase_flash_page(stlink_t *sl, stm32_addr_t flashaddr) {
11211117
if (sl->flash_type == STM32_FLASH_TYPE_G0) {
11221118
uint32_t flash_page = ((flashaddr - STM32_FLASH_BASE) / sl->flash_pgsz);
11231119
stlink_read_debug32(sl, FLASH_Gx_CR, &val);
1124-
// sec 3.7.5 - PNB[5:0] is offset by 3. PER is 0x2.
1125-
val &= ~(0x3F << 3);
1126-
val |= ((flash_page & 0x3F) << 3) | (1 << FLASH_CR_PER);
1120+
// sec 3.7.5 - PNB[9:0] is offset by 3. PER is 0x2.
1121+
val &= ~(0x3FF << 3);
1122+
val |= ((flash_page & 0x3FF) << 3) | (1 << FLASH_CR_PER);
11271123
stlink_write_debug32(sl, FLASH_Gx_CR, val);
11281124
} else if (sl->flash_type == STM32_FLASH_TYPE_G4) {
11291125
uint32_t flash_page = ((flashaddr - STM32_FLASH_BASE) / sl->flash_pgsz);
11301126
stlink_read_debug32(sl, FLASH_Gx_CR, &val);
1131-
// sec 3.7.5 - PNB[6:0] is offset by 3. PER is 0x2.
1132-
val &= ~(0x7F << 3);
1133-
val |= ((flash_page & 0x7F) << 3) | (1 << FLASH_CR_PER);
1127+
// sec 3.7.5 - PNB[9:0] is offset by 3. PER is 0x2.
1128+
val &= ~(0x7FF << 3);
1129+
val |= ((flash_page & 0x7FF) << 3) | (1 << FLASH_CR_PER);
11341130
stlink_write_debug32(sl, FLASH_Gx_CR, val);
11351131
// STM32L5x2xx has two banks with 2k pages or single with 4k pages
11361132
// STM32H5xx, STM32U535, STM32U545, STM32U575 or STM32U585 have 2 banks with 8k pages

0 commit comments

Comments
 (0)