@@ -101,6 +101,11 @@ void lock_flash(stlink_t *sl) {
101
101
cr_lock_shift = FLASH_Gx_CR_LOCK ;
102
102
} else if (sl -> flash_type == STM32_FLASH_TYPE_H7 ) {
103
103
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 );
104
109
} else if (sl -> flash_type == STM32_FLASH_TYPE_L0_L1 ) {
105
110
cr_reg = get_stm32l0_flash_base (sl ) + FLASH_PECR_OFF ;
106
111
cr_lock_shift = FLASH_L0_PELOCK ;
@@ -113,11 +118,6 @@ void lock_flash(stlink_t *sl) {
113
118
} else if (sl -> flash_type == STM32_FLASH_TYPE_WB_WL ) {
114
119
cr_reg = FLASH_WB_CR ;
115
120
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 );
121
121
} else {
122
122
ELOG ("unsupported flash method, abort\n" );
123
123
return ;
@@ -1014,11 +1014,7 @@ int32_t stlink_erase_flash_page(stlink_t *sl, stm32_addr_t flashaddr) {
1014
1014
unlock_flash_if (sl );
1015
1015
1016
1016
// 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 ) {
1022
1018
// calculate the actual bank+page from the address
1023
1019
uint32_t page = calculate_L4_page (sl , flashaddr );
1024
1020
@@ -1121,16 +1117,16 @@ int32_t stlink_erase_flash_page(stlink_t *sl, stm32_addr_t flashaddr) {
1121
1117
if (sl -> flash_type == STM32_FLASH_TYPE_G0 ) {
1122
1118
uint32_t flash_page = ((flashaddr - STM32_FLASH_BASE ) / sl -> flash_pgsz );
1123
1119
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 );
1127
1123
stlink_write_debug32 (sl , FLASH_Gx_CR , val );
1128
1124
} else if (sl -> flash_type == STM32_FLASH_TYPE_G4 ) {
1129
1125
uint32_t flash_page = ((flashaddr - STM32_FLASH_BASE ) / sl -> flash_pgsz );
1130
1126
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 );
1134
1130
stlink_write_debug32 (sl , FLASH_Gx_CR , val );
1135
1131
// STM32L5x2xx has two banks with 2k pages or single with 4k pages
1136
1132
// STM32H5xx, STM32U535, STM32U545, STM32U575 or STM32U585 have 2 banks with 8k pages
0 commit comments