stm32使用scons進行編譯

1. 使用STM32CUBMX工具生成工程,生成後的源代碼目錄結構如下所示

2. 在工程根目錄下添加一下congfig.py, SConstruct, SConscript三個文件

  1. 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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章