UbuntuでSTM32 ARMマイコンの開発環境を整える

Windowsを持っていないので,UbuntuでSTM32 ARMマイコンを開発できるように環境構築したいと思います.以下を行います.

  • Eclipseでコード書いて,デバッグするためにEclipseをインストールする
  • 書いたコードをマイコン用にコンパイルする(クロスコンパイルする)ために,ARM Tool Chainをインストールする
  • ARM ToolchainをEclipse経由で使えるようにするため,Eclipseでプラグインの追加と設定を適宜行う
  • デバッガを使うためにST-Link V2のドライバをインストールする
  • テストコードを書くために,マイコン用の便利なライブラリを使えるようにする
  • テストコードを書く
  • テストコードをコンパイルし,マイコンに書き込み,実行する
  • デバッガを起動する

今回テストに使用するマイコンは以下のSTM32F4Discoveryというものになります.秋月などで購入可能です.

STM32F4Discovery

Eclipseのインストール

こちらの記事を参考にインストールしてください.日本語化はしていません.

ARM Toolchainのインストール

ネットで調べるとapt-getを使ったインストール方法しか見つかりませんでした.自分でやってもハマりそうなのでそれに従います.以下の一行目は,binutils-arm-none-eabi, gcc-arm-none-eabiのいずれかが事前にインストールされていなければ実行する必要はありません(まぁ,念の為やっておいてください).ちなみにこちらのサイトには下記でインストールするよりも新しいバージョンのtoolchainが公開されていますが,自分の中では少し枯れているものを使う方が無難と判断しました.

sudo apt-get remove binutils-arm-none-eabi gcc-arm-none-eabi
sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded
sudo apt-get update
sudo apt-get install gcc-arm-none-eabi=4.9.3.2015q3-1trusty1

ひょっとしたら皆さんが実行する頃にはgcc-arm-none-eabi=4.9.3.2015q3-1trusty1が古くなっていて見つからなくなっているかもしれません.そのときは頑張ってググってください.私の場合,gcc-arm-none-eabi=4.9.3.2015q1-0trusty13をインストールするようにといった記載を見たのですが,それがうまくいかなかったので,上記をインストールしました.

ちなみにUbuntu 16.04の場合は

sudo apt-get install gcc-arm-none-eabi
sudo apt-get install gdb-arm-none-eabi

でインストールしました。

ST-Linkのドライバのインストール

https://github.com/texane/stlinkにあるオープンソースのドライバを使います。

以下では,インストール先のディレクトリとして,~/Binディレクトリを指定しています.–prefix, –bindirを指定しなければ/usr/local/bin以下にst-flash, st-util, st-term, st-infoという4つの実行ファイルがコピーされます.dh-autoreconfは二行目のautogen.shを実行するのに必要になります.

sudo apt-get install dh-autoreconf
git clone https://github.com/texane/stlink
cd stlink
./autogen.sh
./configure --bindir=${HOME}/Bin --prefix=${HOME}/Bin
make
make install (※bindir, prefixを指定しないときはsudo make install)

prefixでインストールするディレクトリを指定し,bindirではst-flashなどの実行ファイルを格納するディレクトリを指定します(上記の場合はそれらを同じディレクトリに指定してます).上記のようにbindirを指定した場合,環境変数PATHに指定したディレクトリが含まれていないといけません.ホームディレクトリにある.bashrcファイルに以下のような文を追加してください.

PATH=<Path to directory which contains stlink executable files>:$PATH

上記の例の場合は以下のように書きます.

PATH=$HOME/Bin:$PATH

ちなみにアンインストールしたいときは

sudo make uninstall

するか,インストール先の上記4つのファイルを直接削除します.

Eclipseのプラグイン導入および各種設定

GNU ARM Eclipse CDTプラグインの追加

ARM用のCDT(C/C++ Development Tool)をプラグインとして追加します.

こちらに書いてあるとおりにします.

Help → Install New Software … → Work withの欄に以下を追加します.

http://gnuarmeclipse.sourceforge.net/updates

出てきた項目をすべて選択し,Nextで先に進み,インストールします.途中以下のようにWarningが出るかもしれませんが,OKしてインストールを実行します.インストール終了後,Eclipseを起動し直します.

Security Warning _015.jpg

起動後,File → New → C++ Projectを選択すると,以下のようにSTM32用のプロジェクトが選択できるようになっています.

C++ Project _016.jpg

サンプルプロジェクトの作成

サンプルプロジェクトを作成して,実際にマイコンに書き込んでみます.この節でサンプルプロジェクトを作成し,次節以降でマイコンをPCに接続→ST-LINK GDBサーバの立ち上げ→ST-LINK GDBクライアント(こういう考え方で良いのか?)によるプログラムの書き込み,ということを行います.

File → New → C++ Projectより新しいプロジェクトを作成します.以下のように設定していってください.ただし,Cross GNU ARM Toolchainの設定においてToolchainのディレクトリを指定する際は,各自の環境に合ったパスを入力してください.

範囲を選択_023.jpg

範囲を選択_024.jpg
Content: Blinky (Blink a led)ということで,LEDが光るサンプルです

範囲を選択_025.jpg

範囲を選択_026.jpg
Debug別にあってもいいけど,別に今はいらない
範囲を選択_027.jpg
Toolchain pathは各自に合った設定で(大抵同じだと思いますが)

サンプルプロジェクトのビルド

Project → Build Allでビルドするだけなのですが,私の環境ではおかしなことが起こりました.まず,私の環境では7つエラーが出ました.Timer::sleepの引数がおかしいとのことです.なので修正します.と思ったのですが,おかしいところが見当たらない.てことで以下のような怪奇現象が起こりました.

  • Timerのヘッダファイル見たりして,とりあえずmain.cpp以下のTime::FREQUENCY_HZをuint32_tにキャストしてみるものの,やはりエラー
  • いったんCleanしてBuild Allしてみる→ビルド成功(Warningが2つ)
  • おかしいなと思い,別名のプロジェクトを同様に作成し,Build All→一発でビルド成功(Warningが2つ)

すみません,なんでこんなことになったのかよく分かりません.

とりあえずビルドが成功したら,HelloSTM32ディレクトリ以下にReleaseディレクトリができ,その中にHelloSTM32.elf, HelloSTM32.hex, HelloSTM32.mapというのが生成されているのが分かります.以降でHelloSTM32.elfを引数にするコマンドを使い,プログラムの書き込みを行うことになります.

ST-LINKの接続(rulesファイルの設定)

ST-LINKと言っていますが,見かけ上はUSB miniケーブルでPCとマイコンがつながっているだけです.以降の節で,マイコンとPCをつなげることになりますが,その前にST-LINKへのアクセスをsudoのような許可なしでできるようにしておきます.

/etc/udev/rules.d以下に,49-stlink.rulesというファイルを作成し,以下のような内容を書き込んでください.

# stlinkv1
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3744", \
  MODE:="0666", \
  SYMLINK+="stlinkv1_%n"
# stlinkv2
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", \
  MODE:="0666", \
  SYMLINK+="stlinkv2_%n"
# stlinkv2-1
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", \
  MODE:="0666", \
  SYMLINK+="stlinkv2-1_%n"

その後,再起動もしくは以下を実行してください.

udevadm control --reload-rules
udevadm trigger

これでUSBでPCとマイコンをつないだ後,sudoみたいなことをしなくても簡単にST-LINKにアクセス→マイコンにアクセスすることができるようになります.

ST-LINK GDBサーバの設定

プログラムをマイコンに書き込むために必要なST-LINK GDBサーバの設定を行います.

Run → External Tools → External Tools Configurations → Programを右クリック → Newを選択し,新しいConfigurationを作成します.Mainタブのところで以下のように設定します.

  • ST-LINK GDB Server(実際は何でも好きなので良い)
  • Location: st-utilへのフルパスを指定
    例) /home/user/Bin/st-util
  • Working Directory: st-utilが格納されているディレクトリをフルパスで指定
    例) /home/user/Bin
  • Arguments: -p 4242
  • Applyを押して適用

設定したら,マイコンとPCを,USB miniケーブルで接続します.USB microの方ではなく,miniの方です.そして接続した状態で,先ほどのExternal Tools Configurationsにある「Run」を選択します.するとEclipseのコンソールにて以下のような出力が得られるはずです.

2016-01-23T06:44:33 INFO src/stlink-usb.c: -- exit_dfu_mode
2016-01-23T06:44:33 INFO src/stlink-common.c: Loading device parameters....
2016-01-23T06:44:33 INFO src/stlink-common.c: Device connected is: F4 device, id 0x10016413
2016-01-23T06:44:33 INFO src/stlink-common.c: SRAM size: 0x30000 bytes (192 KiB), Flash: 0x100000 bytes (1024 KiB) in pages of 16384 bytes
2016-01-23T06:44:33 INFO gdbserver/gdb-server.c: Chip ID is 00000413, Core ID is 2ba01477.
2016-01-23T06:44:33 INFO gdbserver/gdb-server.c: Target voltage is 2900 mV.
2016-01-23T06:44:33 INFO gdbserver/gdb-server.c: Listening at *:4242...

以後,Run → External Tools → ST-LINK GDB Serverが現れるようになります.プログラムをマイコンに書き込みたいときはこれを選択して,ST-LINK GDB Serverを起動することが必要となります(前述の「Run」を選んでも同じことができます・・・が,こちらの方が楽).

上記のような出力が得られず失敗する場合は,以下を試してみてください.

  • Resetボタン(基板上の黒いでかい押しボタン)を押す
  • Userボタン(基板上の紫のでかい押しボタン)を押し,Resetボタンを押す
  • USBケーブルの抜き差し
  • 使用しているUSBポートの確認→ちゃんとUSB miniの方を使っているか確認(USB microではない!)
  • eclipseを閉じる → ST-LINK GDB Serverの再起動

ST-LINK GDB クライアントによるプログラムの書き込み

ST-LINK GDBクライアントという呼び方が正しいのかは分からないのですが,クライアントっぽいことをしているのでそう呼びます.HelloSTM32/Release以下で,以下を実行してください.

arm-none-eabi-gdb HelloSTM32.elf

するとgdbが開きます.コマンドラインの左に(gdb)というのが表示されます.

続いて以下を実行してGDBサーバに接続します.

(gdb) tar ext :4242

この4242はST-LINKに使用するポートで,前節のST-LINK GDB Serverで設定したポートと同じ番号にしておく必要があります.上記コマンドがうまく行くと,ターミナル上では以下のような出力が得られます.

(gdb) tar ext :4242
Remote debugging using :4242
0x0800025c in ?? ()
(gdb)

また,EclipseのConsoleでは以下のような出力が得られます.

2016-01-23T06:44:33 INFO src/stlink-usb.c: -- exit_dfu_mode
2016-01-23T06:44:33 INFO src/stlink-common.c: Loading device parameters....
2016-01-23T06:44:33 INFO src/stlink-common.c: Device connected is: F4 device, id 0x10016413
2016-01-23T06:44:33 INFO src/stlink-common.c: SRAM size: 0x30000 bytes (192 KiB), Flash: 0x100000 bytes (1024 KiB) in pages of 16384 bytes
2016-01-23T06:44:33 INFO gdbserver/gdb-server.c: Chip ID is 00000413, Core ID is 2ba01477.
2016-01-23T06:44:33 INFO gdbserver/gdb-server.c: Target voltage is 2900 mV.
2016-01-23T06:44:33 INFO gdbserver/gdb-server.c: Listening at *:4242...
2016-01-23T07:21:45 INFO gdbserver/gdb-server.c: GDB connected.

それではいよいよ書き込みです.gdbでloadと打ち込むだけです.

(gdb) load

以下のような出力が得られます.

Loading section .isr_vector, size 0x2ea lma 0x8000000
Loading section .inits, size 0x2c lma 0x80002ec
Loading section .text, size 0xcde lma 0x8000318
Loading section .data, size 0xc lma 0x8000ff8
Start address 0x8000188, load size 4096
Transfer rate: 3 KB/sec, 1024 bytes/write.

もしエラーが出るのであれば,以下を試してみてください

  • arm-none-eabi-gdbの再起動
  • USBケーブルの挿し直し
  • Eclipseの再起動→ST-LINK GDBサーバの再起動

書き込みが成功したら,gdbでそのまま

(gdb) kill
(gdb) run

としてください.すると,プログラムが走り出してLED3〜LED6がチカチカ点滅し始めます.

 

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中