Skip to content

Commit 0a447ac

Browse files
committed
STM32L4 baremetal support
1 parent ba7deb4 commit 0a447ac

File tree

38 files changed

+1386
-979
lines changed

38 files changed

+1386
-979
lines changed
Lines changed: 32 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,53 @@
11
#! armcc -E
22
; Scatter-Loading Description File
3-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4-
; Copyright (c) 2015, STMicroelectronics
5-
; All rights reserved.
63
;
7-
; Redistribution and use in source and binary forms, with or without
8-
; modification, are permitted provided that the following conditions are met:
9-
;
10-
; 1. Redistributions of source code must retain the above copyright notice,
11-
; this list of conditions and the following disclaimer.
12-
; 2. Redistributions in binary form must reproduce the above copyright notice,
13-
; this list of conditions and the following disclaimer in the documentation
14-
; and/or other materials provided with the distribution.
15-
; 3. Neither the name of STMicroelectronics nor the names of its contributors
16-
; may be used to endorse or promote products derived from this software
17-
; without specific prior written permission.
18-
;
19-
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20-
; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21-
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22-
; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23-
; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24-
; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25-
; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26-
; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27-
; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28-
; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4+
; SPDX-License-Identifier: BSD-3-Clause
5+
;******************************************************************************
6+
;* @attention
7+
;*
8+
;* Copyright (c) 2016-2020 STMicroelectronics.
9+
;* All rights reserved.
10+
;*
11+
;* This software component is licensed by ST under BSD 3-Clause license,
12+
;* the "License"; You may not use this file except in compliance with the
13+
;* License. You may obtain a copy of the License at:
14+
;* opensource.org/licenses/BSD-3-Clause
15+
;*
16+
;******************************************************************************
17+
18+
#include "../cmsis_nvic.h"
3019

3120
#if !defined(MBED_APP_START)
32-
#define MBED_APP_START 0x08000000
21+
#define MBED_APP_START MBED_ROM_START
3322
#endif
3423

3524
#if !defined(MBED_APP_SIZE)
36-
#define MBED_APP_SIZE 0x40000
25+
#define MBED_APP_SIZE MBED_ROM_SIZE
3726
#endif
3827

3928
#if !defined(MBED_BOOT_STACK_SIZE)
40-
#define MBED_BOOT_STACK_SIZE 0x400
29+
/* This value is normally defined by the tools to 0x1000 for bare metal and 0x400 for RTOS */
30+
#define MBED_BOOT_STACK_SIZE 0x400
4131
#endif
4232

43-
#define Stack_Size MBED_BOOT_STACK_SIZE
33+
/* Round up VECTORS_SIZE to 8 bytes */
34+
#define VECTORS_SIZE (((NVIC_NUM_VECTORS * 4) + 7) AND ~7)
4435

45-
; 256KB FLASH (0x40000) + 64KB SRAM (0x10000)
46-
LR_IROM1 MBED_APP_START MBED_APP_SIZE { ; load region size_region
36+
LR_IROM1 MBED_APP_START MBED_APP_SIZE {
37+
38+
ER_IROM1 MBED_APP_START MBED_APP_SIZE {
39+
*.o (RESET, +First)
40+
*(InRoot$$Sections)
41+
.ANY (+RO)
42+
}
4743

48-
ER_IROM1 MBED_APP_START MBED_APP_SIZE { ; load address = execution address
49-
*.o (RESET, +First)
50-
*(InRoot$$Sections)
51-
.ANY (+RO)
44+
RW_IRAM1 (MBED_RAM_START + VECTORS_SIZE) { ; RW data
45+
.ANY (+RW +ZI)
5246
}
5347

54-
; Total: 98 vectors = 392 bytes (0x188) to be reserved in RAM
55-
RW_IRAM1 (0x20000000+0x188) (0x00010000-0x188-Stack_Size) {
56-
.ANY (+RW +ZI)
48+
ARM_LIB_HEAP AlignExpr(+0, 16) EMPTY (MBED_RAM_START + MBED_RAM_SIZE + MBED_RAM1_SIZE - MBED_BOOT_STACK_SIZE - AlignExpr(ImageLimit(RW_IRAM1), 16)) { ; Heap growing up
5749
}
5850

59-
ARM_LIB_STACK (0x20000000+0x00010000) EMPTY -Stack_Size { ; stack
51+
ARM_LIB_STACK (MBED_RAM_START + MBED_RAM_SIZE + MBED_RAM1_SIZE) EMPTY -MBED_BOOT_STACK_SIZE { ; Stack region growing down
6052
}
6153
}

targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L432xC/device/TOOLCHAIN_GCC_ARM/STM32L432XX.ld

Lines changed: 52 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,44 @@
1+
/* Linker script to configure memory regions. */
2+
/*
3+
* SPDX-License-Identifier: BSD-3-Clause
4+
******************************************************************************
5+
* @attention
6+
*
7+
* Copyright (c) 2016-2020 STMicroelectronics.
8+
* All rights reserved.
9+
*
10+
* This software component is licensed by ST under BSD 3-Clause license,
11+
* the "License"; You may not use this file except in compliance with the
12+
* License. You may obtain a copy of the License at:
13+
* opensource.org/licenses/BSD-3-Clause
14+
*
15+
******************************************************************************
16+
*/
17+
18+
#include "../cmsis_nvic.h"
19+
20+
121
#if !defined(MBED_APP_START)
2-
#define MBED_APP_START 0x08000000
22+
#define MBED_APP_START MBED_ROM_START
323
#endif
424

525
#if !defined(MBED_APP_SIZE)
6-
#define MBED_APP_SIZE 256k
26+
#define MBED_APP_SIZE MBED_ROM_SIZE
727
#endif
828

929
#if !defined(MBED_BOOT_STACK_SIZE)
10-
#define MBED_BOOT_STACK_SIZE 0x400
30+
/* This value is normally defined by the tools
31+
to 0x1000 for bare metal and 0x400 for RTOS */
32+
#define MBED_BOOT_STACK_SIZE 0x400
1133
#endif
1234

13-
STACK_SIZE = MBED_BOOT_STACK_SIZE;
35+
/* Round up VECTORS_SIZE to 8 bytes */
36+
#define VECTORS_SIZE (((NVIC_NUM_VECTORS * 4) + 7) & 0xFFFFFFF8)
1437

15-
/* Linker script to configure memory regions. */
1638
MEMORY
1739
{
18-
FLASH (rx) : ORIGIN = MBED_APP_START, LENGTH = MBED_APP_SIZE
19-
SRAM1 (rwx) : ORIGIN = 0x20000188, LENGTH = 64k - 0x188
40+
FLASH (rx) : ORIGIN = MBED_APP_START, LENGTH = MBED_APP_SIZE
41+
RAM (rwx) : ORIGIN = MBED_RAM_START + VECTORS_SIZE, LENGTH = MBED_RAM_SIZE + MBED_RAM1_SIZE - VECTORS_SIZE
2042
}
2143

2244
/* Linker script to place sections and symbol values. Should be used together
@@ -54,6 +76,7 @@ SECTIONS
5476
{
5577
KEEP(*(.isr_vector))
5678
*(.text*)
79+
5780
KEEP(*(.init))
5881
KEEP(*(.fini))
5982

@@ -90,7 +113,7 @@ SECTIONS
90113

91114
__etext = .;
92115
_sidata = .;
93-
116+
94117
.data : AT (__etext)
95118
{
96119
__data_start__ = .;
@@ -111,7 +134,6 @@ SECTIONS
111134
KEEP(*(.init_array))
112135
PROVIDE_HIDDEN (__init_array_end = .);
113136

114-
115137
. = ALIGN(8);
116138
/* finit data */
117139
PROVIDE_HIDDEN (__fini_array_start = .);
@@ -125,8 +147,21 @@ SECTIONS
125147
__data_end__ = .;
126148
_edata = .;
127149

128-
} > SRAM1
150+
} > RAM
129151

152+
/* Uninitialized data section
153+
* This region is not initialized by the C/C++ library and can be used to
154+
* store state across soft reboots. */
155+
.uninitialized (NOLOAD):
156+
{
157+
. = ALIGN(32);
158+
__uninitialized_start = .;
159+
*(.uninitialized)
160+
KEEP(*(.keep.uninitialized))
161+
. = ALIGN(32);
162+
__uninitialized_end = .;
163+
} > RAM
164+
130165
.bss :
131166
{
132167
. = ALIGN(8);
@@ -137,30 +172,30 @@ SECTIONS
137172
. = ALIGN(8);
138173
__bss_end__ = .;
139174
_ebss = .;
140-
} > SRAM1
175+
} > RAM
141176

142177
.heap (COPY):
143178
{
144179
__end__ = .;
145-
end = __end__;
180+
PROVIDE(end = .);
146181
*(.heap*)
147-
. = ORIGIN(SRAM1) + LENGTH(SRAM1) - STACK_SIZE;
182+
. = ORIGIN(RAM) + LENGTH(RAM) - MBED_BOOT_STACK_SIZE;
148183
__HeapLimit = .;
149-
} > SRAM1
184+
} > RAM
150185

151186
/* .stack_dummy section doesn't contains any symbols. It is only
152187
* used for linker to calculate size of stack sections, and assign
153188
* values to stack symbols later */
154189
.stack_dummy (COPY):
155190
{
156191
*(.stack*)
157-
} > SRAM1
192+
} > RAM
158193

159194
/* Set stack top to end of RAM, and stack limit move down by
160195
* size of stack_dummy section */
161-
__StackTop = ORIGIN(SRAM1) + LENGTH(SRAM1);
196+
__StackTop = ORIGIN(RAM) + LENGTH(RAM);
162197
_estack = __StackTop;
163-
__StackLimit = __StackTop - STACK_SIZE;
198+
__StackLimit = __StackTop - MBED_BOOT_STACK_SIZE;
164199
PROVIDE(__stack = __StackTop);
165200

166201
/* Check if data + heap + stack exceeds RAM limit */
Lines changed: 49 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,59 @@
1-
if (!isdefinedsymbol(MBED_APP_START)) { define symbol MBED_APP_START = 0x08000000; }
2-
if (!isdefinedsymbol(MBED_APP_SIZE)) { define symbol MBED_APP_SIZE = 0x40000; }
3-
4-
/* [ROM = 256kb = 0x40000] */
5-
define symbol __intvec_start__ = MBED_APP_START;
6-
define symbol __region_ROM_start__ = MBED_APP_START;
7-
define symbol __region_ROM_end__ = MBED_APP_START + MBED_APP_SIZE - 1;
8-
9-
/* [RAM = 48kb + 16kb = 0x10000] */
10-
/* Vector table dynamic copy: Total: 98 vectors = 392 bytes (0x188) to be reserved in RAM */
11-
define symbol __NVIC_start__ = 0x20000000;
12-
define symbol __NVIC_end__ = 0x20000187; /* Aligned on 8 bytes (392 = 98 x 4) */
13-
define symbol __region_SRAM1_start__ = 0x20000188;
14-
define symbol __region_SRAM1_end__ = 0x2000FFFF;
15-
16-
/* Memory regions */
17-
define memory mem with size = 4G;
18-
define region ROM_region = mem:[from __region_ROM_start__ to __region_ROM_end__];
19-
define region SRAM1_region = mem:[from __region_SRAM1_start__ to __region_SRAM1_end__];
1+
/* Linker script to configure memory regions.
2+
*
3+
* SPDX-License-Identifier: BSD-3-Clause
4+
******************************************************************************
5+
* @attention
6+
*
7+
* Copyright (c) 2016-2020 STMicroelectronics.
8+
* All rights reserved.
9+
*
10+
* This software component is licensed by ST under BSD 3-Clause license,
11+
* the "License"; You may not use this file except in compliance with the
12+
* License. You may obtain a copy of the License at:
13+
* opensource.org/licenses/BSD-3-Clause
14+
*
15+
******************************************************************************
16+
*/
17+
/* Device specific values */
18+
19+
/* Tools provide -DMBED_ROM_START=xxx -DMBED_ROM_SIZE=xxx -DMBED_RAM_START=xxx -DMBED_RAM_SIZE=xxx */
20+
21+
define symbol VECTORS = 99; /* This value must match NVIC_NUM_VECTORS in cmsis_nvic.h */
22+
define symbol HEAP_SIZE = 0x2000;
23+
24+
/* Common - Do not change */
25+
26+
if (!isdefinedsymbol(MBED_APP_START)) {
27+
define symbol MBED_APP_START = MBED_ROM_START;
28+
}
29+
30+
if (!isdefinedsymbol(MBED_APP_SIZE)) {
31+
define symbol MBED_APP_SIZE = MBED_ROM_SIZE;
32+
}
2033

2134
if (!isdefinedsymbol(MBED_BOOT_STACK_SIZE)) {
35+
/* This value is normally defined by the tools
36+
to 0x1000 for bare metal and 0x400 for RTOS */
2237
define symbol MBED_BOOT_STACK_SIZE = 0x400;
2338
}
2439

25-
define symbol __size_cstack__ = MBED_BOOT_STACK_SIZE;
26-
define symbol __size_heap__ = 0x4000;
27-
define block CSTACK with alignment = 8, size = __size_cstack__ { };
28-
define block HEAP with alignment = 8, size = __size_heap__ { };
29-
define block STACKHEAP with fixed order { block HEAP, block CSTACK };
40+
/* Round up VECTORS_SIZE to 8 bytes */
41+
define symbol VECTORS_SIZE = ((VECTORS * 4) + 7) & ~7;
42+
define symbol RAM_REGION_START = MBED_RAM_START + VECTORS_SIZE;
43+
define symbol RAM_REGION_SIZE = MBED_RAM_SIZE + MBED_RAM1_SIZE - VECTORS_SIZE;
44+
45+
define memory mem with size = 4G;
46+
define region ROM_region = mem:[from MBED_APP_START size MBED_APP_SIZE];
47+
define region RAM_region = mem:[from RAM_REGION_START size RAM_REGION_SIZE];
48+
49+
define block CSTACK with alignment = 8, size = MBED_BOOT_STACK_SIZE { };
50+
define block HEAP with alignment = 8, size = HEAP_SIZE { };
3051

31-
initialize by copy with packing = zeros { readwrite };
52+
initialize by copy { readwrite };
3253
do not initialize { section .noinit };
3354

34-
place at address mem:__intvec_start__ { readonly section .intvec };
55+
place at address mem: MBED_APP_START { readonly section .intvec };
3556

3657
place in ROM_region { readonly };
37-
place in SRAM1_region { readwrite, block STACKHEAP };
58+
place in RAM_region { readwrite,
59+
block CSTACK, block HEAP };
Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,47 @@
11
/* mbed Microcontroller Library
2-
*******************************************************************************
3-
* Copyright (c) 2015, STMicroelectronics
4-
* All rights reserved.
2+
* SPDX-License-Identifier: BSD-3-Clause
3+
******************************************************************************
4+
* @attention
55
*
6-
* Redistribution and use in source and binary forms, with or without
7-
* modification, are permitted provided that the following conditions are met:
6+
* <h2><center>&copy; Copyright (c) 2016-2020 STMicroelectronics.
7+
* All rights reserved.</center></h2>
88
*
9-
* 1. Redistributions of source code must retain the above copyright notice,
10-
* this list of conditions and the following disclaimer.
11-
* 2. Redistributions in binary form must reproduce the above copyright notice,
12-
* this list of conditions and the following disclaimer in the documentation
13-
* and/or other materials provided with the distribution.
14-
* 3. Neither the name of STMicroelectronics nor the names of its contributors
15-
* may be used to endorse or promote products derived from this software
16-
* without specific prior written permission.
9+
* This software component is licensed by ST under BSD 3-Clause license,
10+
* the "License"; You may not use this file except in compliance with the
11+
* License. You may obtain a copy of the License at:
12+
* opensource.org/licenses/BSD-3-Clause
1713
*
18-
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19-
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20-
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21-
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22-
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23-
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24-
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25-
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26-
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27-
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28-
*******************************************************************************
29-
*/
14+
******************************************************************************
15+
*/
3016

3117
#ifndef MBED_CMSIS_NVIC_H
3218
#define MBED_CMSIS_NVIC_H
3319

34-
// CORE: 16 vectors = 64 bytes from 0x00 to 0x3F
35-
// MCU Peripherals: 82 vectors = 328 bytes from 0x40 to 0x187
36-
// Total: 98 vectors = 392 bytes (0x188) to be reserved in RAM
37-
#define NVIC_NUM_VECTORS 98
38-
#define NVIC_RAM_VECTOR_ADDRESS SRAM1_BASE // Vectors positioned at start of SRAM1
20+
#if !defined(MBED_ROM_START)
21+
#define MBED_ROM_START 0x8000000
22+
#endif
23+
24+
#if !defined(MBED_ROM_SIZE)
25+
#define MBED_ROM_SIZE 0x40000 // 256 KB
26+
#endif
27+
28+
#if !defined(MBED_RAM_START)
29+
#define MBED_RAM_START 0x20000000
30+
#endif
31+
32+
#if !defined(MBED_RAM_SIZE)
33+
#define MBED_RAM_SIZE 0xc000 // 48 KB
34+
#endif
35+
36+
#if !defined(MBED_RAM1_START)
37+
#define MBED_RAM1_START 0x10000000
38+
#endif
39+
40+
#if !defined(MBED_RAM1_SIZE)
41+
#define MBED_RAM1_SIZE 0x4000 // 16 KB
42+
#endif
43+
44+
#define NVIC_NUM_VECTORS 99
45+
#define NVIC_RAM_VECTOR_ADDRESS MBED_RAM_START
3946

4047
#endif

0 commit comments

Comments
 (0)