1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/cpu/stm32/Makefile.include
Gunar Schorcht 516c74b81e cpu/stm32: add FMC RAM as heap
If the board defines `FMC_RAM_ADDR` and `FMC_RAM_LEN`, the FMC RAM is used a additional heap if module `periph_fmc` is enabled.

For that purpose
- the linker symbols `_fmc_ram_addr` and `_fmc_ram_len` are set,
- a memory region `fcmram` is added in linker script for the FMC RAM based on these `_fcm_ram_*` linker symbols
- a section for the FMC RAM is defined in this memory region that defines the heap by setting `_sheap3` and `_eheap3` and
- the number of heaps is set to 4 since to use `_sheap3` and `_eheap3` even though `_sheap1` and `_eheap1` (the backup RAM) and `_sheap2` and `_eheap2` (SRAM4) are not present.
2023-07-26 09:02:10 +02:00

129 lines
4.8 KiB
Makefile

CFLAGS += -DCPU_FAM_STM32$(call uppercase_and_underscore,$(CPU_FAM))
# For stm32 cpu's we use the generic stm32.ld linker script
LINKER_SCRIPT ?= stm32.ld
# Include riotboot specific variables
include $(RIOTCPU)/stm32/stm32_riotboot.mk
# Compute ROM_LEN and RAM_LEN
include $(RIOTCPU)/stm32/stm32_mem_lengths.mk
KB := 1024
ROM_LEN_K := $(shell echo $(ROM_LEN) | sed 's/K//')
RAM_LEN_K := $(shell echo $(RAM_LEN) | sed 's/K//')
ifneq (,$(filter w%,$(CPU_FAM)))
ifneq (,$(CPU2_RAM_LEN))
# adjust RAM_LEN and ROM_LEN according to CPU2 RAM_LEN and ROM_LEN
CPU2_RAM_LEN_K := $(shell echo $(CPU2_RAM_LEN) | sed 's/K//')
RAM_LEN := $(shell echo $$(( ($(RAM_LEN_K) - $(CPU2_RAM_LEN_K) ) * $(KB) )))
else
RAM_LEN := $(shell echo $$(( $(RAM_LEN_K) * $(KB) )) )
endif
ifneq (,$(CPU2_ROM_LEN))
CPU2_ROM_LEN_K := $(shell echo $(CPU2_ROM_LEN) | sed 's/K//')
FLASHSIZE := $(shell echo $$(( ($(ROM_LEN_K) - $(CPU2_ROM_LEN_K) )* $(KB) )) )
ROM_LEN := $(shell echo $$(( ($(ROM_LEN_K) - $(CPU2_ROM_LEN_K) ) ))K)
else
FLASHSIZE := $(shell echo $$(( $(ROM_LEN_K) * $(KB) )) )
endif
else
FLASHSIZE := $(shell echo $$(( $(ROM_LEN_K) * $(KB) )) )
RAM_LEN := $(shell echo $$(( $(RAM_LEN_K) * $(KB) )) )
endif
# Get CPU_LINE_ variable
include $(RIOTCPU)/stm32/stm32_line.mk
CPU_LINE ?= $(shell echo $(CPU_MODEL) | cut -c -9 | tr 'a-z-' 'A-Z_')xx
ifeq ($(CONFIG_RDP0),y)
CFLAGS += -DCONFIG_STM32_RDP=0
endif
ifeq ($(CONFIG_RDP1),y)
CFLAGS += -DCONFIG_STM32_RDP=1
endif
ifeq ($(CONFIG_RDP2),y)
CFLAGS += -DCONFIG_STM32_RDP=2
endif
# Set CFLAGS
CFLAGS += -D$(CPU_LINE) -DCPU_LINE_$(CPU_LINE)
CFLAGS += -DSTM32_FLASHSIZE=$(FLASHSIZE)U
info-stm32:
@$(COLOR_ECHO) "CPU: $(CPU_MODEL)"
@$(COLOR_ECHO) "\tLine: $(CPU_LINE)"
@$(COLOR_ECHO) "\tPin count:\t$(STM32_PINS)"
@$(COLOR_ECHO) "\tROM size:\t$(ROM_LEN) ($(FLASHSIZE) Bytes)"
@$(COLOR_ECHO) "\tRAM size:\t$(RAM_LEN_K)KiB"
ifneq (,$(CCMRAM_LEN))
LINKFLAGS += $(LINKFLAGPREFIX)--defsym=_ccmram_length=$(CCMRAM_LEN)
endif
ifneq (,$(SRAM4_LEN))
LINKFLAGS += $(LINKFLAGPREFIX)--defsym=_sram4_length=$(SRAM4_LEN)
endif
# if the board uses a FMC RAM, all 4 heaps have to be used even if
# some of them are not available
ifneq (,$(filter periph_fmc_sdram periph_fmc_nor_sram,$(USEMODULE)))
ifneq (,$(FMC_RAM_LEN))
LINKFLAGS += $(LINKFLAGPREFIX)--defsym=_fmc_ram_addr=$(FMC_RAM_ADDR)
LINKFLAGS += $(LINKFLAGPREFIX)--defsym=_fmc_ram_len=$(FMC_RAM_LEN)
CFLAGS += -DCPU_HAS_FMC_RAM=1
CFLAGS += -DNUM_HEAPS=4
endif
endif
VECTORS_O ?= $(BINDIR)/stm32_vectors/$(CPU_LINE).o
VECTORS_FILE = $(RIOTCPU)/stm32/vectors/$(CPU_LINE).c
BUILDDEPS += $(VECTORS_FILE)
# CPU_LINE must be exported only when building the vectors object file since
# the source filename to be built is built from the CPU_LINE content.
$(call target-export-variables,$(VECTORS_O),CPU_LINE)
# Add this define to skip the inclusion of the system_stm32xxxx.h header files
# which are only used for STM32 system includes and not of interest for RIOT.
CFLAGS += -D__SYSTEM_STM32$(call uppercase,$(CPU_FAM))XX_H
# C0, G0, H7, L5 and U5 use SYSTEM_STM32..XX_H instead
CFLAGS += -DSYSTEM_STM32$(call uppercase,$(CPU_FAM))XX_H
ifneq (,$(filter STM32F030x4 STM32MP157Cxx,$(CPU_LINE)))
STM32CMSIS_INCLUDE_DIR = $(RIOTCPU)/stm32/include/vendor/cmsis/$(CPU_FAM)/Include
else
STM32CMSIS_INCLUDE_DIR = $(BUILD_DIR)/stm32/cmsis/$(CPU_FAM)/Include
STM32FAM_INCLUDE_FILE = $(STM32CMSIS_INCLUDE_DIR)/stm32$(CPU_FAM)xx.h
INCLUDES += -I$(STM32CMSIS_INCLUDE_DIR)
endif
# Fetch all CMSIS headers using the package mechanism. This rule is called all
# the time to ensure it's correctly updated when versions in the packages are
# updated.
$(STM32FAM_INCLUDE_FILE): FORCE $(CLEAN)
$(Q)+$(MAKE) -f $(RIOTBASE)/cpu/stm32/Makefile.cmsis
# The vectors source file requires the family headers to be fetched before since
# it's generated from the CMSIS content
$(VECTORS_FILE): $(STM32FAM_INCLUDE_FILE)
$(Q)$(RIOTBASE)/cpu/stm32/dist/irqs/gen_vectors.py $(STM32CMSIS_INCLUDE_DIR) $(CPU_LINE)
ifeq (,$(filter STM32MP157Cxx STM32F030x4,$(CPU_LINE)))
# IRQs of STM32F030x4 and STM32MP157Cxx lines are not available in the CMSIS
# package so they are hardcoded in RIOTs codebase.
# For other lines, the IRQs are automatically generated once from the whole
# list of CMSIS headers available in a given family
STM32IRQS_INCLUDE_FILE = $(RIOTCPU)/stm32/include/irqs/$(CPU_FAM)/irqs.h
BUILDDEPS += $(STM32IRQS_INCLUDE_FILE)
endif
# The IRQ header for a given family requires the family headers to be fetched
# before since it's generated from all CMSIS content of that family
$(STM32IRQS_INCLUDE_FILE): $(STM32FAM_INCLUDE_FILE)
$(Q)$(RIOTBASE)/cpu/stm32/dist/irqs/gen_irqs.py $(STM32CMSIS_INCLUDE_DIR) $(CPU_FAM)
# Include clock configuration directory
INCLUDES += -I$(RIOTCPU)/stm32/include/clk
include $(RIOTMAKE)/arch/cortexm.inc.mk