Skip to content

Commit 3c258a1

Browse files
Merge pull request stlink-org#1266 from trabucayre/fix_l1_regs
Fixed flash, dbgmcu and rcc registers for STM32L1.
2 parents a32f2c5 + c94b74e commit 3c258a1

File tree

5 files changed

+39
-8
lines changed

5 files changed

+39
-8
lines changed

inc/stm32.h

+7
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,10 @@ enum stm32_chipids {
167167
#define STM32L0_DBGMCU_APB1_FZ_WWDG_STOP 11
168168
#define STM32L0_DBGMCU_APB1_FZ_IWDG_STOP 12
169169

170+
#define STM32L1_DBGMCU_APB1_FZ 0xE0042008
171+
#define STM32L1_DBGMCU_APB1_FZ_WWDG_STOP 11
172+
#define STM32L1_DBGMCU_APB1_FZ_IWDG_STOP 12
173+
170174
#define STM32H7_DBGMCU_APB1HFZ 0x5C001054
171175
#define STM32H7_DBGMCU_APB1HFZ_IWDG_STOP 18
172176

@@ -189,6 +193,9 @@ enum stm32_chipids {
189193
#define STM32L0_RCC_AHBENR 0x40021030
190194
#define STM32L0_RCC_DMAEN 0x00000001 // DMAEN
191195

196+
#define STM32L1_RCC_AHBENR 0x4002381C
197+
#define STM32L1_RCC_DMAEN 0x30000000 // DMA2EN | DMA1EN
198+
192199
#define STM32H7_RCC_AHB1ENR 0x58024538
193200
#define STM32H7_RCC_DMAEN 0x00000003 // DMA2EN | DMA1EN
194201

inc/stm32flash.h

+4
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,10 @@
219219
#define STM32L0_FLASH_SR_PGAERR 9
220220
#define STM32L0_FLASH_SR_NOTZEROERR 16
221221

222+
#define STM32L1_FLASH_SR_ERROR_MASK 0x00003F00
223+
#define STM32L1_FLASH_SR_WRPERR 8
224+
#define STM32L1_FLASH_SR_PGAERR 9
225+
222226
#define FLASH_ACR_OFF ((uint32_t)0x00)
223227
#define FLASH_PECR_OFF ((uint32_t)0x04)
224228
#define FLASH_PDKEYR_OFF ((uint32_t)0x08)

src/common.c

+9-3
Original file line numberDiff line numberDiff line change
@@ -991,9 +991,15 @@ static void stop_wdg_in_debug(stlink_t *sl) {
991991
break;
992992
case STM32_FLASH_TYPE_L0_L1:
993993
case STM32_FLASH_TYPE_G0:
994-
dbgmcu_cr = STM32L0_DBGMCU_APB1_FZ;
995-
set = (1 << STM32L0_DBGMCU_APB1_FZ_IWDG_STOP) |
996-
(1 << STM32L0_DBGMCU_APB1_FZ_WWDG_STOP);
994+
if (get_stm32l0_flash_base(sl) == STM32L_FLASH_REGS_ADDR) {
995+
dbgmcu_cr = STM32L1_DBGMCU_APB1_FZ;
996+
set = (1 << STM32L1_DBGMCU_APB1_FZ_IWDG_STOP) |
997+
(1 << STM32L1_DBGMCU_APB1_FZ_WWDG_STOP);
998+
} else {
999+
dbgmcu_cr = STM32L0_DBGMCU_APB1_FZ;
1000+
set = (1 << STM32L0_DBGMCU_APB1_FZ_IWDG_STOP) |
1001+
(1 << STM32L0_DBGMCU_APB1_FZ_WWDG_STOP);
1002+
}
9971003
break;
9981004
case STM32_FLASH_TYPE_H7:
9991005
dbgmcu_cr = STM32H7_DBGMCU_APB1HFZ;

src/common_flash.c

+12-3
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,11 @@ void clear_flash_error(stlink_t *sl) {
156156
write_flash_sr(sl, BANK_1, STM32Gx_FLASH_SR_ERROR_MASK);
157157
break;
158158
case STM32_FLASH_TYPE_L0_L1:
159-
write_flash_sr(sl, BANK_1, STM32L0_FLASH_SR_ERROR_MASK);
159+
if (get_stm32l0_flash_base(sl) == STM32L_FLASH_REGS_ADDR) {
160+
write_flash_sr(sl, BANK_1, STM32L1_FLASH_SR_ERROR_MASK);
161+
} else {
162+
write_flash_sr(sl, BANK_1, STM32L0_FLASH_SR_ERROR_MASK);
163+
}
160164
break;
161165
case STM32_FLASH_TYPE_L4_L4P:
162166
write_flash_sr(sl, BANK_1, STM32L4_FLASH_SR_ERROR_MASK);
@@ -282,9 +286,14 @@ int check_flash_error(stlink_t *sl) {
282286
PGAERR = (1 << STM32Gx_FLASH_SR_PGAERR);
283287
break;
284288
case STM32_FLASH_TYPE_L0_L1:
285-
res = read_flash_sr(sl, BANK_1) & STM32L0_FLASH_SR_ERROR_MASK;
289+
res = read_flash_sr(sl, BANK_1);
290+
if (get_stm32l0_flash_base(sl) == STM32L_FLASH_REGS_ADDR) {
291+
res &= STM32L1_FLASH_SR_ERROR_MASK;
292+
} else {
293+
res &= STM32L0_FLASH_SR_ERROR_MASK;
294+
PROGERR = (1 << STM32L0_FLASH_SR_NOTZEROERR);
295+
}
286296
WRPERR = (1 << STM32L0_FLASH_SR_WRPERR);
287-
PROGERR = (1 << STM32L0_FLASH_SR_NOTZEROERR);
288297
PGAERR = (1 << STM32L0_FLASH_SR_PGAERR);
289298
break;
290299
case STM32_FLASH_TYPE_L4_L4P:

src/flashloader.c

+7-2
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,13 @@ static void set_dma_state(stlink_t *sl, flash_loader_t *fl, int bckpRstr) {
127127
rcc_dma_mask = STM32G4_RCC_DMAEN;
128128
break;
129129
case STM32_FLASH_TYPE_L0_L1:
130-
rcc = STM32L0_RCC_AHBENR;
131-
rcc_dma_mask = STM32L0_RCC_DMAEN;
130+
if (get_stm32l0_flash_base(sl) == STM32L_FLASH_REGS_ADDR) {
131+
rcc = STM32L1_RCC_AHBENR;
132+
rcc_dma_mask = STM32L1_RCC_DMAEN;
133+
} else {
134+
rcc = STM32L0_RCC_AHBENR;
135+
rcc_dma_mask = STM32L0_RCC_DMAEN;
136+
}
132137
break;
133138
case STM32_FLASH_TYPE_H7:
134139
rcc = STM32H7_RCC_AHB1ENR;

0 commit comments

Comments
 (0)