initial commit
This commit is contained in:
commit
7df819dfee
13 changed files with 1558 additions and 0 deletions
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
/platform/
|
||||
/protocol/
|
||||
build/
|
||||
.cache/
|
||||
compile_commands.json
|
||||
|
||||
375
myapps/blinky-old-32mg/Makefile
Normal file
375
myapps/blinky-old-32mg/Makefile
Normal file
|
|
@ -0,0 +1,375 @@
|
|||
# boilermake: A reusable, but flexible, boilerplate Makefile.
|
||||
#
|
||||
# Copyright 2008, 2009, 2010 Dan Moulding, Alan T. DeKok
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Caution: Don't edit this Makefile! Create your own main.mk and other
|
||||
# submakefiles, which will be included by this Makefile.
|
||||
# Only edit this if you need to modify boilermake's behavior (fix
|
||||
# bugs, add features, etc).
|
||||
|
||||
# Note: Parameterized "functions" in this makefile that are marked with
|
||||
# "USE WITH EVAL" are only useful in conjuction with eval. This is
|
||||
# because those functions result in a block of Makefile syntax that must
|
||||
# be evaluated after expansion. Since they must be used with eval, most
|
||||
# instances of "$" within them need to be escaped with a second "$" to
|
||||
# accomodate the double expansion that occurs when eval is invoked.
|
||||
|
||||
# ADD_CLEAN_RULE - Parameterized "function" that adds a new rule and phony
|
||||
# target for cleaning the specified target (removing its build-generated
|
||||
# files).
|
||||
#
|
||||
# USE WITH EVAL
|
||||
#
|
||||
define ADD_CLEAN_RULE
|
||||
clean: clean_${1}
|
||||
.PHONY: clean_${1}
|
||||
clean_${1}:
|
||||
$$(strip rm -f ${TARGET_DIR}/${1} $${${1}_OBJS:%.o=%.[doP]})
|
||||
$${${1}_POSTCLEAN}
|
||||
endef
|
||||
|
||||
# ADD_OBJECT_RULE - Parameterized "function" that adds a pattern rule for
|
||||
# building object files from source files with the filename extension
|
||||
# specified in the second argument. The first argument must be the name of the
|
||||
# base directory where the object files should reside (such that the portion
|
||||
# of the path after the base directory will match the path to corresponding
|
||||
# source files). The third argument must contain the rules used to compile the
|
||||
# source files into object code form.
|
||||
#
|
||||
# USE WITH EVAL
|
||||
#
|
||||
define ADD_OBJECT_RULE
|
||||
${1}/%.o: ${2}
|
||||
${3}
|
||||
endef
|
||||
|
||||
# ADD_TARGET_RULE - Parameterized "function" that adds a new target to the
|
||||
# Makefile. The target may be an executable or a library. The two allowable
|
||||
# types of targets are distinguished based on the name: library targets must
|
||||
# end with the traditional ".a" extension.
|
||||
#
|
||||
# USE WITH EVAL
|
||||
#
|
||||
define ADD_TARGET_RULE
|
||||
ifeq "$$(suffix ${1})" ".a"
|
||||
# Add a target for creating a static library.
|
||||
$${TARGET_DIR}/${1}: $${${1}_OBJS}
|
||||
@mkdir -p $$(dir $$@)
|
||||
$$(strip $${AR} $${ARFLAGS} $$@ $${${1}_OBJS})
|
||||
$${${1}_POSTMAKE}
|
||||
else
|
||||
# Add a target for linking an executable. First, attempt to select the
|
||||
# appropriate front-end to use for linking. This might not choose the
|
||||
# right one (e.g. if linking with a C++ static library, but all other
|
||||
# sources are C sources), so the user makefile is allowed to specify a
|
||||
# linker to be used for each target.
|
||||
ifeq "$$(strip $${${1}_LINKER})" ""
|
||||
# No linker was explicitly specified to be used for this target. If
|
||||
# there are any C++ sources for this target, use the C++ compiler.
|
||||
# For all other targets, default to using the C compiler.
|
||||
ifneq "$$(strip $$(filter $${CXX_SRC_EXTS},$${${1}_SOURCES}))" ""
|
||||
${1}_LINKER = $${CXX}
|
||||
else
|
||||
${1}_LINKER = $${CC}
|
||||
endif
|
||||
endif
|
||||
|
||||
$${TARGET_DIR}/${1}: $${${1}_OBJS} $${${1}_PREREQS}
|
||||
@mkdir -p $$(dir $$@)
|
||||
$$(strip $${${1}_LINKER} -o $$@ $${LDFLAGS} $${${1}_LDFLAGS} \
|
||||
$${${1}_OBJS} $${LDLIBS} $${${1}_LDLIBS})
|
||||
$${${1}_POSTMAKE}
|
||||
endif
|
||||
endef
|
||||
|
||||
# CANONICAL_PATH - Given one or more paths, converts the paths to the canonical
|
||||
# form. The canonical form is the path, relative to the project's top-level
|
||||
# directory (the directory from which "make" is run), and without
|
||||
# any "./" or "../" sequences. For paths that are not located below the
|
||||
# top-level directory, the canonical form is the absolute path (i.e. from
|
||||
# the root of the filesystem) also without "./" or "../" sequences.
|
||||
define CANONICAL_PATH
|
||||
$(patsubst ${CURDIR}/%,%,$(abspath ${1}))
|
||||
endef
|
||||
|
||||
# COMPILE_C_CMDS - Commands for compiling C source code.
|
||||
define COMPILE_C_CMDS
|
||||
@mkdir -p $(dir $@)
|
||||
$(strip ${CC} -o $@ -c -MD ${CFLAGS} ${SRC_CFLAGS} ${INCDIRS} \
|
||||
${SRC_INCDIRS} ${SRC_DEFS} ${DEFS} $<)
|
||||
@cp ${@:%$(suffix $@)=%.d} ${@:%$(suffix $@)=%.P}; \
|
||||
sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
|
||||
-e '/^$$/ d' -e 's/$$/ :/' < ${@:%$(suffix $@)=%.d} \
|
||||
>> ${@:%$(suffix $@)=%.P}; \
|
||||
rm -f ${@:%$(suffix $@)=%.d}
|
||||
endef
|
||||
|
||||
# COMPILE_CXX_CMDS - Commands for compiling C++ source code.
|
||||
define COMPILE_CXX_CMDS
|
||||
@mkdir -p $(dir $@)
|
||||
$(strip ${CXX} -o $@ -c -MD ${CXXFLAGS} ${SRC_CXXFLAGS} ${INCDIRS} \
|
||||
${SRC_INCDIRS} ${SRC_DEFS} ${DEFS} $<)
|
||||
@cp ${@:%$(suffix $@)=%.d} ${@:%$(suffix $@)=%.P}; \
|
||||
sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
|
||||
-e '/^$$/ d' -e 's/$$/ :/' < ${@:%$(suffix $@)=%.d} \
|
||||
>> ${@:%$(suffix $@)=%.P}; \
|
||||
rm -f ${@:%$(suffix $@)=%.d}
|
||||
endef
|
||||
|
||||
# INCLUDE_SUBMAKEFILE - Parameterized "function" that includes a new
|
||||
# "submakefile" fragment into the overall Makefile. It also recursively
|
||||
# includes all submakefiles of the specified submakefile fragment.
|
||||
#
|
||||
# USE WITH EVAL
|
||||
#
|
||||
define INCLUDE_SUBMAKEFILE
|
||||
# Initialize all variables that can be defined by a makefile fragment, then
|
||||
# include the specified makefile fragment.
|
||||
TARGET :=
|
||||
TGT_CFLAGS :=
|
||||
TGT_CXXFLAGS :=
|
||||
TGT_DEFS :=
|
||||
TGT_INCDIRS :=
|
||||
TGT_LDFLAGS :=
|
||||
TGT_LDLIBS :=
|
||||
TGT_LINKER :=
|
||||
TGT_POSTCLEAN :=
|
||||
TGT_POSTMAKE :=
|
||||
TGT_PREREQS :=
|
||||
|
||||
SOURCES :=
|
||||
SRC_CFLAGS :=
|
||||
SRC_CXXFLAGS :=
|
||||
SRC_DEFS :=
|
||||
SRC_INCDIRS :=
|
||||
|
||||
SUBMAKEFILES :=
|
||||
|
||||
# A directory stack is maintained so that the correct paths are used as we
|
||||
# recursively include all submakefiles. Get the makefile's directory and
|
||||
# push it onto the stack.
|
||||
DIR := $(call CANONICAL_PATH,$(dir ${1}))
|
||||
DIR_STACK := $$(call PUSH,$${DIR_STACK},$${DIR})
|
||||
|
||||
include ${1}
|
||||
|
||||
# Initialize internal local variables.
|
||||
OBJS :=
|
||||
|
||||
# Ensure that valid values are set for BUILD_DIR and TARGET_DIR.
|
||||
ifeq "$$(strip $${BUILD_DIR})" ""
|
||||
BUILD_DIR := build
|
||||
endif
|
||||
ifeq "$$(strip $${TARGET_DIR})" ""
|
||||
TARGET_DIR := .
|
||||
endif
|
||||
|
||||
# Determine which target this makefile's variables apply to. A stack is
|
||||
# used to keep track of which target is the "current" target as we
|
||||
# recursively include other submakefiles.
|
||||
ifneq "$$(strip $${TARGET})" ""
|
||||
# This makefile defined a new target. Target variables defined by this
|
||||
# makefile apply to this new target. Initialize the target's variables.
|
||||
TGT := $$(strip $${TARGET})
|
||||
ALL_TGTS += $${TGT}
|
||||
$${TGT}_CFLAGS := $${TGT_CFLAGS}
|
||||
$${TGT}_CXXFLAGS := $${TGT_CXXFLAGS}
|
||||
$${TGT}_DEFS := $${TGT_DEFS}
|
||||
$${TGT}_DEPS :=
|
||||
TGT_INCDIRS := $$(call QUALIFY_PATH,$${DIR},$${TGT_INCDIRS})
|
||||
TGT_INCDIRS := $$(call CANONICAL_PATH,$${TGT_INCDIRS})
|
||||
$${TGT}_INCDIRS := $${TGT_INCDIRS}
|
||||
$${TGT}_LDFLAGS := $${TGT_LDFLAGS}
|
||||
$${TGT}_LDLIBS := $${TGT_LDLIBS}
|
||||
$${TGT}_LINKER := $${TGT_LINKER}
|
||||
$${TGT}_OBJS :=
|
||||
$${TGT}_POSTCLEAN := $${TGT_POSTCLEAN}
|
||||
$${TGT}_POSTMAKE := $${TGT_POSTMAKE}
|
||||
$${TGT}_PREREQS := $$(addprefix $${TARGET_DIR}/,$${TGT_PREREQS})
|
||||
$${TGT}_SOURCES :=
|
||||
else
|
||||
# The values defined by this makefile apply to the the "current" target
|
||||
# as determined by which target is at the top of the stack.
|
||||
TGT := $$(strip $$(call PEEK,$${TGT_STACK}))
|
||||
$${TGT}_CFLAGS += $${TGT_CFLAGS}
|
||||
$${TGT}_CXXFLAGS += $${TGT_CXXFLAGS}
|
||||
$${TGT}_DEFS += $${TGT_DEFS}
|
||||
TGT_INCDIRS := $$(call QUALIFY_PATH,$${DIR},$${TGT_INCDIRS})
|
||||
TGT_INCDIRS := $$(call CANONICAL_PATH,$${TGT_INCDIRS})
|
||||
$${TGT}_INCDIRS += $${TGT_INCDIRS}
|
||||
$${TGT}_LDFLAGS += $${TGT_LDFLAGS}
|
||||
$${TGT}_LDLIBS += $${TGT_LDLIBS}
|
||||
$${TGT}_POSTCLEAN += $${TGT_POSTCLEAN}
|
||||
$${TGT}_POSTMAKE += $${TGT_POSTMAKE}
|
||||
$${TGT}_PREREQS += $${TGT_PREREQS}
|
||||
endif
|
||||
|
||||
# Push the current target onto the target stack.
|
||||
TGT_STACK := $$(call PUSH,$${TGT_STACK},$${TGT})
|
||||
|
||||
ifneq "$$(strip $${SOURCES})" ""
|
||||
# This makefile builds one or more objects from source. Validate the
|
||||
# specified sources against the supported source file types.
|
||||
BAD_SRCS := $$(strip $$(filter-out $${ALL_SRC_EXTS},$${SOURCES}))
|
||||
ifneq "$${BAD_SRCS}" ""
|
||||
$$(error Unsupported source file(s) found in ${1} [$${BAD_SRCS}])
|
||||
endif
|
||||
|
||||
# Qualify and canonicalize paths.
|
||||
SOURCES := $$(call QUALIFY_PATH,$${DIR},$${SOURCES})
|
||||
SOURCES := $$(call CANONICAL_PATH,$${SOURCES})
|
||||
SRC_INCDIRS := $$(call QUALIFY_PATH,$${DIR},$${SRC_INCDIRS})
|
||||
SRC_INCDIRS := $$(call CANONICAL_PATH,$${SRC_INCDIRS})
|
||||
|
||||
# Save the list of source files for this target.
|
||||
$${TGT}_SOURCES += $${SOURCES}
|
||||
|
||||
# Convert the source file names to their corresponding object file
|
||||
# names.
|
||||
OBJS := $$(addprefix $${BUILD_DIR}/$$(call CANONICAL_PATH,$${TGT})/,\
|
||||
$$(addsuffix .o,$$(basename $${SOURCES})))
|
||||
|
||||
# Add the objects to the current target's list of objects, and create
|
||||
# target-specific variables for the objects based on any source
|
||||
# variables that were defined.
|
||||
$${TGT}_OBJS += $${OBJS}
|
||||
$${TGT}_DEPS += $${OBJS:%.o=%.P}
|
||||
$${OBJS}: SRC_CFLAGS := $${$${TGT}_CFLAGS} $${SRC_CFLAGS}
|
||||
$${OBJS}: SRC_CXXFLAGS := $${$${TGT}_CXXFLAGS} $${SRC_CXXFLAGS}
|
||||
$${OBJS}: SRC_DEFS := $$(addprefix -D,$${$${TGT}_DEFS} $${SRC_DEFS})
|
||||
$${OBJS}: SRC_INCDIRS := $$(addprefix -I,\
|
||||
$${$${TGT}_INCDIRS} $${SRC_INCDIRS})
|
||||
endif
|
||||
|
||||
ifneq "$$(strip $${SUBMAKEFILES})" ""
|
||||
# This makefile has submakefiles. Recursively include them.
|
||||
$$(foreach MK,$${SUBMAKEFILES},\
|
||||
$$(eval $$(call INCLUDE_SUBMAKEFILE,\
|
||||
$$(call CANONICAL_PATH,\
|
||||
$$(call QUALIFY_PATH,$${DIR},$${MK})))))
|
||||
endif
|
||||
|
||||
# Reset the "current" target to it's previous value.
|
||||
TGT_STACK := $$(call POP,$${TGT_STACK})
|
||||
TGT := $$(call PEEK,$${TGT_STACK})
|
||||
|
||||
# Reset the "current" directory to it's previous value.
|
||||
DIR_STACK := $$(call POP,$${DIR_STACK})
|
||||
DIR := $$(call PEEK,$${DIR_STACK})
|
||||
endef
|
||||
|
||||
# MIN - Parameterized "function" that results in the minimum lexical value of
|
||||
# the two values given.
|
||||
define MIN
|
||||
$(firstword $(sort ${1} ${2}))
|
||||
endef
|
||||
|
||||
# PEEK - Parameterized "function" that results in the value at the top of the
|
||||
# specified colon-delimited stack.
|
||||
define PEEK
|
||||
$(lastword $(subst :, ,${1}))
|
||||
endef
|
||||
|
||||
# POP - Parameterized "function" that pops the top value off of the specified
|
||||
# colon-delimited stack, and results in the new value of the stack. Note that
|
||||
# the popped value cannot be obtained using this function; use peek for that.
|
||||
define POP
|
||||
${1:%:$(lastword $(subst :, ,${1}))=%}
|
||||
endef
|
||||
|
||||
# PUSH - Parameterized "function" that pushes a value onto the specified colon-
|
||||
# delimited stack, and results in the new value of the stack.
|
||||
define PUSH
|
||||
${2:%=${1}:%}
|
||||
endef
|
||||
|
||||
# QUALIFY_PATH - Given a "root" directory and one or more paths, qualifies the
|
||||
# paths using the "root" directory (i.e. appends the root directory name to
|
||||
# the paths) except for paths that are absolute.
|
||||
define QUALIFY_PATH
|
||||
$(addprefix ${1}/,$(filter-out /%,${2})) $(filter /%,${2})
|
||||
endef
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Start of Makefile Evaluation
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
# Older versions of GNU Make lack capabilities needed by boilermake.
|
||||
# With older versions, "make" may simply output "nothing to do", likely leading
|
||||
# to confusion. To avoid this, check the version of GNU make up-front and
|
||||
# inform the user if their version of make doesn't meet the minimum required.
|
||||
MIN_MAKE_VERSION := 3.81
|
||||
MIN_MAKE_VER_MSG := boilermake requires GNU Make ${MIN_MAKE_VERSION} or greater
|
||||
ifeq "${MAKE_VERSION}" ""
|
||||
$(info GNU Make not detected)
|
||||
$(error ${MIN_MAKE_VER_MSG})
|
||||
endif
|
||||
ifneq "${MIN_MAKE_VERSION}" "$(call MIN,${MIN_MAKE_VERSION},${MAKE_VERSION})"
|
||||
$(info This is GNU Make version ${MAKE_VERSION})
|
||||
$(error ${MIN_MAKE_VER_MSG})
|
||||
endif
|
||||
|
||||
# Define the source file extensions that we know how to handle.
|
||||
C_SRC_EXTS := %.c %.S
|
||||
CXX_SRC_EXTS := %.C %.cc %.cp %.cpp %.CPP %.cxx %.c++
|
||||
ALL_SRC_EXTS := ${C_SRC_EXTS} ${CXX_SRC_EXTS}
|
||||
|
||||
# Initialize global variables.
|
||||
ALL_TGTS :=
|
||||
DEFS :=
|
||||
DIR_STACK :=
|
||||
INCDIRS :=
|
||||
TGT_STACK :=
|
||||
|
||||
# Include the main user-supplied submakefile. This also recursively includes
|
||||
# all other user-supplied submakefiles.
|
||||
$(eval $(call INCLUDE_SUBMAKEFILE,main.mk))
|
||||
|
||||
# Perform post-processing on global variables as needed.
|
||||
DEFS := $(addprefix -D,${DEFS})
|
||||
INCDIRS := $(addprefix -I,$(call CANONICAL_PATH,${INCDIRS}))
|
||||
|
||||
# Define the "all" target (which simply builds all user-defined targets) as the
|
||||
# default goal.
|
||||
.PHONY: all
|
||||
all: $(addprefix ${TARGET_DIR}/,${ALL_TGTS})
|
||||
|
||||
# Add a new target rule for each user-defined target.
|
||||
$(foreach TGT,${ALL_TGTS},\
|
||||
$(eval $(call ADD_TARGET_RULE,${TGT})))
|
||||
|
||||
# Add pattern rule(s) for creating compiled object code from C source.
|
||||
$(foreach TGT,${ALL_TGTS},\
|
||||
$(foreach EXT,${C_SRC_EXTS},\
|
||||
$(eval $(call ADD_OBJECT_RULE,${BUILD_DIR}/$(call CANONICAL_PATH,${TGT}),\
|
||||
${EXT},$${COMPILE_C_CMDS}))))
|
||||
|
||||
# Add pattern rule(s) for creating compiled object code from C++ source.
|
||||
$(foreach TGT,${ALL_TGTS},\
|
||||
$(foreach EXT,${CXX_SRC_EXTS},\
|
||||
$(eval $(call ADD_OBJECT_RULE,${BUILD_DIR}/$(call CANONICAL_PATH,${TGT}),\
|
||||
${EXT},$${COMPILE_CXX_CMDS}))))
|
||||
|
||||
# Add "clean" rules to remove all build-generated files.
|
||||
.PHONY: clean
|
||||
$(foreach TGT,${ALL_TGTS},\
|
||||
$(eval $(call ADD_CLEAN_RULE,${TGT})))
|
||||
|
||||
# Include generated rules that define additional (header) dependencies.
|
||||
$(foreach TGT,${ALL_TGTS},\
|
||||
$(eval -include ${${TGT}_DEPS}))
|
||||
44
myapps/blinky-old-32mg/emlib.mk
Normal file
44
myapps/blinky-old-32mg/emlib.mk
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
SOURCES := ../../platform/emlib/src/em_cmu_fpga.c \
|
||||
../../platform/emlib/src/em_dma.c \
|
||||
../../platform/emlib/src/em_csen.c \
|
||||
../../platform/emlib/src/em_msc.c \
|
||||
../../platform/emlib/src/em_lcd.c \
|
||||
../../platform/emlib/src/em_rtcc.c \
|
||||
../../platform/emlib/src/em_can.c \
|
||||
../../platform/emlib/src/em_wdog.c \
|
||||
../../platform/emlib/src/em_system.c \
|
||||
../../platform/emlib/src/em_prs.c \
|
||||
../../platform/emlib/src/em_se.c \
|
||||
../../platform/emlib/src/em_eusart.c \
|
||||
../../platform/emlib/src/em_dbg.c \
|
||||
../../platform/emlib/src/em_cmu.c \
|
||||
../../platform/emlib/src/em_rmu.c \
|
||||
../../platform/emlib/src/em_vcmp.c \
|
||||
../../platform/emlib/src/em_gpio.c \
|
||||
../../platform/emlib/src/em_aes.c \
|
||||
../../platform/emlib/src/em_burtc.c \
|
||||
../../platform/emlib/src/em_usart.c \
|
||||
../../platform/emlib/src/em_qspi.c \
|
||||
../../platform/emlib/src/em_lesense.c \
|
||||
../../platform/emlib/src/em_adc.c \
|
||||
../../platform/emlib/src/em_core.c \
|
||||
../../platform/emlib/src/em_letimer.c \
|
||||
../../platform/emlib/src/em_idac.c \
|
||||
../../platform/emlib/src/em_ldma.c \
|
||||
../../platform/emlib/src/em_vdac.c \
|
||||
../../platform/emlib/src/em_rtc.c \
|
||||
../../platform/emlib/src/em_dac.c \
|
||||
../../platform/emlib/src/em_pcnt.c \
|
||||
../../platform/emlib/src/em_pdm.c \
|
||||
../../platform/emlib/src/em_cryotimer.c \
|
||||
../../platform/emlib/src/em_iadc.c \
|
||||
../../platform/emlib/src/em_acmp.c \
|
||||
../../platform/emlib/src/em_opamp.c \
|
||||
../../platform/emlib/src/em_timer.c \
|
||||
../../platform/emlib/src/em_i2c.c \
|
||||
../../platform/emlib/src/em_gpcrc.c \
|
||||
../../platform/emlib/src/em_crypto.c \
|
||||
../../platform/emlib/src/em_emu.c \
|
||||
../../platform/emlib/src/em_ebi.c \
|
||||
../../platform/emlib/src/em_leuart.c
|
||||
|
||||
292
myapps/blinky-old-32mg/linker_script/efr32mg21.ld
Normal file
292
myapps/blinky-old-32mg/linker_script/efr32mg21.ld
Normal file
|
|
@ -0,0 +1,292 @@
|
|||
/***************************************************************************//**
|
||||
* @file gcc_EFR32MG21.ld
|
||||
* @brief GNU Linker Script for Cortex-M based device
|
||||
* @version V2.2.0
|
||||
* @date 16. December 2020
|
||||
* Linker script for Silicon Labs EFR32MG21 devices
|
||||
*******************************************************************************
|
||||
* # License
|
||||
* <b>Copyright 2024 Silicon Laboratories, Inc. www.silabs.com </b>
|
||||
*******************************************************************************
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
*
|
||||
* The licensor of this software is Silicon Laboratories Inc.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
MEMORY
|
||||
{
|
||||
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 1024K
|
||||
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 96K
|
||||
}
|
||||
|
||||
/* Linker script to place sections and symbol values. Should be used together
|
||||
* with other linker script that defines memory regions FLASH and RAM.
|
||||
* It references following symbols, which must be defined in code:
|
||||
* Reset_Handler : Entry of reset handler
|
||||
*
|
||||
* It defines following symbols, which code can use without definition:
|
||||
* __exidx_start
|
||||
* __exidx_end
|
||||
* __copy_table_start__
|
||||
* __copy_table_end__
|
||||
* __zero_table_start__
|
||||
* __zero_table_end__
|
||||
* __etext
|
||||
* __data_start__
|
||||
* __preinit_array_start
|
||||
* __preinit_array_end
|
||||
* __init_array_start
|
||||
* __init_array_end
|
||||
* __fini_array_start
|
||||
* __fini_array_end
|
||||
* __data_end__
|
||||
* __bss_start__
|
||||
* __bss_end__
|
||||
* __end__
|
||||
* end
|
||||
* __HeapLimit
|
||||
* __StackLimit
|
||||
* __StackTop
|
||||
* __stack
|
||||
* __StackSeal (only if ARMv8-M stack sealing is used)
|
||||
*/
|
||||
|
||||
ENTRY(Reset_Handler)
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
.text :
|
||||
{
|
||||
KEEP(*(.vectors))
|
||||
*(.text*)
|
||||
|
||||
KEEP(*(.init))
|
||||
KEEP(*(.fini))
|
||||
|
||||
/* .ctors */
|
||||
*crtbegin.o(.ctors)
|
||||
*crtbegin?.o(.ctors)
|
||||
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
|
||||
*(SORT(.ctors.*))
|
||||
*(.ctors)
|
||||
|
||||
/* .dtors */
|
||||
*crtbegin.o(.dtors)
|
||||
*crtbegin?.o(.dtors)
|
||||
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
|
||||
*(SORT(.dtors.*))
|
||||
*(.dtors)
|
||||
|
||||
*(.rodata*)
|
||||
|
||||
KEEP(*(.eh_frame*))
|
||||
} > FLASH
|
||||
/*
|
||||
* SG veneers:
|
||||
* All SG veneers are placed in the special output section .gnu.sgstubs. Its start address
|
||||
* must be set, either with the command line option ‘--section-start’ or in a linker script,
|
||||
* to indicate where to place these veneers in memory.
|
||||
*/
|
||||
/*
|
||||
.gnu.sgstubs : ALIGN(32)
|
||||
{
|
||||
. = ALIGN(32);
|
||||
linker_sg_begin = .;
|
||||
KEEP(*(.gnu.sgstubs*))
|
||||
. = ALIGN(32);
|
||||
} > FLASH
|
||||
linker_sg_end = linker_sg_begin + SIZEOF(.gnu.sgstubs);
|
||||
*/
|
||||
.ARM.extab :
|
||||
{
|
||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||
} > FLASH
|
||||
|
||||
__exidx_start = .;
|
||||
.ARM.exidx :
|
||||
{
|
||||
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||
} > FLASH
|
||||
__exidx_end = .;
|
||||
|
||||
.copy.table :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
__copy_table_start__ = .;
|
||||
|
||||
LONG (__etext)
|
||||
LONG (__data_start__)
|
||||
LONG ((__data_end__ - __data_start__) / 4)
|
||||
|
||||
/* Add each additional data section here */
|
||||
/*
|
||||
LONG (__etext2)
|
||||
LONG (__data2_start__)
|
||||
LONG ((__data2_end__ - __data2_start__) / 4)
|
||||
*/
|
||||
__copy_table_end__ = .;
|
||||
} > FLASH
|
||||
|
||||
.zero.table :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
__zero_table_start__ = .;
|
||||
/* Add each additional bss section here */
|
||||
/*
|
||||
LONG (__bss2_start__)
|
||||
LONG ((__bss2_end__ - __bss2_start__) / 4)
|
||||
*/
|
||||
__zero_table_end__ = .;
|
||||
__etext = ALIGN(4);
|
||||
} > FLASH
|
||||
|
||||
.data : AT (__etext)
|
||||
{
|
||||
__data_start__ = .;
|
||||
*(vtable)
|
||||
*(.data*)
|
||||
. = ALIGN (4);
|
||||
PROVIDE (__ram_func_section_start = .);
|
||||
*(.ram)
|
||||
PROVIDE (__ram_func_section_end = .);
|
||||
|
||||
. = ALIGN(4);
|
||||
/* preinit data */
|
||||
PROVIDE_HIDDEN (__preinit_array_start = .);
|
||||
KEEP(*(.preinit_array))
|
||||
PROVIDE_HIDDEN (__preinit_array_end = .);
|
||||
|
||||
. = ALIGN(4);
|
||||
/* init data */
|
||||
PROVIDE_HIDDEN (__init_array_start = .);
|
||||
KEEP(*(SORT(.init_array.*)))
|
||||
KEEP(*(.init_array))
|
||||
PROVIDE_HIDDEN (__init_array_end = .);
|
||||
|
||||
. = ALIGN(4);
|
||||
/* finit data */
|
||||
PROVIDE_HIDDEN (__fini_array_start = .);
|
||||
KEEP(*(SORT(.fini_array.*)))
|
||||
KEEP(*(.fini_array))
|
||||
PROVIDE_HIDDEN (__fini_array_end = .);
|
||||
|
||||
KEEP(*(.jcr*))
|
||||
. = ALIGN(4);
|
||||
/* All data end */
|
||||
__data_end__ = .;
|
||||
|
||||
} > RAM
|
||||
|
||||
/*
|
||||
* Secondary data section, optional
|
||||
*
|
||||
* Remember to add each additional data section
|
||||
* to the .copy.table above to asure proper
|
||||
* initialization during startup.
|
||||
*/
|
||||
/*
|
||||
__etext2 = ALIGN (4);
|
||||
|
||||
.data2 : AT (__etext2)
|
||||
{
|
||||
. = ALIGN(4);
|
||||
__data2_start__ = .;
|
||||
*(.data2)
|
||||
*(.data2.*)
|
||||
. = ALIGN(4);
|
||||
__data2_end__ = .;
|
||||
|
||||
} > RAM2
|
||||
*/
|
||||
.bss :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
__bss_start__ = .;
|
||||
*(.bss)
|
||||
*(.bss.*)
|
||||
*(COMMON)
|
||||
. = ALIGN(4);
|
||||
__bss_end__ = .;
|
||||
} > RAM AT > RAM
|
||||
|
||||
/*
|
||||
* Secondary bss section, optional
|
||||
*
|
||||
* Remember to add each additional bss section
|
||||
* to the .zero.table above to asure proper
|
||||
* initialization during startup.
|
||||
*/
|
||||
/*
|
||||
.bss2 :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
__bss2_start__ = .;
|
||||
*(.bss2)
|
||||
*(.bss2.*)
|
||||
. = ALIGN(4);
|
||||
__bss2_end__ = .;
|
||||
} > RAM2 AT > RAM2
|
||||
*/
|
||||
|
||||
.heap (COPY):
|
||||
{
|
||||
__HeapBase = .;
|
||||
__end__ = .;
|
||||
end = __end__;
|
||||
_end = __end__;
|
||||
KEEP(*(.heap*))
|
||||
__HeapLimit = .;
|
||||
} > RAM
|
||||
/* ARMv8-M stack sealing:
|
||||
to use ARMv8-M stack sealing uncomment '.stackseal' section and KEEP(*(.stackseal*))
|
||||
in .stack_dummy section
|
||||
*/
|
||||
/*
|
||||
.stackseal (COPY) :
|
||||
{
|
||||
. = ALIGN(8);
|
||||
__StackSeal = .;
|
||||
. = . + 8;
|
||||
. = ALIGN(8);
|
||||
} > RAM
|
||||
*/
|
||||
|
||||
/* .stack_dummy section doesn't contains any symbols. It is only
|
||||
* used for linker to calculate size of stack sections, and assign
|
||||
* values to stack symbols later */
|
||||
.stack_dummy (COPY):
|
||||
{
|
||||
KEEP(*(.stack*))
|
||||
/* KEEP(*(.stackseal*))*/
|
||||
} > RAM
|
||||
|
||||
/* Set stack top to end of RAM, and stack limit move down by
|
||||
* size of stack_dummy section */
|
||||
__StackTop = ORIGIN(RAM) + LENGTH(RAM);
|
||||
__StackLimit = __StackTop - SIZEOF(.stack_dummy);
|
||||
PROVIDE(__stack = __StackTop);
|
||||
|
||||
/* Check if data + heap + stack exceeds RAM limit */
|
||||
ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
|
||||
|
||||
/* Check if FLASH usage exceeds FLASH size */
|
||||
ASSERT( LENGTH(FLASH) >= (__etext + SIZEOF(.data)), "FLASH memory overflowed !")
|
||||
}
|
||||
76
myapps/blinky-old-32mg/main.mk
Normal file
76
myapps/blinky-old-32mg/main.mk
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
CC = arm-none-eabi-gcc
|
||||
SIZE = arm-none-eabi-size
|
||||
OBJCOPY = arm-none-eabi-objcopy
|
||||
|
||||
COMMON_FLAGS = \
|
||||
-mcpu=cortex-m33 \
|
||||
-mthumb \
|
||||
-mfpu=fpv5-sp-d16 \
|
||||
-mfloat-abi=hard \
|
||||
-std=c99 \
|
||||
-Wall \
|
||||
-Wextra \
|
||||
-Os \
|
||||
-fdata-sections \
|
||||
-ffunction-sections \
|
||||
-fomit-frame-pointer \
|
||||
-imacros sl_gcc_preinclude.h \
|
||||
-mcmse \
|
||||
-g
|
||||
|
||||
DEFINES = -DEFR32MG21A020F768IM32
|
||||
|
||||
INCLUDE += -I include -I../../platform/CMSIS/Core/Include \
|
||||
-I../../platform/Device/SiliconLabs/EFR32MG21/Include \
|
||||
-I../../platform/common/inc \
|
||||
-I ../../platform/common/toolchain/inc \
|
||||
-I ../../platform/emlib/inc
|
||||
|
||||
|
||||
CFLAGS := $(COMMON_FLAGS) $(INCLUDE) $(DEFINES)
|
||||
|
||||
SUBMAKEFILES := emlib.mk
|
||||
SOURCES := ../../platform/Device/SiliconLabs/EFR32MG21/Source/system_efr32mg21.c \
|
||||
src/main.c
|
||||
|
||||
|
||||
BUILD_DIR := build
|
||||
TARGET_DIR := build_output
|
||||
|
||||
#nosys.specs are required for printf
|
||||
LDFLAGS = \
|
||||
-mcpu=cortex-m33 \
|
||||
-mthumb \
|
||||
-mfpu=fpv5-sp-d16 \
|
||||
-mfloat-abi=hard \
|
||||
-T"linker_script/efr32mg21.ld" \
|
||||
--specs=nano.specs \
|
||||
--specs=nosys.specs \
|
||||
-Xlinker -Map=$(TARGET_DIR)/main.map \
|
||||
-Wl,--gc-sections
|
||||
|
||||
# Startup file
|
||||
LDLIBS := ../../platform/Device/SiliconLabs/EFR32MG21/Source/GCC/startup_efr32mg21.S
|
||||
|
||||
###########
|
||||
|
||||
GROUP_START =-Wl,--start-group
|
||||
GROUP_END =-Wl,--end-group
|
||||
|
||||
PROJECT_LIBS = \
|
||||
-lgcc \
|
||||
-lc \
|
||||
-lm \
|
||||
-lnosys
|
||||
|
||||
LIBS += $(GROUP_START) $(PROJECT_LIBS) $(GROUP_END)
|
||||
|
||||
TGT_LDFLAGS += $(LIBS)
|
||||
##########
|
||||
|
||||
TARGET := main.elf
|
||||
|
||||
size: $(TARGET_DIR)/main.elf
|
||||
$(SIZE) $(TARGET_DIR)/main.elf
|
||||
|
||||
|
||||
17
myapps/blinky-old-32mg/src/main.c
Normal file
17
myapps/blinky-old-32mg/src/main.c
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
#include "em_cmu.h"
|
||||
#include "em_gpio.h"
|
||||
|
||||
int main (void)
|
||||
{
|
||||
CMU_ClockEnable(cmuClock_GPIO, true);
|
||||
GPIO_PinModeSet(gpioPortA, 0/*pin 0*/, gpioModePushPull /*push-pull output*/, 1/*output level*/);
|
||||
|
||||
while(1) {
|
||||
GPIO_PinOutToggle(gpioPortA, 0/*pin 0*/);
|
||||
for (volatile uint32_t i = 0; i < 100000; i++) { } // busy delay
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
375
myapps/blinky-old/Makefile
Normal file
375
myapps/blinky-old/Makefile
Normal file
|
|
@ -0,0 +1,375 @@
|
|||
# boilermake: A reusable, but flexible, boilerplate Makefile.
|
||||
#
|
||||
# Copyright 2008, 2009, 2010 Dan Moulding, Alan T. DeKok
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Caution: Don't edit this Makefile! Create your own main.mk and other
|
||||
# submakefiles, which will be included by this Makefile.
|
||||
# Only edit this if you need to modify boilermake's behavior (fix
|
||||
# bugs, add features, etc).
|
||||
|
||||
# Note: Parameterized "functions" in this makefile that are marked with
|
||||
# "USE WITH EVAL" are only useful in conjuction with eval. This is
|
||||
# because those functions result in a block of Makefile syntax that must
|
||||
# be evaluated after expansion. Since they must be used with eval, most
|
||||
# instances of "$" within them need to be escaped with a second "$" to
|
||||
# accomodate the double expansion that occurs when eval is invoked.
|
||||
|
||||
# ADD_CLEAN_RULE - Parameterized "function" that adds a new rule and phony
|
||||
# target for cleaning the specified target (removing its build-generated
|
||||
# files).
|
||||
#
|
||||
# USE WITH EVAL
|
||||
#
|
||||
define ADD_CLEAN_RULE
|
||||
clean: clean_${1}
|
||||
.PHONY: clean_${1}
|
||||
clean_${1}:
|
||||
$$(strip rm -f ${TARGET_DIR}/${1} $${${1}_OBJS:%.o=%.[doP]})
|
||||
$${${1}_POSTCLEAN}
|
||||
endef
|
||||
|
||||
# ADD_OBJECT_RULE - Parameterized "function" that adds a pattern rule for
|
||||
# building object files from source files with the filename extension
|
||||
# specified in the second argument. The first argument must be the name of the
|
||||
# base directory where the object files should reside (such that the portion
|
||||
# of the path after the base directory will match the path to corresponding
|
||||
# source files). The third argument must contain the rules used to compile the
|
||||
# source files into object code form.
|
||||
#
|
||||
# USE WITH EVAL
|
||||
#
|
||||
define ADD_OBJECT_RULE
|
||||
${1}/%.o: ${2}
|
||||
${3}
|
||||
endef
|
||||
|
||||
# ADD_TARGET_RULE - Parameterized "function" that adds a new target to the
|
||||
# Makefile. The target may be an executable or a library. The two allowable
|
||||
# types of targets are distinguished based on the name: library targets must
|
||||
# end with the traditional ".a" extension.
|
||||
#
|
||||
# USE WITH EVAL
|
||||
#
|
||||
define ADD_TARGET_RULE
|
||||
ifeq "$$(suffix ${1})" ".a"
|
||||
# Add a target for creating a static library.
|
||||
$${TARGET_DIR}/${1}: $${${1}_OBJS}
|
||||
@mkdir -p $$(dir $$@)
|
||||
$$(strip $${AR} $${ARFLAGS} $$@ $${${1}_OBJS})
|
||||
$${${1}_POSTMAKE}
|
||||
else
|
||||
# Add a target for linking an executable. First, attempt to select the
|
||||
# appropriate front-end to use for linking. This might not choose the
|
||||
# right one (e.g. if linking with a C++ static library, but all other
|
||||
# sources are C sources), so the user makefile is allowed to specify a
|
||||
# linker to be used for each target.
|
||||
ifeq "$$(strip $${${1}_LINKER})" ""
|
||||
# No linker was explicitly specified to be used for this target. If
|
||||
# there are any C++ sources for this target, use the C++ compiler.
|
||||
# For all other targets, default to using the C compiler.
|
||||
ifneq "$$(strip $$(filter $${CXX_SRC_EXTS},$${${1}_SOURCES}))" ""
|
||||
${1}_LINKER = $${CXX}
|
||||
else
|
||||
${1}_LINKER = $${CC}
|
||||
endif
|
||||
endif
|
||||
|
||||
$${TARGET_DIR}/${1}: $${${1}_OBJS} $${${1}_PREREQS}
|
||||
@mkdir -p $$(dir $$@)
|
||||
$$(strip $${${1}_LINKER} -o $$@ $${LDFLAGS} $${${1}_LDFLAGS} \
|
||||
$${${1}_OBJS} $${LDLIBS} $${${1}_LDLIBS})
|
||||
$${${1}_POSTMAKE}
|
||||
endif
|
||||
endef
|
||||
|
||||
# CANONICAL_PATH - Given one or more paths, converts the paths to the canonical
|
||||
# form. The canonical form is the path, relative to the project's top-level
|
||||
# directory (the directory from which "make" is run), and without
|
||||
# any "./" or "../" sequences. For paths that are not located below the
|
||||
# top-level directory, the canonical form is the absolute path (i.e. from
|
||||
# the root of the filesystem) also without "./" or "../" sequences.
|
||||
define CANONICAL_PATH
|
||||
$(patsubst ${CURDIR}/%,%,$(abspath ${1}))
|
||||
endef
|
||||
|
||||
# COMPILE_C_CMDS - Commands for compiling C source code.
|
||||
define COMPILE_C_CMDS
|
||||
@mkdir -p $(dir $@)
|
||||
$(strip ${CC} -o $@ -c -MD ${CFLAGS} ${SRC_CFLAGS} ${INCDIRS} \
|
||||
${SRC_INCDIRS} ${SRC_DEFS} ${DEFS} $<)
|
||||
@cp ${@:%$(suffix $@)=%.d} ${@:%$(suffix $@)=%.P}; \
|
||||
sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
|
||||
-e '/^$$/ d' -e 's/$$/ :/' < ${@:%$(suffix $@)=%.d} \
|
||||
>> ${@:%$(suffix $@)=%.P}; \
|
||||
rm -f ${@:%$(suffix $@)=%.d}
|
||||
endef
|
||||
|
||||
# COMPILE_CXX_CMDS - Commands for compiling C++ source code.
|
||||
define COMPILE_CXX_CMDS
|
||||
@mkdir -p $(dir $@)
|
||||
$(strip ${CXX} -o $@ -c -MD ${CXXFLAGS} ${SRC_CXXFLAGS} ${INCDIRS} \
|
||||
${SRC_INCDIRS} ${SRC_DEFS} ${DEFS} $<)
|
||||
@cp ${@:%$(suffix $@)=%.d} ${@:%$(suffix $@)=%.P}; \
|
||||
sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
|
||||
-e '/^$$/ d' -e 's/$$/ :/' < ${@:%$(suffix $@)=%.d} \
|
||||
>> ${@:%$(suffix $@)=%.P}; \
|
||||
rm -f ${@:%$(suffix $@)=%.d}
|
||||
endef
|
||||
|
||||
# INCLUDE_SUBMAKEFILE - Parameterized "function" that includes a new
|
||||
# "submakefile" fragment into the overall Makefile. It also recursively
|
||||
# includes all submakefiles of the specified submakefile fragment.
|
||||
#
|
||||
# USE WITH EVAL
|
||||
#
|
||||
define INCLUDE_SUBMAKEFILE
|
||||
# Initialize all variables that can be defined by a makefile fragment, then
|
||||
# include the specified makefile fragment.
|
||||
TARGET :=
|
||||
TGT_CFLAGS :=
|
||||
TGT_CXXFLAGS :=
|
||||
TGT_DEFS :=
|
||||
TGT_INCDIRS :=
|
||||
TGT_LDFLAGS :=
|
||||
TGT_LDLIBS :=
|
||||
TGT_LINKER :=
|
||||
TGT_POSTCLEAN :=
|
||||
TGT_POSTMAKE :=
|
||||
TGT_PREREQS :=
|
||||
|
||||
SOURCES :=
|
||||
SRC_CFLAGS :=
|
||||
SRC_CXXFLAGS :=
|
||||
SRC_DEFS :=
|
||||
SRC_INCDIRS :=
|
||||
|
||||
SUBMAKEFILES :=
|
||||
|
||||
# A directory stack is maintained so that the correct paths are used as we
|
||||
# recursively include all submakefiles. Get the makefile's directory and
|
||||
# push it onto the stack.
|
||||
DIR := $(call CANONICAL_PATH,$(dir ${1}))
|
||||
DIR_STACK := $$(call PUSH,$${DIR_STACK},$${DIR})
|
||||
|
||||
include ${1}
|
||||
|
||||
# Initialize internal local variables.
|
||||
OBJS :=
|
||||
|
||||
# Ensure that valid values are set for BUILD_DIR and TARGET_DIR.
|
||||
ifeq "$$(strip $${BUILD_DIR})" ""
|
||||
BUILD_DIR := build
|
||||
endif
|
||||
ifeq "$$(strip $${TARGET_DIR})" ""
|
||||
TARGET_DIR := .
|
||||
endif
|
||||
|
||||
# Determine which target this makefile's variables apply to. A stack is
|
||||
# used to keep track of which target is the "current" target as we
|
||||
# recursively include other submakefiles.
|
||||
ifneq "$$(strip $${TARGET})" ""
|
||||
# This makefile defined a new target. Target variables defined by this
|
||||
# makefile apply to this new target. Initialize the target's variables.
|
||||
TGT := $$(strip $${TARGET})
|
||||
ALL_TGTS += $${TGT}
|
||||
$${TGT}_CFLAGS := $${TGT_CFLAGS}
|
||||
$${TGT}_CXXFLAGS := $${TGT_CXXFLAGS}
|
||||
$${TGT}_DEFS := $${TGT_DEFS}
|
||||
$${TGT}_DEPS :=
|
||||
TGT_INCDIRS := $$(call QUALIFY_PATH,$${DIR},$${TGT_INCDIRS})
|
||||
TGT_INCDIRS := $$(call CANONICAL_PATH,$${TGT_INCDIRS})
|
||||
$${TGT}_INCDIRS := $${TGT_INCDIRS}
|
||||
$${TGT}_LDFLAGS := $${TGT_LDFLAGS}
|
||||
$${TGT}_LDLIBS := $${TGT_LDLIBS}
|
||||
$${TGT}_LINKER := $${TGT_LINKER}
|
||||
$${TGT}_OBJS :=
|
||||
$${TGT}_POSTCLEAN := $${TGT_POSTCLEAN}
|
||||
$${TGT}_POSTMAKE := $${TGT_POSTMAKE}
|
||||
$${TGT}_PREREQS := $$(addprefix $${TARGET_DIR}/,$${TGT_PREREQS})
|
||||
$${TGT}_SOURCES :=
|
||||
else
|
||||
# The values defined by this makefile apply to the the "current" target
|
||||
# as determined by which target is at the top of the stack.
|
||||
TGT := $$(strip $$(call PEEK,$${TGT_STACK}))
|
||||
$${TGT}_CFLAGS += $${TGT_CFLAGS}
|
||||
$${TGT}_CXXFLAGS += $${TGT_CXXFLAGS}
|
||||
$${TGT}_DEFS += $${TGT_DEFS}
|
||||
TGT_INCDIRS := $$(call QUALIFY_PATH,$${DIR},$${TGT_INCDIRS})
|
||||
TGT_INCDIRS := $$(call CANONICAL_PATH,$${TGT_INCDIRS})
|
||||
$${TGT}_INCDIRS += $${TGT_INCDIRS}
|
||||
$${TGT}_LDFLAGS += $${TGT_LDFLAGS}
|
||||
$${TGT}_LDLIBS += $${TGT_LDLIBS}
|
||||
$${TGT}_POSTCLEAN += $${TGT_POSTCLEAN}
|
||||
$${TGT}_POSTMAKE += $${TGT_POSTMAKE}
|
||||
$${TGT}_PREREQS += $${TGT_PREREQS}
|
||||
endif
|
||||
|
||||
# Push the current target onto the target stack.
|
||||
TGT_STACK := $$(call PUSH,$${TGT_STACK},$${TGT})
|
||||
|
||||
ifneq "$$(strip $${SOURCES})" ""
|
||||
# This makefile builds one or more objects from source. Validate the
|
||||
# specified sources against the supported source file types.
|
||||
BAD_SRCS := $$(strip $$(filter-out $${ALL_SRC_EXTS},$${SOURCES}))
|
||||
ifneq "$${BAD_SRCS}" ""
|
||||
$$(error Unsupported source file(s) found in ${1} [$${BAD_SRCS}])
|
||||
endif
|
||||
|
||||
# Qualify and canonicalize paths.
|
||||
SOURCES := $$(call QUALIFY_PATH,$${DIR},$${SOURCES})
|
||||
SOURCES := $$(call CANONICAL_PATH,$${SOURCES})
|
||||
SRC_INCDIRS := $$(call QUALIFY_PATH,$${DIR},$${SRC_INCDIRS})
|
||||
SRC_INCDIRS := $$(call CANONICAL_PATH,$${SRC_INCDIRS})
|
||||
|
||||
# Save the list of source files for this target.
|
||||
$${TGT}_SOURCES += $${SOURCES}
|
||||
|
||||
# Convert the source file names to their corresponding object file
|
||||
# names.
|
||||
OBJS := $$(addprefix $${BUILD_DIR}/$$(call CANONICAL_PATH,$${TGT})/,\
|
||||
$$(addsuffix .o,$$(basename $${SOURCES})))
|
||||
|
||||
# Add the objects to the current target's list of objects, and create
|
||||
# target-specific variables for the objects based on any source
|
||||
# variables that were defined.
|
||||
$${TGT}_OBJS += $${OBJS}
|
||||
$${TGT}_DEPS += $${OBJS:%.o=%.P}
|
||||
$${OBJS}: SRC_CFLAGS := $${$${TGT}_CFLAGS} $${SRC_CFLAGS}
|
||||
$${OBJS}: SRC_CXXFLAGS := $${$${TGT}_CXXFLAGS} $${SRC_CXXFLAGS}
|
||||
$${OBJS}: SRC_DEFS := $$(addprefix -D,$${$${TGT}_DEFS} $${SRC_DEFS})
|
||||
$${OBJS}: SRC_INCDIRS := $$(addprefix -I,\
|
||||
$${$${TGT}_INCDIRS} $${SRC_INCDIRS})
|
||||
endif
|
||||
|
||||
ifneq "$$(strip $${SUBMAKEFILES})" ""
|
||||
# This makefile has submakefiles. Recursively include them.
|
||||
$$(foreach MK,$${SUBMAKEFILES},\
|
||||
$$(eval $$(call INCLUDE_SUBMAKEFILE,\
|
||||
$$(call CANONICAL_PATH,\
|
||||
$$(call QUALIFY_PATH,$${DIR},$${MK})))))
|
||||
endif
|
||||
|
||||
# Reset the "current" target to it's previous value.
|
||||
TGT_STACK := $$(call POP,$${TGT_STACK})
|
||||
TGT := $$(call PEEK,$${TGT_STACK})
|
||||
|
||||
# Reset the "current" directory to it's previous value.
|
||||
DIR_STACK := $$(call POP,$${DIR_STACK})
|
||||
DIR := $$(call PEEK,$${DIR_STACK})
|
||||
endef
|
||||
|
||||
# MIN - Parameterized "function" that results in the minimum lexical value of
|
||||
# the two values given.
|
||||
define MIN
|
||||
$(firstword $(sort ${1} ${2}))
|
||||
endef
|
||||
|
||||
# PEEK - Parameterized "function" that results in the value at the top of the
|
||||
# specified colon-delimited stack.
|
||||
define PEEK
|
||||
$(lastword $(subst :, ,${1}))
|
||||
endef
|
||||
|
||||
# POP - Parameterized "function" that pops the top value off of the specified
|
||||
# colon-delimited stack, and results in the new value of the stack. Note that
|
||||
# the popped value cannot be obtained using this function; use peek for that.
|
||||
define POP
|
||||
${1:%:$(lastword $(subst :, ,${1}))=%}
|
||||
endef
|
||||
|
||||
# PUSH - Parameterized "function" that pushes a value onto the specified colon-
|
||||
# delimited stack, and results in the new value of the stack.
|
||||
define PUSH
|
||||
${2:%=${1}:%}
|
||||
endef
|
||||
|
||||
# QUALIFY_PATH - Given a "root" directory and one or more paths, qualifies the
|
||||
# paths using the "root" directory (i.e. appends the root directory name to
|
||||
# the paths) except for paths that are absolute.
|
||||
define QUALIFY_PATH
|
||||
$(addprefix ${1}/,$(filter-out /%,${2})) $(filter /%,${2})
|
||||
endef
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Start of Makefile Evaluation
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
# Older versions of GNU Make lack capabilities needed by boilermake.
|
||||
# With older versions, "make" may simply output "nothing to do", likely leading
|
||||
# to confusion. To avoid this, check the version of GNU make up-front and
|
||||
# inform the user if their version of make doesn't meet the minimum required.
|
||||
MIN_MAKE_VERSION := 3.81
|
||||
MIN_MAKE_VER_MSG := boilermake requires GNU Make ${MIN_MAKE_VERSION} or greater
|
||||
ifeq "${MAKE_VERSION}" ""
|
||||
$(info GNU Make not detected)
|
||||
$(error ${MIN_MAKE_VER_MSG})
|
||||
endif
|
||||
ifneq "${MIN_MAKE_VERSION}" "$(call MIN,${MIN_MAKE_VERSION},${MAKE_VERSION})"
|
||||
$(info This is GNU Make version ${MAKE_VERSION})
|
||||
$(error ${MIN_MAKE_VER_MSG})
|
||||
endif
|
||||
|
||||
# Define the source file extensions that we know how to handle.
|
||||
C_SRC_EXTS := %.c %.S
|
||||
CXX_SRC_EXTS := %.C %.cc %.cp %.cpp %.CPP %.cxx %.c++
|
||||
ALL_SRC_EXTS := ${C_SRC_EXTS} ${CXX_SRC_EXTS}
|
||||
|
||||
# Initialize global variables.
|
||||
ALL_TGTS :=
|
||||
DEFS :=
|
||||
DIR_STACK :=
|
||||
INCDIRS :=
|
||||
TGT_STACK :=
|
||||
|
||||
# Include the main user-supplied submakefile. This also recursively includes
|
||||
# all other user-supplied submakefiles.
|
||||
$(eval $(call INCLUDE_SUBMAKEFILE,main.mk))
|
||||
|
||||
# Perform post-processing on global variables as needed.
|
||||
DEFS := $(addprefix -D,${DEFS})
|
||||
INCDIRS := $(addprefix -I,$(call CANONICAL_PATH,${INCDIRS}))
|
||||
|
||||
# Define the "all" target (which simply builds all user-defined targets) as the
|
||||
# default goal.
|
||||
.PHONY: all
|
||||
all: $(addprefix ${TARGET_DIR}/,${ALL_TGTS})
|
||||
|
||||
# Add a new target rule for each user-defined target.
|
||||
$(foreach TGT,${ALL_TGTS},\
|
||||
$(eval $(call ADD_TARGET_RULE,${TGT})))
|
||||
|
||||
# Add pattern rule(s) for creating compiled object code from C source.
|
||||
$(foreach TGT,${ALL_TGTS},\
|
||||
$(foreach EXT,${C_SRC_EXTS},\
|
||||
$(eval $(call ADD_OBJECT_RULE,${BUILD_DIR}/$(call CANONICAL_PATH,${TGT}),\
|
||||
${EXT},$${COMPILE_C_CMDS}))))
|
||||
|
||||
# Add pattern rule(s) for creating compiled object code from C++ source.
|
||||
$(foreach TGT,${ALL_TGTS},\
|
||||
$(foreach EXT,${CXX_SRC_EXTS},\
|
||||
$(eval $(call ADD_OBJECT_RULE,${BUILD_DIR}/$(call CANONICAL_PATH,${TGT}),\
|
||||
${EXT},$${COMPILE_CXX_CMDS}))))
|
||||
|
||||
# Add "clean" rules to remove all build-generated files.
|
||||
.PHONY: clean
|
||||
$(foreach TGT,${ALL_TGTS},\
|
||||
$(eval $(call ADD_CLEAN_RULE,${TGT})))
|
||||
|
||||
# Include generated rules that define additional (header) dependencies.
|
||||
$(foreach TGT,${ALL_TGTS},\
|
||||
$(eval -include ${${TGT}_DEPS}))
|
||||
44
myapps/blinky-old/emlib.mk
Normal file
44
myapps/blinky-old/emlib.mk
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
SOURCES := ../../platform/emlib/src/em_cmu_fpga.c \
|
||||
../../platform/emlib/src/em_dma.c \
|
||||
../../platform/emlib/src/em_csen.c \
|
||||
../../platform/emlib/src/em_msc.c \
|
||||
../../platform/emlib/src/em_lcd.c \
|
||||
../../platform/emlib/src/em_rtcc.c \
|
||||
../../platform/emlib/src/em_can.c \
|
||||
../../platform/emlib/src/em_wdog.c \
|
||||
../../platform/emlib/src/em_system.c \
|
||||
../../platform/emlib/src/em_prs.c \
|
||||
../../platform/emlib/src/em_se.c \
|
||||
../../platform/emlib/src/em_eusart.c \
|
||||
../../platform/emlib/src/em_dbg.c \
|
||||
../../platform/emlib/src/em_cmu.c \
|
||||
../../platform/emlib/src/em_rmu.c \
|
||||
../../platform/emlib/src/em_vcmp.c \
|
||||
../../platform/emlib/src/em_gpio.c \
|
||||
../../platform/emlib/src/em_aes.c \
|
||||
../../platform/emlib/src/em_burtc.c \
|
||||
../../platform/emlib/src/em_usart.c \
|
||||
../../platform/emlib/src/em_qspi.c \
|
||||
../../platform/emlib/src/em_lesense.c \
|
||||
../../platform/emlib/src/em_adc.c \
|
||||
../../platform/emlib/src/em_core.c \
|
||||
../../platform/emlib/src/em_letimer.c \
|
||||
../../platform/emlib/src/em_idac.c \
|
||||
../../platform/emlib/src/em_ldma.c \
|
||||
../../platform/emlib/src/em_vdac.c \
|
||||
../../platform/emlib/src/em_rtc.c \
|
||||
../../platform/emlib/src/em_dac.c \
|
||||
../../platform/emlib/src/em_pcnt.c \
|
||||
../../platform/emlib/src/em_pdm.c \
|
||||
../../platform/emlib/src/em_cryotimer.c \
|
||||
../../platform/emlib/src/em_iadc.c \
|
||||
../../platform/emlib/src/em_acmp.c \
|
||||
../../platform/emlib/src/em_opamp.c \
|
||||
../../platform/emlib/src/em_timer.c \
|
||||
../../platform/emlib/src/em_i2c.c \
|
||||
../../platform/emlib/src/em_gpcrc.c \
|
||||
../../platform/emlib/src/em_crypto.c \
|
||||
../../platform/emlib/src/em_emu.c \
|
||||
../../platform/emlib/src/em_ebi.c \
|
||||
../../platform/emlib/src/em_leuart.c
|
||||
|
||||
76
myapps/blinky-old/main.mk
Normal file
76
myapps/blinky-old/main.mk
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
CC = arm-none-eabi-gcc
|
||||
SIZE = arm-none-eabi-size
|
||||
OBJCOPY = arm-none-eabi-objcopy
|
||||
|
||||
COMMON_FLAGS = \
|
||||
-mcpu=cortex-m33 \
|
||||
-mthumb \
|
||||
-mfpu=fpv5-sp-d16 \
|
||||
-mfloat-abi=hard \
|
||||
-std=c99 \
|
||||
-Wall \
|
||||
-Wextra \
|
||||
-Os \
|
||||
-fdata-sections \
|
||||
-ffunction-sections \
|
||||
-fomit-frame-pointer \
|
||||
-imacros sl_gcc_preinclude.h \
|
||||
-mcmse \
|
||||
-g
|
||||
|
||||
DEFINES = -DEFR32BG22C224F512GM32
|
||||
|
||||
INCLUDE += -I include -I../../platform/CMSIS/Core/Include \
|
||||
-I../../platform/Device/SiliconLabs/EFR32BG22/Include \
|
||||
-I../../platform/common/inc \
|
||||
-I ../../platform/common/toolchain/inc \
|
||||
-I ../../platform/emlib/inc
|
||||
|
||||
|
||||
CFLAGS := $(COMMON_FLAGS) $(INCLUDE) $(DEFINES)
|
||||
|
||||
SUBMAKEFILES := emlib.mk
|
||||
SOURCES := ../../platform/Device/SiliconLabs/EFR32BG22/Source/system_efr32bg22.c \
|
||||
src/main.c
|
||||
|
||||
|
||||
BUILD_DIR := build
|
||||
TARGET_DIR := build_output
|
||||
|
||||
#nosys.specs are required for printf
|
||||
LDFLAGS = \
|
||||
-mcpu=cortex-m33 \
|
||||
-mthumb \
|
||||
-mfpu=fpv5-sp-d16 \
|
||||
-mfloat-abi=hard \
|
||||
-T"../../platform/Device/SiliconLabs/EFR32BG22/Source/GCC/efr32bg22.ld" \
|
||||
--specs=nano.specs \
|
||||
--specs=nosys.specs \
|
||||
-Xlinker -Map=$(TARGET_DIR)/main.map \
|
||||
-Wl,--gc-sections
|
||||
|
||||
# Startup file
|
||||
LDLIBS := ../../platform/Device/SiliconLabs/EFR32BG22/Source/GCC/startup_efr32bg22.S
|
||||
|
||||
###########
|
||||
|
||||
GROUP_START =-Wl,--start-group
|
||||
GROUP_END =-Wl,--end-group
|
||||
|
||||
PROJECT_LIBS = \
|
||||
-lgcc \
|
||||
-lc \
|
||||
-lm \
|
||||
-lnosys
|
||||
|
||||
LIBS += $(GROUP_START) $(PROJECT_LIBS) $(GROUP_END)
|
||||
|
||||
TGT_LDFLAGS += $(LIBS)
|
||||
##########
|
||||
|
||||
TARGET := main.elf
|
||||
|
||||
size: $(TARGET_DIR)/main.elf
|
||||
$(SIZE) $(TARGET_DIR)/main.elf
|
||||
|
||||
|
||||
17
myapps/blinky-old/src/main.c
Normal file
17
myapps/blinky-old/src/main.c
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
#include "em_cmu.h"
|
||||
#include "em_gpio.h"
|
||||
|
||||
int main (void)
|
||||
{
|
||||
CMU_ClockEnable(cmuClock_GPIO, true);
|
||||
GPIO_PinModeSet(gpioPortA, 0/*pin 0*/, gpioModePushPull /*push-pull output*/, 1/*output level*/);
|
||||
|
||||
while(1) {
|
||||
GPIO_PinOutToggle(gpioPortA, 0/*pin 0*/);
|
||||
for (volatile uint32_t i = 0; i < 100000; i++) { } // busy delay
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
175
myapps/blinky/Makefile
Normal file
175
myapps/blinky/Makefile
Normal file
|
|
@ -0,0 +1,175 @@
|
|||
######################################
|
||||
# target
|
||||
######################################
|
||||
TARGET = blinky
|
||||
|
||||
|
||||
######################################
|
||||
# building variables
|
||||
######################################
|
||||
# debug build?
|
||||
DEBUG = 1
|
||||
# optimization for size
|
||||
OPT = -Os
|
||||
|
||||
|
||||
#######################################
|
||||
# paths
|
||||
#######################################
|
||||
# Build path
|
||||
BUILD_DIR = build
|
||||
|
||||
######################################
|
||||
# source
|
||||
######################################
|
||||
# C sources
|
||||
include emlib.mk
|
||||
C_SOURCES += \
|
||||
../../platform/Device/SiliconLabs/EFR32BG22/Source/system_efr32bg22.c \
|
||||
src/main.c
|
||||
|
||||
|
||||
# ASM sources
|
||||
LDLIBS1 = \
|
||||
../../platform/Device/SiliconLabs/EFR32BG22/Source/GCC/startup_efr32bg22.S
|
||||
|
||||
#######################################
|
||||
# binaries
|
||||
#######################################
|
||||
PREFIX = arm-none-eabi-
|
||||
|
||||
CC = $(PREFIX)gcc
|
||||
CP = $(PREFIX)objcopy
|
||||
SZ = $(PREFIX)size
|
||||
|
||||
HEX = $(CP) -O ihex
|
||||
BIN = $(CP) -O binary -S
|
||||
|
||||
#######################################
|
||||
# CFLAGS
|
||||
#######################################
|
||||
# cpu
|
||||
CPU = \
|
||||
-mcpu=cortex-m33 \
|
||||
-mthumb \
|
||||
-mfpu=fpv5-sp-d16 \
|
||||
-mfloat-abi=hard \
|
||||
-std=c99 \
|
||||
-Wall \
|
||||
-Wextra \
|
||||
-fdata-sections \
|
||||
-ffunction-sections \
|
||||
-fomit-frame-pointer \
|
||||
-imacros sl_gcc_preinclude.h \
|
||||
-mcmse
|
||||
|
||||
DEFINES = -DEFR32BG22C224F512GM32
|
||||
|
||||
# fpu
|
||||
FPU =
|
||||
|
||||
# float-abi
|
||||
FLOAT-ABI =
|
||||
|
||||
# mcu
|
||||
MCU = $(CPU) $(FPU) $(FLOAT-ABI)
|
||||
|
||||
# C includes
|
||||
C_INCLUDES = \
|
||||
-I include -I../../platform/CMSIS/Core/Include \
|
||||
-I../../platform/Device/SiliconLabs/EFR32BG22/Include \
|
||||
-I../../platform/common/inc \
|
||||
-I ../../platform/common/toolchain/inc \
|
||||
-I ../../platform/emlib/inc
|
||||
|
||||
# compile gcc flags
|
||||
CFLAGS = $(MCU) $(C_INCLUDES) $(OPT) $(DEFINES)
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
CFLAGS += -g
|
||||
endif
|
||||
|
||||
|
||||
# Generate dependency information <<<<<<<<<<<<<<<<<<<<<<< check
|
||||
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"
|
||||
|
||||
|
||||
#######################################
|
||||
# LDFLAGS
|
||||
#######################################
|
||||
# link script
|
||||
LDSCRIPT = ../../platform/Device/SiliconLabs/EFR32BG22/Source/GCC/efr32bg22.ld
|
||||
|
||||
# libraries
|
||||
GROUP_START =-Wl,--start-group
|
||||
GROUP_END =-Wl,--end-group
|
||||
|
||||
PROJECT_LIBS = \
|
||||
-lgcc \
|
||||
-lc \
|
||||
-lm \
|
||||
-lnosys
|
||||
|
||||
|
||||
LIBS = $(GROUP_START) $(PROJECT_LIBS) $(GROUP_END)
|
||||
LIBDIR =
|
||||
LDFLAGS = \
|
||||
-mcpu=cortex-m33 \
|
||||
-mthumb \
|
||||
-mfpu=fpv5-sp-d16 \
|
||||
-mfloat-abi=hard \
|
||||
-T $(LDSCRIPT) \
|
||||
--specs=nano.specs \
|
||||
--specs=nosys.specs \
|
||||
-Xlinker -Map=$(BUILD_DIR)/$(TARGET).map \
|
||||
-Wl,--gc-sections \
|
||||
$(LIBS)
|
||||
|
||||
# default action: build all
|
||||
all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin
|
||||
|
||||
|
||||
#######################################
|
||||
# build the application
|
||||
#######################################
|
||||
# list of objects
|
||||
OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
|
||||
vpath %.c $(sort $(dir $(C_SOURCES)))
|
||||
|
||||
# list of ASM program objects
|
||||
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.S=.o)))
|
||||
vpath %.S $(sort $(dir $(ASM_SOURCES)))
|
||||
|
||||
$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)
|
||||
$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@
|
||||
|
||||
#$(LUAOBJECTS) $(OBJECTS)
|
||||
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
|
||||
$(CC) $(OBJECTS) $(LDFLAGS) $(LDLIBS1) -o $@
|
||||
$(SZ) $@
|
||||
|
||||
$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
|
||||
$(HEX) $< $@
|
||||
|
||||
$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
|
||||
$(BIN) $< $@
|
||||
|
||||
$(BUILD_DIR):
|
||||
mkdir $@
|
||||
|
||||
#######################################
|
||||
# Program
|
||||
#######################################
|
||||
|
||||
#######################################
|
||||
# clean up
|
||||
#######################################
|
||||
clean:
|
||||
-rm -fR $(BUILD_DIR)
|
||||
|
||||
#######################################
|
||||
# dependencies
|
||||
#######################################
|
||||
-include $(wildcard $(BUILD_DIR)/*.d)
|
||||
|
||||
# *** EOF ***
|
||||
44
myapps/blinky/emlib.mk
Normal file
44
myapps/blinky/emlib.mk
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
C_SOURCES = ../../platform/emlib/src/em_cmu_fpga.c \
|
||||
../../platform/emlib/src/em_dma.c \
|
||||
../../platform/emlib/src/em_csen.c \
|
||||
../../platform/emlib/src/em_msc.c \
|
||||
../../platform/emlib/src/em_lcd.c \
|
||||
../../platform/emlib/src/em_rtcc.c \
|
||||
../../platform/emlib/src/em_can.c \
|
||||
../../platform/emlib/src/em_wdog.c \
|
||||
../../platform/emlib/src/em_system.c \
|
||||
../../platform/emlib/src/em_prs.c \
|
||||
../../platform/emlib/src/em_se.c \
|
||||
../../platform/emlib/src/em_eusart.c \
|
||||
../../platform/emlib/src/em_dbg.c \
|
||||
../../platform/emlib/src/em_cmu.c \
|
||||
../../platform/emlib/src/em_rmu.c \
|
||||
../../platform/emlib/src/em_vcmp.c \
|
||||
../../platform/emlib/src/em_gpio.c \
|
||||
../../platform/emlib/src/em_aes.c \
|
||||
../../platform/emlib/src/em_burtc.c \
|
||||
../../platform/emlib/src/em_usart.c \
|
||||
../../platform/emlib/src/em_qspi.c \
|
||||
../../platform/emlib/src/em_lesense.c \
|
||||
../../platform/emlib/src/em_adc.c \
|
||||
../../platform/emlib/src/em_core.c \
|
||||
../../platform/emlib/src/em_letimer.c \
|
||||
../../platform/emlib/src/em_idac.c \
|
||||
../../platform/emlib/src/em_ldma.c \
|
||||
../../platform/emlib/src/em_vdac.c \
|
||||
../../platform/emlib/src/em_rtc.c \
|
||||
../../platform/emlib/src/em_dac.c \
|
||||
../../platform/emlib/src/em_pcnt.c \
|
||||
../../platform/emlib/src/em_pdm.c \
|
||||
../../platform/emlib/src/em_cryotimer.c \
|
||||
../../platform/emlib/src/em_iadc.c \
|
||||
../../platform/emlib/src/em_acmp.c \
|
||||
../../platform/emlib/src/em_opamp.c \
|
||||
../../platform/emlib/src/em_timer.c \
|
||||
../../platform/emlib/src/em_i2c.c \
|
||||
../../platform/emlib/src/em_gpcrc.c \
|
||||
../../platform/emlib/src/em_crypto.c \
|
||||
../../platform/emlib/src/em_emu.c \
|
||||
../../platform/emlib/src/em_ebi.c \
|
||||
../../platform/emlib/src/em_leuart.c
|
||||
|
||||
17
myapps/blinky/src/main.c
Normal file
17
myapps/blinky/src/main.c
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
#include "em_cmu.h"
|
||||
#include "em_gpio.h"
|
||||
|
||||
int main (void)
|
||||
{
|
||||
CMU_ClockEnable(cmuClock_GPIO, true);
|
||||
GPIO_PinModeSet(gpioPortA, 0/*pin 0*/, gpioModePushPull /*push-pull output*/, 1/*output level*/);
|
||||
|
||||
while(1) {
|
||||
GPIO_PinOutToggle(gpioPortA, 0/*pin 0*/);
|
||||
for (volatile uint32_t i = 0; i < 100000; i++) { } // busy delay
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue