Default linker script fails on STM32L412 - fix included


#1

I’ve been able to get a test blink working on a Nucleo-L412KB (that’s the 32-pin variant, not the 64-pin Nucleo’s). But it took a little tinkering.

First, the default linker script can’t be used, because it sets the stack at 64K, whereas the L412 has 40K max. I changed _estack in framework-stm32cube/platformio/ldscripts/STM32L412KB_DEFAULT.ld to work around this.

Next, stlink does not recognise the L412, which has ID 0x464. This was fixed by building a patched version of texane/stlink on GitHub:

$ git diff
diff --git a/src/chipid.c b/src/chipid.c
index 6f93af1..ca6e815 100644
--- a/src/chipid.c
+++ b/src/chipid.c
@@ -507,6 +507,19 @@ static const struct stlink_chipid_params devices[] = {
             .bootrom_base = 0x1ff00000,
             .bootrom_size = 0x2000
         },
+        {
+            // STM32L41X
+            .chip_id = STLINK_CHIPID_STM32_L41X,
+            .description = "L412 device",
+            .flash_type = STLINK_FLASH_TYPE_L4,
+            .flash_size_reg = 0x1fff75e0,    // "Flash size data register" (sec 49.2, page 1809)
+            .flash_pagesize = 0x800,         // Page erase (2 Kbyte) (sec 3.2, page 93)
+            // SRAM1 is 32k at 0x20000000
+            // SRAM2 is 8k at 0x20008000
+            .sram_size = 0x0A000,
+            .bootrom_base = 0x1fff0000,
+            .bootrom_size = 0x7000
+        },
         {
             // unknown
             .chip_id = STLINK_CHIPID_UNKNOWN,
diff --git a/src/flash_loader.c b/src/flash_loader.c
index 7684680..f2e6367 100644
--- a/src/flash_loader.c
+++ b/src/flash_loader.c
@@ -306,6 +306,7 @@ int stlink_flash_loader_write_to_sram(stlink_t *sl, stm32_addr_t* addr, size_t*
         loader_code = loader_code_stm32f0;
         loader_size = sizeof(loader_code_stm32f0);
     } else if ((sl->chip_id == STLINK_CHIPID_STM32_L4) ||
+              (sl->chip_id == STLINK_CHIPID_STM32_L41X) ||
               (sl->chip_id == STLINK_CHIPID_STM32_L43X) ||
               (sl->chip_id == STLINK_CHIPID_STM32_L46X) ||
               (sl->chip_id == STLINK_CHIPID_STM32_L4RX) ||

The openocd scripts also don’t appear to support the L412 (yet, I hope). The workaround for now (if you don’t patch stlink) is to use mbed as upload protocol.

UPDATE: I’ve also submitted a board file for the Nucleo-L412KB - see https://github.com/platformio/platform-ststm32/issues/171

UPDATE # 2: also reported as stlink issue - see https://github.com/texane/stlink/issues/754