1. 使用STM32CUBMX工具生成工程,生成後的源代碼目錄結構如下所示
2. 在工程根目錄下添加一下congfig.py, SConstruct, SConscript三個文件
- congfig.py 主要時編譯配置
import os
from os import path
curDir = os.getcwd()
PROJECT = path.join(curDir, 'discovery')
prefix = 'arm-none-eabi-'
CC = prefix + 'gcc'
CXX = prefix + 'g++'
AR = prefix + 'ar'
LINK = prefix + 'gcc'
AS = prefix + 'gcc -x assembler-with-cpp'
OBJCOPY = prefix + 'objcopy'
OBJDUMP = prefix + 'objdump'
SIZE = prefix + 'size'
CPU = '-mcpu=cortex-m4'
FPU_FLAGS = '' #'-mfloat-abi=hard -mfpu=fpv4-sp-d16'
#FPU_FLAGS = '-mfloat-abi=soft'
MPU = CPU + ' -mthumb ' + FPU_FLAGS + ' -mthumb -mthumb-interwork -ffunction-sections -fdata-sections \
-g -fno-common -fmessage-length=0 -specs=nosys.specs -specs=nano.specs'
CPPDEFINES = ['-DUSE_HAL_DRIVER',
'-DSTM32F407xx',
'-DARM_MATH_CM4',
'-DARM_MATH_MATRIX_CHECK',
'-DARM_MATH_ROUNDING']
LD_SCRIPT = 'STM32F407ZGTx_FLASH.ld'
ASFLAGS = MPU
CXXFLAGS = MPU + ' std=c++11'
CCFLAGS = MPU + ' -std=gnu99'
LDFLAGS = '-Wl,-gc-sections,--print-memory-usage -T ' + LD_SCRIPT + ' -Wl,-Map=' + PROJECT +'.map'
CPPPATH = ['-IInc',
'-IDrivers/STM32F4xx_HAL_Driver/Inc',
'-IDrivers/STM32F4xx_HAL_Driver/Inc/Legacy',
'-IDrivers/CMSIS/Device/ST/STM32F4xx/Include',
'-IDrivers/CMSIS/Include']
TARGET = PROJECT + '.elf'
HEX_TARGET = PROJECT + '.hex'
BIN_TARGET = PROJECT + '.bin'
2. SConstruct
# 編譯生成文件統一存放至buil目錄
VariantDir('build', '#', duplicate=0)
SConscript('SConscript')
3. SConscript
import os
from os import path
import config
def get_srcs(src_dir, exts, recursive=False):
srcs = []
files = os.listdir(src_dir)
for fd in files:
fd_full = path.join(src_dir, fd)
if path.isfile(fd_full):
base,ext = path.splitext(fd)
if ext in exts:
srcs.append(fd_full)
elif path.isdir(fd_full) and recursive:
srcs = srcs + get_srcs(fd_full, exts, recursive)
else:
pass
return srcs
env = Environment(CC=config.CC,
CCFLAGS=config.CCFLAGS,
CXX=config.CXX,
CXXFLAGS=config.CXXFLAGS,
CPPPATH=config.CPPPATH,
LINK=config.LINK,
LINKFLAGS=config.LDFLAGS,
AS=config.AS,
ASFLAGS=config.ASFLAGS,
CPPDEFINES=config.CPPDEFINES,
ENV=os.environ)
env.Replace(ASCOM='$AS $ASFLAGS $CPPPATH $CPPDEFINES -c $SOURCE -o $TARGET')
env.Replace(LINKCOM='$LINK $SOURCES $LINKFLAGS -o $TARGET')
srcDirs = ['Drivers', 'Inc', 'Src', 'startup']
curDir = GetLaunchDir()
srcs = []
for item in os.listdir(curDir):
fd = path.join(curDir, item)
if path.isdir(fd) and item in srcDirs:
srcs = srcs + get_srcs(fd, ['.c', '.cpp', '.s'], True)
for i in range(len(srcs)):
srcs[i] = srcs[i][len(curDir)+1:]
t=env.Program(config.TARGET, srcs)
env.SideEffect(config.PROJECT+'.map', t)
# Post Action
a1=env.AddPostAction(config.TARGET, config.OBJCOPY + ' -Oihex ' + '$TARGET ' + config.HEX_TARGET)
a2=env.AddPostAction(config.TARGET, config.OBJCOPY + ' -Obinary -S ' + '$TARGET ' + config.BIN_TARGET)
env.SideEffect(config.HEX_TARGET, a1)
env.SideEffect(config.BIN_TARGET, a2)