Skip to content

Commit 713618a

Browse files
committed
STM32F4 baremetal support
1 parent adbd936 commit 713618a

File tree

42 files changed

+1399
-999
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1399
-999
lines changed

targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F401xE/TARGET_NUCLEO_F401RE/system_clock.c

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -99,22 +99,29 @@ uint8_t SetSysClock_PLL_HSE(uint8_t bypass)
9999
__HAL_RCC_PWR_CLK_ENABLE();
100100
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
101101

102-
// Enable HSE oscillator and activate PLL with HSE as source
103-
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
104-
if (bypass == 0) {
105-
RCC_OscInitStruct.HSEState = RCC_HSE_ON; // External 8 MHz xtal on OSC_IN/OSC_OUT
106-
} else {
107-
RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; // External 8 MHz clock on OSC_IN
108-
}
102+
/* Get the Clocks configuration according to the internal RCC registers */
103+
HAL_RCC_GetOscConfig(&RCC_OscInitStruct);
104+
105+
/* PLL could be already configured by bootlader */
106+
if (RCC_OscInitStruct.PLL.PLLState != RCC_PLL_ON) {
107+
108+
// Enable HSE oscillator and activate PLL with HSE as source
109+
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
110+
if (bypass == 0) {
111+
RCC_OscInitStruct.HSEState = RCC_HSE_ON; // External 8 MHz xtal on OSC_IN/OSC_OUT
112+
} else {
113+
RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; // External 8 MHz clock on OSC_IN
114+
}
109115

110-
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
111-
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
112-
RCC_OscInitStruct.PLL.PLLM = 8; // VCO input clock = 1 MHz (8 MHz / 8)
113-
RCC_OscInitStruct.PLL.PLLN = 336; // VCO output clock = 336 MHz (1 MHz * 336)
114-
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; // PLLCLK = 84 MHz (336 MHz / 4)
115-
RCC_OscInitStruct.PLL.PLLQ = 7; // USB clock = 48 MHz (336 MHz / 7) --> OK for USB
116-
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
117-
return 0; // FAIL
116+
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
117+
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
118+
RCC_OscInitStruct.PLL.PLLM = 8; // VCO input clock = 1 MHz (8 MHz / 8)
119+
RCC_OscInitStruct.PLL.PLLN = 336; // VCO output clock = 336 MHz (1 MHz * 336)
120+
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; // PLLCLK = 84 MHz (336 MHz / 4)
121+
RCC_OscInitStruct.PLL.PLLQ = 7; // USB clock = 48 MHz (336 MHz / 7) --> OK for USB
122+
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
123+
return 0; // FAIL
124+
}
118125
}
119126

120127
// Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers
Lines changed: 30 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,53 @@
11
#! armcc -E
22
; Scatter-Loading Description File
3-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4-
; Copyright (c) 2014, 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) 2014-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

35-
; STM32F401RE: 512KB FLASH
3624
#if !defined(MBED_APP_SIZE)
37-
#define MBED_APP_SIZE 0x80000
38-
#endif
39-
40-
; 96KB SRAM
41-
#if !defined(MBED_RAM_START)
42-
#define MBED_RAM_START 0x20000000
25+
#define MBED_APP_SIZE MBED_ROM_SIZE
4326
#endif
4427

45-
#if !defined(MBED_RAM_SIZE)
46-
#define MBED_RAM_SIZE 0x18000
47-
#endif
48-
49-
5028
#if !defined(MBED_BOOT_STACK_SIZE)
51-
#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
5231
#endif
5332

54-
; Total: 101 vectors = 404 bytes (0x194) 8-byte aligned = 0x198 (0x194 + 0x4) to be reserved in RAM
55-
#define VECTOR_SIZE 0x198
56-
57-
#define RAM_FIXED_SIZE (MBED_BOOT_STACK_SIZE+VECTOR_SIZE)
33+
/* Round up VECTORS_SIZE to 8 bytes */
34+
#define VECTORS_SIZE (((NVIC_NUM_VECTORS * 4) + 7) AND ~7)
5835

59-
LR_IROM1 MBED_APP_START MBED_APP_SIZE { ; load region size_region
36+
LR_IROM1 MBED_APP_START MBED_APP_SIZE {
6037

61-
ER_IROM1 MBED_APP_START MBED_APP_SIZE { ; load address = execution address
62-
*.o (RESET, +First)
63-
*(InRoot$$Sections)
64-
.ANY (+RO)
38+
ER_IROM1 MBED_APP_START MBED_APP_SIZE {
39+
*.o (RESET, +First)
40+
*(InRoot$$Sections)
41+
.ANY (+RO)
6542
}
6643

67-
RW_IRAM1 (MBED_RAM_START+VECTOR_SIZE) (MBED_RAM_SIZE-VECTOR_SIZE) { ; RW data
68-
.ANY (+RW +ZI)
44+
RW_IRAM1 (MBED_RAM_START + VECTORS_SIZE) { ; RW data
45+
.ANY (+RW +ZI)
6946
}
7047

71-
ARM_LIB_HEAP AlignExpr(+0, 16) EMPTY (MBED_RAM_SIZE-RAM_FIXED_SIZE+MBED_RAM_START-AlignExpr(ImageLimit(RW_IRAM1), 16)) {
48+
ARM_LIB_HEAP AlignExpr(+0, 16) EMPTY (MBED_RAM_START + MBED_RAM_SIZE - MBED_BOOT_STACK_SIZE - AlignExpr(ImageLimit(RW_IRAM1), 16)) { ; Heap growing up
7249
}
7350

74-
ARM_LIB_STACK (MBED_RAM_START+MBED_RAM_SIZE) EMPTY -MBED_BOOT_STACK_SIZE { ; stack
51+
ARM_LIB_STACK (MBED_RAM_START + MBED_RAM_SIZE) EMPTY -MBED_BOOT_STACK_SIZE { ; Stack region growing down
7552
}
7653
}

targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F401xE/TOOLCHAIN_GCC_ARM/STM32F401XE.ld

Lines changed: 53 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,51 @@
11
/* Linker script to configure memory regions. */
2-
/* 0x194 reserved for vectors 8-byte aligned = 0x198 (0x194 + 0x4) */
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+
21+
#if !defined(MBED_APP_START)
22+
#define MBED_APP_START MBED_ROM_START
23+
#endif
24+
25+
#if !defined(MBED_APP_SIZE)
26+
#define MBED_APP_SIZE MBED_ROM_SIZE
27+
#endif
328

429
#if !defined(MBED_BOOT_STACK_SIZE)
5-
#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
633
#endif
734

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

1038
MEMORY
11-
{
12-
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
13-
RAM (rwx) : ORIGIN = 0x20000198, LENGTH = 96k - (0x194+0x4)
39+
{
40+
FLASH (rx) : ORIGIN = MBED_APP_START, LENGTH = MBED_APP_SIZE
41+
RAM (rwx) : ORIGIN = MBED_RAM_START + VECTORS_SIZE, LENGTH = MBED_RAM_SIZE - VECTORS_SIZE
1442
}
1543

1644
/* Linker script to place sections and symbol values. Should be used together
1745
* with other linker script that defines memory regions FLASH and RAM.
1846
* It references following symbols, which must be defined in code:
1947
* Reset_Handler : Entry of reset handler
20-
*
48+
*
2149
* It defines following symbols, which code can use without definition:
2250
* __exidx_start
2351
* __exidx_end
@@ -48,6 +76,7 @@ SECTIONS
4876
{
4977
KEEP(*(.isr_vector))
5078
*(.text*)
79+
5180
KEEP(*(.init))
5281
KEEP(*(.fini))
5382

@@ -84,7 +113,7 @@ SECTIONS
84113

85114
__etext = .;
86115
_sidata = .;
87-
116+
88117
.data : AT (__etext)
89118
{
90119
__data_start__ = .;
@@ -105,7 +134,6 @@ SECTIONS
105134
KEEP(*(.init_array))
106135
PROVIDE_HIDDEN (__init_array_end = .);
107136

108-
109137
. = ALIGN(8);
110138
/* finit data */
111139
PROVIDE_HIDDEN (__fini_array_start = .);
@@ -121,6 +149,19 @@ SECTIONS
121149

122150
} > RAM
123151

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+
124165
.bss :
125166
{
126167
. = ALIGN(8);
@@ -136,9 +177,9 @@ SECTIONS
136177
.heap (COPY):
137178
{
138179
__end__ = .;
139-
end = __end__;
180+
PROVIDE(end = .);
140181
*(.heap*)
141-
. = ORIGIN(RAM) + LENGTH(RAM) - STACK_SIZE;
182+
. = ORIGIN(RAM) + LENGTH(RAM) - MBED_BOOT_STACK_SIZE;
142183
__HeapLimit = .;
143184
} > RAM
144185

@@ -154,7 +195,7 @@ SECTIONS
154195
* size of stack_dummy section */
155196
__StackTop = ORIGIN(RAM) + LENGTH(RAM);
156197
_estack = __StackTop;
157-
__StackLimit = __StackTop - STACK_SIZE;
198+
__StackLimit = __StackTop - MBED_BOOT_STACK_SIZE;
158199
PROVIDE(__stack = __StackTop);
159200

160201
/* Check if data + heap + stack exceeds RAM limit */
Lines changed: 46 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,59 @@
1-
/*###ICF### Section handled by ICF editor, don't touch! ****/
2-
/*-Editor annotation file-*/
3-
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
4-
/*-Specials-*/
5-
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
6-
/*-Memory Regions-*/
7-
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
8-
define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
9-
define symbol __NVIC_start__ = 0x20000000;
10-
define symbol __NVIC_end__ = 0x20000197; /* to be aligned on 8 bytes */
11-
define symbol __ICFEDIT_region_RAM_start__ = 0x20000198;
12-
define symbol __ICFEDIT_region_RAM_end__ = 0x20017FFF;
13-
/*-Sizes-*/
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 = 101; /* This value must match NVIC_NUM_VECTORS in cmsis_nvic.h */
22+
define symbol HEAP_SIZE = 0x4000;
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+
}
33+
1434
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 */
1537
define symbol MBED_BOOT_STACK_SIZE = 0x400;
1638
}
17-
define symbol __ICFEDIT_size_cstack__ = MBED_BOOT_STACK_SIZE;
18-
define symbol __ICFEDIT_size_heap__ = 0x6000;
19-
/**** End of ICF editor section. ###ICF###*/
39+
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 - VECTORS_SIZE;
2044

2145
define memory mem with size = 4G;
22-
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
23-
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
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];
2448

25-
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
26-
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
49+
define block CSTACK with alignment = 8, size = MBED_BOOT_STACK_SIZE { };
50+
define block HEAP with alignment = 8, size = HEAP_SIZE { };
2751

2852
initialize by copy { readwrite };
2953
do not initialize { section .noinit };
3054

31-
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
55+
place at address mem: MBED_APP_START { readonly section .intvec };
3256

3357
place in ROM_region { readonly };
3458
place in RAM_region { readwrite,
35-
block HEAP, block CSTACK };
59+
block CSTACK, block HEAP };

0 commit comments

Comments
 (0)