stm32g4 の開発環境構築 Linux編

先日Windows版の環境を作ったばっかりだが、デバッグに使うOPENOCDがG4対応していなくて自前でビルドしなくては行けないという情報を得てやっぱり自前でビルドするとなるとLinuxでやったほうがいいなと思ってLinux上に開発環境を構築することとした。

基本的な構築は前回の omonting.hatenablog.com とほとんどおなじなので同じ部分は割愛する。

必要なソフトウェア

GNU Arm Embedded Toolchain

GNU Arm Embedded toolchain は展開したフォルダを\opt内に配置

パスを通す

zshを使っているので、~/.zshrcの一番下に

export PATH="/opt/gc-arm-none-eabi-9-2020-q2-update/bin:$PATH"

を記載。

c_cpp_properties.json

下記に変更

            "compilerPath": "/opt/gc-arm-none-eabi-9-2020-q2-update/bin/arm-none-eabi-g++",

Makefileの編集

今回のプロジェクトは基本C++で書こうと思っている。
CubeMXの吐き出したMakefileソースコードはCソースコード吐き出しでMakefileもそのようになっていたので、C++もコンパルできるように修正。 ファイル名を
main.c => main.cpp
stm32g4xx_it.c => stm32g4xx_it.cpp
に変更。

# debug build?
DEBUG = 0
# optimization
OPT = -O3

に変更、MCUのファーム開発は僕は最適化効かせてdebug中に必要な箇所のみ一時的に最適化をきってdebugしている。

C_SOURCES 内からmain.cとstm32g4xx_it.cを削除 書きを追記

# CPP sources
CXX_SOURCES =  \
Src/main.cpp \
Src/stm32g4xx_it.cpp

cppのコンパイラを定義

CXX = $(GCC_PATH)/$(PREFIX)g++

CFLAGSの下に書きを追記

CXXFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections  -isystem -std=c++17

ほかはCFLAGSと同様に処理しておく。

ビルド設定の部分を下記のように書き換え

#######################################
# build the application
#######################################
# list of objects
OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(C_SOURCES)))
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(CXX_SOURCES:.cpp=.o)))  #追記
vpath %.cpp $(sort $(dir $(CXX_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) 
    $(CXX) -c $(CXXFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@    # CC->CXXに変更

$(BUILD_DIR)/%.o: %.cpp Makefile | $(BUILD_DIR)                                               #追記
    $(CXX) -c $(CXXFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.cpp=.lst)) $< -o $@      #追記

$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)
    $(AS) -c $(CFLAGS) $< -o $@

$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
    $(CXX) $(OBJECTS) $(LDFLAGS) -o $@                                    #CC->CXXに変更
    $(SZ) $@

$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
    $(HEX) $< $@
    
$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
    $(BIN) $< $@ 
    
$(BUILD_DIR):
    mkdir $@    

以上で完了。