SSブログ

VirtualBoxのUbuntuにgnu arm embedded toolchain + OpenOCDでSTM32の開発環境を作る [電子工作]

開発環境をUbuntuに変更しました。

今回は、STM32CubeMXから出力したプロジェクトフォルダを「そのまま」でビルドを目指します。

環境
・MacBook Pro (15-inch, Early 2011) (16GB RAM + 1TB SSD)
・macOS Sierra バージョン 10.12.1
・VirtualBox 5.0.28
・Ubuntu 16.04 LTS 日本語Remix (4GB RAM + 2Core割り当て)

目標
・テキストエディタ+makeで開発
・launchpadのGNU ARM Embedded Toolchainでビルドする
・OpenOCDで書き込み & デバッグする

ターゲット
・Nucleo-F303K8 ボード
・STM32CubeMXのプロジェクトをそのままビルドするMakefileを書く!

それでは手順開始です。

0.ダウンロードフォルダのシンボリックリンクを作る
Firefoxでダウンロードするときのフォルダ名が「ダウンロード」とコマンドから使いづらいので、
シンボリックリンクを作っておきます。
    cd ~
    ln -s ダウンロード downloads

1.arm-none-eabi-gccの入手
お手軽にlaunchpadからバイナリを入手します。
GNU ARMダウンロード.png

右のDownloadsのリストから、gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2をダウンロードし、HOME直下に展開します。
makefileから参照するために、フォルダ名からバージョン番号を外しておきます。
    $ cd ~
    $ tar jxf ~/downloads/gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2
    $ mv gcc-arm-none-eabi-5_4-2016q3 gcc-arm

とりあえず、pathは通さないでおきます。

2.OpenOCDの入手とインストール
今回はgitリポジトリから最新版のソースを持ってきて自前でビルドしてみます。

ビルドに必要なパッケージをインストール
    $ sudo apt-get install git
    $ sudo apt-get install libtool autoconf
    $ sudo apt-get install texinfo
    $ sudo apt-get install libusb-1.0-0-dev
 


gitからソースツリーを入手
    $ cd ~
    $ git clone http://repo.or.cz/r/openocd.git openocd


あとはビルドするだけ
    $ cd openocd
    $ ./bootstrap 
    $ ./configure --enable-stlink
    $ make -j2


USB接続のST-LinkをOSで認識するようにudevルールを設定します。
contrib/99-openocd.rulesから、ST-Link V2.1の設定を抜き出して設定しました。
(このファイルをそのまま設定しちゃってもいいような気もしますが)
    $ grep 374b contrib/99-openocd.rules > 99-stlink.rules
    $ cat 99-stlink.rules 
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", MODE="664", GROUP="plugdev"
    $ sudo cp 99-stlink.rules /etc/udev/rules.d/
    $ sudo service udev restart


Nucleoボードを接続して動作を確認してみましょう。
VirtualBoxの方で、ST-Linkのデバイスを仮想マシンに回すように設定します。

MacBookにNucleoボードを接続し、VirtualBoxの仮想マシンの設定で、ポート - USBを選択

ST-LINK仮想マシン設定 copy.png

USBデバイスフィルター.png

追加アイコンをクリックして、STM32 STLinkを追加

ST-Linkを追加.png

ST-Linkを追加2.png

MacBookから一度Nucleoボードを取り外して再度接続すると、仮想マシン側で認識します。

mbedのフォルダが自動で表示される.png

接続を確認してみます。
    $ cd ~/openocd/tcl
    $ ../src/openocd -f board/st_nucleo_f3.cfg
Open On-Chip Debugger 0.10.0-dev-00419-gbcaf775 (2016-11-19-09:01)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
none separate
srst_only separate srst_nogate srst_open_drain connect_deassert_srst
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : clock speed 950 kHz
Info : STLINK v2 JTAG v28 API v2 SWIM v16 VID 0x0483 PID 0x374B
Info : using stlink api v2
Info : Target voltage: 3.252528
Info : stm32f3x.cpu: hardware has 6 breakpoints, 4 watchpoints


このように出力され、NucleoボードのLEDが赤と緑に点滅すれば成功です。

確認したら、Ctrl-CでOpenOCDを終了させてボードを外しておきましょう。

3.STM32CubeMXのインストール
まずJava JREをインストールします。
OpenJDK版でもいいような気もしますが、Oracle版を入れてみます。

Oracleのサイトから、Linux x64のアーカイブをダウンロード

Oracle JREのダウンロード.png

以下の手順でインストールします。

    $ sudo mkdir -p /usr/lib/jvm
    $ sudo tar zxf ~/downloads/jre-8u112-linux-x64.tar.gz -C /usr/lib/jvm
    $ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jre1.8.0_112/bin/java" 1
    $ sudo update-alternatives --set java /usr/lib/jvm/jre1.8.0_112/bin/java
    $ java -version


JREをインストール後、JAVA_HOMEをユーザーのプロファイルに設定しておきます。

.bashrcの末尾に以下を追記
export JAVA_HOME=/usr/lib/jvm/jre1.8.0_112


STMicroのサイトから、STM32CubeMXをダウンロードして展開

STM32CubeMXをダウンロード.png

    $ cd ~/downloads
    $ unzip en.stm32cubemx.zip


ここで、インストーラを実行するために、32ビット用のライブラリが必要になります。
最初はこれがわからずにえらいハマった…

    $ sudo dpkg --add-architecture i386
    $ sudo apt-get update
    $ sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386


インストーラを実行

STM32CubeMXインストーラ実行.png

デフォルト設定でインストールします。

 STM32CubeMXインストーラ.png

インストールできたら、STM32CubeMXを実行

STM32CubeMX実行.png

Help - Install New Librariesで、STM32F3のFirmware Packageをダウンロードします。

STM32CubeMXパッケージインストール.png

STM32CubeF3ダウンロード.png

4.STM32CubeMXでプロジェクト作成
とりあえず、Lチカさせてみましょう。

STM32CubeMXを起動してNew Projectをクリック

CubeMX_New Project.png

Board Selectorタブで、NUCLEO-F303K8を選択

CubeMX_Board Select.png

このボードではPB3がLED3に接続されているので、PinoutのタブでPB3のピン設定をGPIO_Outputに設定

CubeMX_Config LED3 Pin.png

ConfigurationのタブでGPIOを選択し

CubeMX_Config LED3 Pin Label.png

User Labelに「LED3」の名前をつけておきます。

CubeMX_Config LED3 Pin Label-2.png

こうすることで、コードからはGPIO_ほにゃらら_LED3でピン設定できるようになります。

Project - Settingで出力先と、使用するToolchainを選択します。
Toolchainには、必ずSW4STM32を選択するようにしてください。

CubeMX_Project Setting.png

CubeMX_Project Setting detail.png

Project - Generate Codeでコードを生成
CubeMX_Code Generate.png

生成されたフォルダで、makefileを作成します。
CubeMX_edit makefile.png

PROJECT = nucleof303k8_led
 
DIR=~/gcc-arm/bin
CC=$(DIR)/arm-none-eabi-gcc
NM=$(DIR)/arm-none-eabi-nm
CP=$(DIR)/arm-none-eabi-objcopy
OD=$(DIR)/arm-none-eabi-objdump
SZ=$(DIR)/arm-none-eabi-size

OPENOCD=~/openocd
BOARDCNF=st_nucleo_f3.cfg

DEFS = -DUSE_HAL_DRIVER -DSTM32F303x8

MCU = cortex-m4
MCFLAGS  = -MD -mcpu=$(MCU) -march=armv7e-m -mtune=$(MCU)
MCFLAGS += -mthumb -mlittle-endian -mno-unaligned-access -mno-sched-prolog
MCFLAGS += -mfloat-abi=hard  -mfpu=fpv4-sp-d16
MCFLAGS += -fno-strict-aliasing -fsigned-char
MCFLAGS += -ffunction-sections -fdata-sections
MCFLAGS += -fno-schedule-insns2
MCFLAGS += -fno-common -fno-hosted
MCFLAGS += -mthumb-interwork
MCFLAGS += -fmessage-length=0
MCFLAGS += -ffreestanding
MCFLAGS += -fno-move-loop-invariants
MCFLAGS += -Wl,--gc-sections

STM32_INCLUDES = \
	-IInc \
	-IDrivers/CMSIS/Device/ST/STM32F3xx/Include \
	-IDrivers/CMSIS/Include \
	-IDrivers/STM32F3xx_HAL_Driver/Inc/Legacy \
	-IDrivers/STM32F3xx_HAL_Driver/Inc

#OPTIMIZE = -Os
OPTIMIZE = -gdwarf-2 -O0 -flto-partition=none -fipa-sra

CFLAGS  = $(MCFLAGS) $(OPTIMIZE) $(DEFS) $(STM32_INCLUDES)
CFLAGS += -Wl,-T,STM32F303K8Tx_FLASH.ld
AFLAGS  = $(MCFLAGS)

CSRC = \
	Src/main.c \
	Src/stm32f3xx_it.c \
	Drivers/CMSIS/Device/ST/STM32F3xx/Source/Templates/system_stm32f3xx.c \
	Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c \
	Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c \
	Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c \
	Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c \
	Src/_exit.c

ASRC = Drivers/CMSIS/Device/ST/STM32F3xx/Source/Templates/gcc/startup_stm32f303x8.s

COBJ = $(CSRC:.c=.o)
AOBJ = $(ASRC:.s=.o)

all: build size

build: elf hex lst sym

elf: $(PROJECT).elf
hex: $(PROJECT).hex
lst: $(PROJECT).lst
sym: $(PROJECT).sym

%.hex: %.elf
	@echo
	$(CP) -O ihex $< $@

%.lst: %.elf
	@echo
	$(OD) -h -S -C $< > $@

%.sym: %.elf
	@echo
	$(NM) -n $< > $@

size:
	@echo
	$(SZ) $(PROJECT).hex
	$(SZ) $(PROJECT).elf
	$(SZ) -A -x $(PROJECT).elf

%.elf: $(AOBJ) $(COBJ)
	@echo
	$(CC) $(CFLAGS) $^ -o $@

$(COBJ) : %.o : %.c
	@echo
	$(CC) -c $(CFLAGS) $< -o $@

$(AOBJ) : %.o : %.s
	@echo
	$(CC) -c $(CFLAGS) $< -o $@

clean:
	@echo
	find . -name '*.o' -print -or -name '*.d' -print | xargs rm -f
	rm -f $(PROJECT).elf $(PROJECT).hex $(PROJECT).lst $(PROJECT).sym

flash: $(PROJECT).elf
	$(OPENOCD)/src/openocd -s $(OPENOCD)/tcl -f board/$(BOARDCNF) -c "program $^ verify reset exit"


Srcフォルダに_exit.cも足しましょう
CubeMX_edit _exit.c.png

どっかに、いい_exit.cないですかねえ?

Src/main.cを編集して、Lチカコードを書きます。
User Labelをつけたので、実際のピン番号(PB3)を気にせず書けます。
生成されたコードのあちこにに埋め込まれている、「USER CODE BEGIN」〜「USER CODE END」の
間にコードを書くと、書いたコードを残したままで、後でCubeMXでコードを生成しなおせます。
CubeMX_LED blink test.png

ビルド
    $ make


ビルドできましたか?

CubeMX_build result.png

make flashで、OpenOCDで焼き込みできるようにしてあります。
    $ make flash


LEDが点滅すれば成功です!
タグ:STM32
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。