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でダウンロードするときのフォルダ名が「ダウンロード」とコマンドから使いづらいので、
シンボリックリンクを作っておきます。
1.arm-none-eabi-gccの入手
お手軽にlaunchpadからバイナリを入手します。
右のDownloadsのリストから、gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2をダウンロードし、HOME直下に展開します。
makefileから参照するために、フォルダ名からバージョン番号を外しておきます。
とりあえず、pathは通さないでおきます。
2.OpenOCDの入手とインストール
今回はgitリポジトリから最新版のソースを持ってきて自前でビルドしてみます。
ビルドに必要なパッケージをインストール
gitからソースツリーを入手
あとはビルドするだけ
USB接続のST-LinkをOSで認識するようにudevルールを設定します。
contrib/99-openocd.rulesから、ST-Link V2.1の設定を抜き出して設定しました。
(このファイルをそのまま設定しちゃってもいいような気もしますが)
Nucleoボードを接続して動作を確認してみましょう。
VirtualBoxの方で、ST-Linkのデバイスを仮想マシンに回すように設定します。
MacBookにNucleoボードを接続し、VirtualBoxの仮想マシンの設定で、ポート - USBを選択
追加アイコンをクリックして、STM32 STLinkを追加
MacBookから一度Nucleoボードを取り外して再度接続すると、仮想マシン側で認識します。
接続を確認してみます。
このように出力され、NucleoボードのLEDが赤と緑に点滅すれば成功です。
確認したら、Ctrl-CでOpenOCDを終了させてボードを外しておきましょう。
3.STM32CubeMXのインストール
まずJava JREをインストールします。
OpenJDK版でもいいような気もしますが、Oracle版を入れてみます。
Oracleのサイトから、Linux x64のアーカイブをダウンロード
以下の手順でインストールします。
JREをインストール後、JAVA_HOMEをユーザーのプロファイルに設定しておきます。
.bashrcの末尾に以下を追記
STMicroのサイトから、STM32CubeMXをダウンロードして展開
ここで、インストーラを実行するために、32ビット用のライブラリが必要になります。
最初はこれがわからずにえらいハマった…
インストーラを実行
デフォルト設定でインストールします。
インストールできたら、STM32CubeMXを実行
Help - Install New Librariesで、STM32F3のFirmware Packageをダウンロードします。
4.STM32CubeMXでプロジェクト作成
とりあえず、Lチカさせてみましょう。
STM32CubeMXを起動してNew Projectをクリック
Board Selectorタブで、NUCLEO-F303K8を選択
このボードではPB3がLED3に接続されているので、PinoutのタブでPB3のピン設定をGPIO_Outputに設定
ConfigurationのタブでGPIOを選択し
User Labelに「LED3」の名前をつけておきます。
こうすることで、コードからはGPIO_ほにゃらら_LED3でピン設定できるようになります。
Project - Settingで出力先と、使用するToolchainを選択します。
Toolchainには、必ずSW4STM32を選択するようにしてください。
Project - Generate Codeでコードを生成
生成されたフォルダで、makefileを作成します。
Srcフォルダに_exit.cも足しましょう
どっかに、いい_exit.cないですかねえ?
Src/main.cを編集して、Lチカコードを書きます。
User Labelをつけたので、実際のピン番号(PB3)を気にせず書けます。
生成されたコードのあちこにに埋め込まれている、「USER CODE BEGIN」〜「USER CODE END」の
間にコードを書くと、書いたコードを残したままで、後でCubeMXでコードを生成しなおせます。
ビルド
ビルドできましたか?
make flashで、OpenOCDで焼き込みできるようにしてあります。
LEDが点滅すれば成功です!
今回は、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からバイナリを入手します。
右の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を選択
追加アイコンをクリックして、STM32 STLinkを追加
MacBookから一度Nucleoボードを取り外して再度接続すると、仮想マシン側で認識します。
接続を確認してみます。
$ 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のアーカイブをダウンロード
以下の手順でインストールします。
$ 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をダウンロードして展開
$ 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を実行
Help - Install New Librariesで、STM32F3のFirmware Packageをダウンロードします。
4.STM32CubeMXでプロジェクト作成
とりあえず、Lチカさせてみましょう。
STM32CubeMXを起動してNew Projectをクリック
Board Selectorタブで、NUCLEO-F303K8を選択
このボードではPB3がLED3に接続されているので、PinoutのタブでPB3のピン設定をGPIO_Outputに設定
ConfigurationのタブでGPIOを選択し
User Labelに「LED3」の名前をつけておきます。
こうすることで、コードからはGPIO_ほにゃらら_LED3でピン設定できるようになります。
Project - Settingで出力先と、使用するToolchainを選択します。
Toolchainには、必ずSW4STM32を選択するようにしてください。
Project - Generate Codeでコードを生成
生成されたフォルダで、makefileを作成します。
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も足しましょう
どっかに、いい_exit.cないですかねえ?
Src/main.cを編集して、Lチカコードを書きます。
User Labelをつけたので、実際のピン番号(PB3)を気にせず書けます。
生成されたコードのあちこにに埋め込まれている、「USER CODE BEGIN」〜「USER CODE END」の
間にコードを書くと、書いたコードを残したままで、後でCubeMXでコードを生成しなおせます。
ビルド
$ make
ビルドできましたか?
make flashで、OpenOCDで焼き込みできるようにしてあります。
$ make flash
LEDが点滅すれば成功です!
タグ:STM32
コメント 0