Skip to content

Commit f3fcaf2

Browse files
Merge pull request #1330 from andars/fix-some-stm32l0-flashing-issues
Fixed some flashing issues on STM32L0.
2 parents 99925c6 + 1861b8d commit f3fcaf2

File tree

4 files changed

+15
-11
lines changed

4 files changed

+15
-11
lines changed

flashloaders/Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ stm32f0.o: stm32f0.s
3030
stm32vl.o: stm32f0.s
3131
$(CC) stm32f0.s $(CFLAGS_ARMV7_M) -o stm32vl.o
3232

33+
# separate rule for STM32Lx.
34+
# Built for ARMv6-M target to be compatible with both Cortex M0 and Cortex M3.
35+
stm32lx.o: stm32lx.s
36+
$(CC) stm32lx.s $(CFLAGS_ARMV6_M) -o stm32lx.o
37+
3338
# generic rule for all other ARMv7-M
3439
%.o: %.s
3540
$(CC) $< $(CFLAGS_ARMV7_M) -o $@

flashloaders/stm32lx.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ loop:
1717
str r4, [r1]
1818

1919
# increment address
20-
add r0, r0, #4
21-
add r1, r1, #4
20+
adds r0, r0, #4
21+
adds r1, r1, #4
2222

2323
# loop if count > 0
2424
subs r2, r2, #4

src/stlink-lib/flash_loader.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ static const uint8_t loader_code_stm32f0[] = {
6868
0x14, 0x00, 0x00, 0x00
6969
};
7070

71-
// flashloaders/stm32lx.s
71+
// flashloaders/stm32lx.s -- compiled for armv6-m for compatibility with both
72+
// armv6-m cores (STM32L0) and armv7-m cores (STM32L1)
7273
static const uint8_t loader_code_stm32lx[] = {
7374
0x04, 0x68, 0x0c, 0x60,
74-
0x00, 0xf1, 0x04, 0x00,
75-
0x01, 0xf1, 0x04, 0x01,
76-
0x04, 0x3a, 0xf7, 0xdc,
75+
0x04, 0x30, 0x04, 0x31,
76+
0x04, 0x3a, 0xf9, 0xdc,
7777
0x00, 0xbe, 0x00, 0x00
7878
};
7979

@@ -428,12 +428,11 @@ int32_t stlink_flash_loader_run(stlink_t *sl, flash_loader_t* fl, stm32_addr_t t
428428
#define L1_WRITE_BLOCK_SIZE 0x80
429429
#define L0_WRITE_BLOCK_SIZE 0x40
430430

431-
int32_t stm32l1_write_half_pages(stlink_t *sl, stm32_addr_t addr, uint8_t *base, uint32_t len, uint32_t pagesize) {
431+
int32_t stm32l1_write_half_pages(stlink_t *sl, flash_loader_t *fl, stm32_addr_t addr, uint8_t *base, uint32_t len, uint32_t pagesize) {
432432
uint32_t count, off;
433433
uint32_t num_half_pages = len / pagesize;
434434
uint32_t val;
435435
uint32_t flash_regs_base = get_stm32l0_flash_base(sl);
436-
flash_loader_t fl;
437436
bool use_loader = true;
438437
int32_t ret = 0;
439438

@@ -448,7 +447,7 @@ int32_t stm32l1_write_half_pages(stlink_t *sl, stm32_addr_t addr, uint8_t *base,
448447

449448
for (count = 0; count < num_half_pages; count++) {
450449
if (use_loader) {
451-
ret = stlink_flash_loader_run(sl, &fl, addr + count * pagesize, base + count * pagesize, pagesize);
450+
ret = stlink_flash_loader_run(sl, fl, addr + count * pagesize, base + count * pagesize, pagesize);
452451
if (ret && count == 0) {
453452
/* It seems that stm32lx devices have a problem when it is blank */
454453
WLOG("Failed to use flash loader, fallback to soft write\n");
@@ -770,7 +769,7 @@ int32_t stlink_flashloader_write(stlink_t *sl, flash_loader_t *fl, stm32_addr_t
770769
off = 0;
771770

772771
if (len > pagesize) {
773-
if (stm32l1_write_half_pages(sl, addr, base, len, pagesize)) {
772+
if (stm32l1_write_half_pages(sl, fl, addr, base, len, pagesize)) {
774773
return (-1);
775774
} else {
776775
off = (size_t)(len / pagesize) * pagesize;

src/stlink-lib/flash_loader.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ int32_t stlink_flash_loader_run(stlink_t *sl, flash_loader_t* fl, stm32_addr_t t
1818

1919
/* === Functions from old header file flashloader.h === */
2020

21-
int32_t stm32l1_write_half_pages(stlink_t *sl, stm32_addr_t addr, uint8_t *base, uint32_t len, uint32_t pagesize);
21+
int32_t stm32l1_write_half_pages(stlink_t *sl, flash_loader_t *fl, stm32_addr_t addr, uint8_t *base, uint32_t len, uint32_t pagesize);
2222
// static void set_flash_cr_pg(stlink_t *sl, uint32_t bank);
2323
// static void set_dma_state(stlink_t *sl, flash_loader_t *fl, int32_t bckpRstr);
2424
int32_t stlink_flashloader_start(stlink_t *sl, flash_loader_t *fl);

0 commit comments

Comments
 (0)