EclipseとOpenOCDでSTM32(ARM)マイコン開発

# EclipseとOpenOCDでSTM32(ARM)マイコン開発

    Development Environment
    Date : 2016/01/09
    OS   : Windows 7 (32bit)
    IDE  : Eclipse 4.5 Mars (Pleiades All in One)
    Board: Nucleo-F103RB (STM32F103RBt6)
    ICE  : None (OnBoard ST-LINK/V2-1)
    Cable: USB Mini-B

EclipseとOpenOCDを使ってマイコンの開発環境を整えます。
各種ソフトウェアのインストールからLED点灯、デバッグまでの作業記録となります。
STMicroelectronics(以下ST)のNucleoボードやDiscoveryボードであれば、ほとんど同じように環境を構築できるでしょう。

ここではST製マイコンを使用します。
情報量の多さ、サンプルコードの豊富さ、価格の安さ、ステップアップのしやすさなどから選択しました。

開発環境はST公式が推奨しているものを用いるのが無難だと思いますが、登録が必要だったり、制限があったり、ごちゃごちゃ勝手にインストールされたりするので、好きになれません。
それに公式推奨の開発環境のライセンスは何十万円もしますので、個人では手を出しにくいです。
なので、ここではEclipseを使用してフリーの開発環境を構築しています。
Eclipseはビルドボタンで独自のmakefileを使用できるので、大抵のコンパイラが使えます。

`テキストエディタ + GNUツール群 + OpenOCD + GDBフロントエンド`でもいいのですが、IDEについてるコード解析および編集機能とGDBデバッグ機能は便利です。

[Eclipseを入れたら必ずやる設定とよく使うショートカット](http://qiita.com/Ted-HM/items/d9d304eb8aa59ad8eaba)

ARMの開発環境は他には下記のようなものがあります。
[ARM開発環境まとめ](http://qiita.com/Ted-HM/items/9f1cca2590ada522c021)

## マイコンボード選択
STのマイコン以外にも多数の選択肢があります。
参考までに載せておきます。

秋月電子通商、若松通商、スイッチサイエンス、RSなどを参考にしました。
スイッチサイエンスのページは使い方の紹介などがあって助かります。

海外製品はお店による価格差がけっこうありますので、パーツ探しも醍醐味の一つです。
[IoTやるならまず知っておきたいパーツ屋・オンラインショップ](http://qiita.com/kazuph/items/86a1f88e06ff874abe68)

### STMicroelectronics

ST製でおすすめのボードは、Nucleo-F103RBまたはSTM32F4 Discoveryです。
基板にST-LINKシリーズのデバッガが搭載されているので、ボード本体とUSBケーブルさえあれば開発できます。
ライブラリとして、CMSIS、HALが揃っているのでSTマイコン同士の移植性が非常に高く、ステップアップしながら学習しやすいのも特徴です。
githubなどを検索すればコードが多数見つかります。

[Nucleo-F103RB](http://akizukidenshi.com/catalog/g/gM-07724/)
\1,500という値段でお手軽に試せます。
Nucleoボードはmbedにも対応しているし、ピン配置などがシリーズ共通なので、互換性や移植性が高いです。
その中でもF103は古くて比較的情報が多いので、学習用に向いていると思います。
使い終われば、他の基板を開発しているときの、検証用や通信用として残しておくのもよいですし、[フリスクケースに入れて](http://blog.tokor.org/2015/05/14/Nucleo%E3%81%A8%E3%81%8B%E3%81%84%E3%81%86ST-Link%E3%82%92FRISK%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%AB%E5%85%A5%E3%82%8C%E3%82%8B/)デバッガとしても使用できます。
更にX-NUCLEOシリーズを乗せれば、BLE、モーター制御なども試せます。

[STM32F4 Discovery](http://akizukidenshi.com/catalog/g/gM-05313/)
いろいろ機能がついて\2,000という安さです。
Discoveryボードは評価版ということもあって、多数の機能がついています。
F4Discoveryに付いているのは、3軸センサ、USB、オーディオです。
こちらも十分に古いので情報は多めです。
触っていて楽しいのは断然F4Discoveryの方でしょう。
CubeF4のサンプルでは、3軸センサでマウスとして認識させたり、オーディオの録再のサンプルもあるので、Nucleoボードの次のステップアップとしては最適です。
RTOSのTOPPERSも動かせます。

[STM32F7 Discovery](http://akizukidenshi.com/catalog/g/gM-09880/)
更に慣れてきたら静電容量式のタッチディスプレイ、MicroSD、有線LANなどが付いたSTM32F7 Discoveryボードを使ってみるとよいでしょう。
タッチパネルの液晶があるので、それだけでいろいろ遊べます。
値段も高めですが、液晶が付いてこの価格設定は、他と比べてもお得だと思います。
uClinuxを載せることも可能です。

### NXP Semiconductors

NXPは使ったことがないので詳しいことは不明です。
NXP系のマイコンを使う場合は、[メモリマップのCheckSum ValidationとCodeReadProtectionに注意する](http://nemuisan.blog.bai.ne.jp/?eid=198525#SUMSUMSUM)必要があります。
開発環境にLPCXPressoやmbedを使用する場合は自動計算されるそうです。

[LPC1347評価ボード](http://akizukidenshi.com/catalog/g/gM-06455/)
OM13045: LPCXpresso Board for LPC1347というボードが使いやすそうです。
このボードはLPC-LINKシリーズのデバッガが搭載されているので、必要なのはUSBケーブルだけです。
価格帯はSTより若干高めですが、それでも\2,500という安さに抑えられています。

### Renesas

RZシリーズがARMコアとなります。
ただしルネサスはボードの販売をしていません。
チップだけ買ってハンダ付けするか、サードパーティ製のものを購入しましょう。
ルネサスは日本の企業なので、日本語の情報が豊富なのも嬉しいです。

[GR-PEACH](http://akizukidenshi.com/catalog/g/gM-10133/)
GR-PEACHというのが1万円以下で買えるのでよさそうです。
USBでmbed書き込みか、RZ/A1H用のJTAGデバッガが使えます。
E1はRZシリーズには対応していないのでご注意ください。

[RX621マイコンボード](http://akizukidenshi.com/catalog/g/gK-05763/)
RXシリーズはARMコアではありませんが、一応挙げておきます。
USBケーブルを繋ぐだけでデバッグできるそうです。
開発環境はHEWやCS+よりEclipseベースのe2 Studioがよいでしょう。
普通のEclipseにKPITのGNUツールチェインを組み合わせることもできます。

### Atmel

こちらもARMコアだけではありませんが、有力なので挙げておきます。
Atmel AVRマイコンは有志が翻訳した日本語情報が豊富です。
開発環境はVisualStudioベースのAtmelStudioとなります。

### Arduino

Arduinoには、基本的にAVRマイコンが載っています。
Arduino規格に合致する非公式互換ボードも多数あります。
日本語の情報も多いので始めやすいでしょう。

[The Arduino Starter Kit(日本語版)](https://www.switch-science.com/catalog/2628/)
初めてArduinoを使うならこれがよいでしょう。
値段は少し高いですが、日本語の入門書の他にいろいろ部品が付いているので長く遊べると思います。

[Arduino UNO R3](https://www.switch-science.com/catalog/789/)
上記のStarter Kitに付属しているボードはコレです。

[ESP-WROOM-02開発ボード](https://www.switch-science.com/catalog/2500/)
[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)
安くてWi-Fiが使えて、日本語の情報が豊富です。
回路図がわかりやすいので、[モジュール](ESP-WROOM-02 Wi-Fiモジュール)を買ってきて自作の練習をするのもよいでしょう。
どちらもArduino IDEが使えます。

### mbed

mbed対応ボードは、いろいろなマイコンが搭載されています。
STのNucleoボードもmbedに対応しています。
USBドライバを入れて、何のボード、何のコアを使っているのかさえ分かれば動きます。
とくかく早く簡単に使いたいという場合はよいでしょう。
ソースコードをエクスポートしてデバッグすることもできます。
手間はかかりますがローカルの開発環境を構築することもできます。

### Raspberry Pi

言わずと知れたラズパイシリーズです。
これらはLinuxを載せるので、ほぼPC環境と変わりません。
喋らせたりしたいならコレで決まりです。
一つくらいもっておいてもいいでしょう。

[小型PC「ラズベリー・パイ」で自作した神作品10選の猛者たちが天才過ぎる！](http://plus.appgiga.jp/masatolan/2014/05/01/52120/)
[【ﾗｽﾞﾊﾟｲ】海外のおもしろRaspberry pi作品集(2)](http://azwoo.hatenablog.com/entry/2015/08/24/132130)

### 極小ボードコンピューティング

極小PCという言葉は何故か惹かれます。
小さくても性能は十分、Linuxを搭載できます。
紹介はしませんが、Androidを載せてるスティックタイプの製品もここに分類されるでしょう。

[Intel Edison Breakout Board Kit](https://www.switch-science.com/catalog/1957/)
Intel EdisonはSDカードサイズより少し大きいくらいです。
Wi-FiとBluetoothが付いてます。
Yocto Linuxを搭載できます。

[Raspberry Pi](http://jp.rs-online.com/web/generalDisplay.html?id=raspberrypi)
ラズパイシリーズなら、Wi-FiとBluetooth(BLE可)が載ったRPi3がオススメです。
ワンコインで買えるPiZeroもいいですが、こちらはほぼ売ってません。
RPi用モジュールも種類が豊富なので、使いみちが多いでしょう。

[pcDuino3 Nano](http://akizukidenshi.com/catalog/g/gM-08773/)
OpenGL, OpenVGに対応していてなかなかパワフルです。

### その他

FTDIのUSBシリアル変換ケーブルも一本くらい持っておくとよいでしょう。
UARTでRS-232Cの通信が簡単に行えます。
Arduinoの書き込みにも使えます。
ドライバはUSBドライバと仮想COMポートの二段構成となっています。
いろいろありますが、ケーブル付きが使いやすいです。
電圧の違いにご注意を。
[TTL-232R-3V3](http://akizukidenshi.com/catalog/g/gM-05840/)
[SSCI-010320](https://www.switch-science.com/catalog/1032/)
[DEV-09873](http://www.marutsu.co.jp/pc/i/127676/)
[USB2UART-CP2102](http://www.aitendo.com/product/2890)
[AE-FT234X](http://akizukidenshi.com/catalog/g/gM-08461/)

## 資料

まずは資料を揃える必要があります。
マイコン関連は資料を集めたり環境を整えるだけでも結構大変です。

ボード名: Nucleo-F103RB
搭載MCU : STM32F103RBt6
アーキテクチャ: ARM Cortex-M3

### Nucleo-F103RBの資料

[NUCLEO-XXXXRX - STM32 Nucleo-64 boards](http://www.st.com/st-web-ui/static/active/en/resource/technical/document/data_brief/DM00105918.pdf)
表面的なNucleoボードのスペックのみ記載されています。

[UM1724 User manual - STM32 Nucleo-64 boards](http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00105823.pdf)
ボタンやLEDが接続されているポート、HSEの利用の仕方、回路図などが記載されています。
重要な情報が欄外に注釈として書かれていたりするので情報を探すのが大変です。

### STM32F103RBt6の資料

[RM0008 リファレンスマニュアル - STM32F103xx 日本語版](http://www.st-japan.co.jp/st-web-ui/static/active/jp/resource/technical/document/reference_manual/CD00171190.pdf)
メモリマップやペリフェラルの詳細、各種レジスタなどについて記載されています。
ソフトウェアの開発で一番よく使うドキュメントとなるでしょう。
`RM0008 日本語`のキーワードで検索すると幾つか見つかります。

[DS5319 データシート - STM32F103x6 Rev8 日本語版](https://strawberry-linux.com/pub/ds_stm32f103xx.pdf)
[DS5319 DataSheet - STM32F103xB](http://www.st-japan.co.jp/st-web-ui/static/active/jp/resource/technical/document/datasheet/CD00161566.pdf)
メモリマップやペリフェラル、クロック構成図、電気特性などについて記載されています。
ハードウェア的な情報が豊富です。

[PM0056 Programming manual - Cortex-M3](http://www.st-japan.co.jp/st-web-ui/static/active/jp/resource/technical/document/programming_manual/CD00228163.pdf)
Cortex-M3アーキテクチャ、命令セットなどが記載されています。
アセンブラなどが必要になった場合に必要となる資料です。

### ARMの資料

[Cortex-M3 テクニカルリファレンス マニュアル](http://infocenter.arm.com/help/topic/com.arm.doc.ddi0337ij/index.html)
メモリマップ、例外(割込)、命令のタイミング、用語集などが載っています。

[AMBA Specification Rev 2.0](http://infocenter.arm.com/help/topic/com.arm.doc.ihi0011a/index.html)
AHB(HCLK)、APB(PCLK)などの用語の説明が載っています。
ダウンロードするには登録が必要です。

### ライブラリの資料

たとえばHALは、HALドライバと呼ばれたり、HALライブラリと呼ばれたりしますが、どちらも同じものを指します。
ドライバとは低位のレイヤー、つまりハードウェアに近い部分を処理するソフトウェアのことを指します。
ライブラリとは再利用性を高めたコード群を指します。
※この場合のコードはソースコードの他にオブジェクトコードも含みます。

[UM1850 - STM32F1xx HAL drivers ](http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00154093.pdf)
HALのマニュアルです。
機能の説明だけでなく使い方の手順まで書かれています。

[UM1061 - STM32F2xx Standard Peripheral Library](http://www.st.com/web/en/resource/technical/document/user_manual/DM00023896.pdf)
Standard Peripheral LibraryはSPLやSTDなどと省略されますが、ここではSPLとします。
SPLのマニュアルです。
SPLはHALの前に使われていたライブラリです。
この資料はF2向けなので適宜読み替える必要がありますが、ライブラリの使い方に大きな違いはありません。

#### サンプルなど

[STM32CubeF1](http://www.st-japan.co.jp/web/jp/catalog/tools/PF260820)
HALを使用したさまざまなサンプルが収録されています。
といってもNucleoボードではあまりサンプルはありません。
Discoveryボードを利用するときは大いに役立つでしょう。

画面下のDownloadボタンから入手できます。
すぐ上にOrder From STと書いてますが、ボードの注文フォームを流用しているだけなので、気にせずダウンロードしてしまってください。

[STSW-STM32143 - STM32 Nucleo examples, based on SPL](http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1734/PF260215)
SPLを使用したサンプルです。
STM32Cubeに誘導されているのが紛らわしいです。

[STM32F103RB](http://www.st-japan.co.jp/web/jp/catalog/mmc/FM141/SC1169/SS1031/LN1565/PF164487)
デザイン・リソースのApplication Noteに様々な使い方が解説されています。
また、Related Tools and Softwareにはライブラリやツールなどが載ってます。

[STM32 Embedded Software](http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743)
対応するソフトウェアやライブラリを探すならこちらページの方がよいでしょう。


## 開発環境

開発環境を整えます。
Eclipse、ツールチェインなどのインストールが必要です。

### 0. Pleiadesとは

PleiadesはEclipseと様々な環境がセットになったパッケージです。

本来、C/C++の開発環境を整えようと思ったら、Eclipse本体、Java実行用JRE、GNU環境のMinGW(またはCygwin)、C/C++開発プラグインのCDT、環境Pathの設定など様々な作業が必要となります。
Pleiadesをインストールすれば、それらの煩雑な作業をある程度省略できます。

### 1. Pleiadesのダウンロード

[Pleiades All in One](http://mergedoc.osdn.jp/)
最新版(Eclipse 4.5 Mars)のPleiadesをダウンロードします。
今回は環境に合わせて、[C/C++, 32bit, Full Edition(約400MB)](http://ftp.jaist.ac.jp/pub/mergedoc/pleiades/4.5/pleiades-e4.5-cpp-32bit-jre_20151002.zip)をインストールします。

### 2. Eclipseのインストール

ダウンロードしたPleiadesのzipファイルを`C:\dev\ARM\`に展開(解凍)します。
パスはご自分の環境に合わせて読み替えてください。

階層が深いと展開時に名前が長すぎてエラーが発生することがあるので注意してください。
ダウンロードフォルダやデスクトップに展開するとエラーとなる可能性が高いです。
CRCエラーが出て解凍できない場合はWinRARを使うと問題が解決する可能性があります。

### 3. Eclipseの起動

初回起動時にはworkspaceを指定します。
デフォルトでは下記のような構成になります。

    C:\dev\ARM\pleiades
    ├─eclipse
    └─workspace


### 4. Eclipseプラグインの追加

プラグインのインストール画面を開きます。

`Eclipse: メニュー => ヘルプ => 新規ソフトウェアのインストール`

追加ボタンを押し、リポジトリの追加を行います。

    Name    : GNU ARM Eclipse Plug-ins
    Location: http://gnuarmeclipse.sourceforge.net/updates

すべて選択してインストールします。
STM32Fx用のテンプレートなどが含まれています。

参考: [How to install the GNU ARM Eclipse plug-ins?](http://gnuarmeclipse.github.io/plugins/install/)

### 5. ソフトウェアのインストール

#### Toolchainのインストール
[GCC ARM Embedded](https://launchpad.net/gcc-arm-embedded)
[ダウンロードページ](https://launchpad.net/gcc-arm-embedded/+download)
[gcc-arm-none-eabi-5_2-2015q4-20151219-win32.zip](https://launchpad.net/gcc-arm-embedded/5.0/5-2015-q4-major/+download/gcc-arm-none-eabi-5_2-2015q4-20151219-win32.zip)
ARM用のコンパイラ、アセンブラ、リンカなどが含まれています。

`C:\dev\ARM\Toolchain`に展開します。
デフォルトのProgram Filesでもかまいませんが、パスが長かったり空白が入ったりするのでオススメしません。
Eclipseの初回ビルド時にToolchainの場所を指定しますのでパスを通す必要はありません。

    C:\dev\ARM\Toolchain
    ├─arm-none-eabi
    ├─bin
    ├─lib
    └─share


#### Build Toolのインストール
[GNU ARM Eclipse Windows Build Tools(github)](https://github.com/gnuarmeclipse/windows-build-tools/releases)
[gnuarmeclipse-build-tools-win32-2.6-201507152002-setup.exe](https://github.com/gnuarmeclipse/windows-build-tools/releases/download/v2.6/gnuarmeclipse-build-tools-win32-2.6-201507152002-setup.exe)
make, rmなどが含まれています。

`C:\dev\ARM\BuildTools`にインストールします。
デフォルトの`Program Files`でもかまいませんが、パスが長かったり空白が入ったりするのでオススメできません。

    C:\dev\ARM\BuildTools
    ├─bin
    ├─gnuarmeclipse
    └─license


#### OpenOCDのインストール
[GNU ARM Eclipse OpenOCD(github)](https://github.com/gnuarmeclipse/openocd/releases)
[gnuarmeclipse-openocd-win32-0.10.0-201510281129-dev-setup.exe](
https://github.com/gnuarmeclipse/openocd/releases/download/gae-0.10.0-20151028/gnuarmeclipse-openocd-win32-0.10.0-201510281129-dev-setup.exe)
OpenOCDはGDBサーバーおよびプログラマとなります。
必要なcfgファイルは`scripts`フォルダに用意されています。

`C:\dev\ARM\OpenOCD`にインストールします。
デフォルトの`Program Files`でもかまいませんが、パスが長かったり空白が入ったりするのでオススメできません。

    C:\dev\ARM\OpenOCD
    ├─bin
    ...
    └─scripts


#### STM32 ST-LINK utility
[STM32 ST-LINK utility](http://www.st-japan.co.jp/web/jp/catalog/tools/PF258168)
STのデバッガ、プログラマです。
何かあったとき複数の手段があると原因の絞り込みに役立ちます。
今回は使用しませんが、あると便利です。

#### STM32 CubeMX
[STM32CubeMX](http://www.st.com/web/en/catalog/tools/PF259242)
STのコードジェネレータです。
発振回路やペリフェラルの初期化用コードを生成するのに便利です。
機能を同時に使用できるか確認するのにも使えます。
クロックツリーの確認も便利です。

しかし、これ単体では動かすのは大変なので、CubeF1のサンプルと共に使います。
CubeF1の方にはBSPと呼ばれるボードの機能を簡単に使えるライブラリもついています。

## ST-LINK/V2-1

### 0. ST-LINKとは

STが開発したICE(デバッガ)の一種です。
ハードウェアを直接デバッグするのに必要になりますが、NucleoボードにはST-LINK/V2-1が搭載されているので、今回は別途用意する必要はありません。
Discoveryボードの場合は、ST-LINK/V2が乗っている場合もあるのでデータシートでの確認が必要です。

### 1. ST-LINK/V2-1用USBドライバをインストール

Nucleo-F103RBに搭載されているのはST-LINK/V2-1です。
ここで間違ったドライバをインストールすると、書き込みはできるが、デバッグができないなどの症状が起こります。
正しいドライバを選択しましょう。
下記2つはどちらでも問題ありませんが、全部入りのSTSW-LINK009の方をオススメしておきます。

[STSW-LINK009](http://www.st-japan.co.jp/web/jp/catalog/tools/PF260219)
ST-Link, ST-Link/V2, ST-Link/V2-1 USB driver signed for XP, Windows7, Windows8
※STSW-LINK008はSTSW-LINK009に統合されました。

[ST Link Driver](https://developer.mbed.org/teams/st/wiki/ST-Link-Driver)
[stlinknucleodriversigned.zip](https://developer.mbed.org/media/uploads/dan/stlinknucleodriversigned.zip)
Nucleo用のUSBドライバです。

### 2. Nucleo-F103RBを接続

Nucleo-F103RBを接続ドライバをインストールしたら、Nucleo-F103RBをUSB Mini-Bケーブルでパソコンに接続します。外付けドライブとして認識されていれば成功です。

### 3. ST-LINK/V2-1用ファームウェアをアップグレード

[Nucleo Firmware](https://developer.mbed.org/teams/ST/wiki/Nucleo-Firmware)
[STSW-LINK007](http://www.st.com/web/en/catalog/tools/PF260217)
ST-LINK/V2-1 firmware upgrade

解凍すると実行ファイル(jar, exe)が見つかりますが、どちらでもアップグレードが行えます。
jarはMacやLinuxでアップグレードを行うために追加されたものです。
あとは画面の指示に従ってファームウェアのアップグレードを行います。

    STSW-LINK007
    ├─NewAppliMacLinuxWindows
    │  └─STLinkUpgrade.jar
    └─OldAppliWindowsOnly
        └─ST-LinkUpgrade.exe


## Eclipseの設定

### 1. プロジェクトの作成

プロジェクトの新規作成画面を開きます。

`Eclipse: メニュー => ファイル => 新規 => C プロジェクト`

プロジェクト名(任意)を入力し、タイプを選択します。

    Project Name: nucleo_test
    Project Type: STM32F10x C/C++ Project
    Toolchain   : Cross ARM GCC


`次へ`


C プロジェクト(Target processor settings)
データシートを調べて、該当する値が間違っていないか確認します。
おそらくデフォルトのままで大丈夫でしょう。

    Chip family           : STM32f10x Medium Density
    Flash size(KB)        : 128
    RAM size(KB)          : 20
    External clock(Hz)    : 8000000
    Contents              : Blinky (blink a led)
    Use system calls      : Freestanding (no POSIX system calls)
    Trace output          : Semihosting DEBUG channel
    Check some warnings   : checked
    Check most warnings   : unchecked
    Enable-Werror         : unchecked
    Use -Og on debug      : checked
    Use newlib nano       : checked
    Exclude unused        : unchecked
    Use link optimizations: unchecked


オプションを解説します。

`Use system calls: Freestanding(no POSIX sysstem calls)`
GCCのリンカオプションで、-ffreestandingを追加します。
普通に組み込みで使う分にはこれで問題ありません。
[フリースタンディング環境](https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AA%E3%83%BC%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E7%92%B0%E5%A2%83)

`Use system calls: POSIX(system calls implemented by application code)`
アプリケーションコードにて実装と書いてあります。
stm32f1xxのテンプレートにnewlibが含まれていますので、このオプション用でしょう。
動作が不安定になった場合は、Freestandingにしましょう。
[Newlib](https://ja.wikipedia.org/wiki/Newlib)

`Use system calls: Semihosting(POSIX system calls via host)`
ホスト経由でシステムコールを使うと書かれています。
詳しい動作はソースコードを追ってください。

`Trace output: ARM ITM(via SWO)`
デバッガにJ-Linkを使用している場合に選択できるオプションです。
NecleoボードのデバッガはST-LINK/V2-1なので、使用できません。

`Trace output: Semihosting STDOUT stream`
Semihosting経由でputsやprintfを使用できるようです。
ただし、非常に低速なのでオススメできません。

`Trace output: Semihosting DEBUG channel`
Semihostingを有効にするとEclipseのコンソールにテキストを出力できます。
SemihostingとはARMコアからホストPCへメッセージを送る仕組みです。
[Semihostingとは](https://www.google.co.jp/search?q=semihosting%E3%81%A8%E3%81%AF)

※Eclipseは自動でやってくれるので問題ありませんが、コマンドラインから手動でデバッグをする場合は、semihostingを有効化しないとエラーで落ちるので要注意です。
ソースコード内にコメントで注意書きがあります。

※Semihostingなしでメッセージをやりとりしたい場合は、UARTを有効にして、シリアル-USB変換ケーブルを使います。

`Use newlib nano`
リンカオプションで--specs=nano.specsを使用します。
最低限のシステムコールの実装をリンクするようです。

`Exclude unused`
使用しないファイルをビルド除外に設定できるようです。
使用しないとコンパイル時間が長くなりますが、トラブルの元ですので、チェックはつけない方がよいでしょう。

`次へ`

C プロジェクト(Folders settings)
デフォルトのままで問題ありません。

    Include folder      : include
    Source folder       : src
    System folder       : system
    CMSIS library folder: cmsis
    C library folder    : newlib
    Linker script folder: ldscripts


`次へ`


C プロジェクト(構成の選択)
リリースビルドはいらないのでチェックを外します。

    Debug: checked
    Release: unchecked

`次へ`

C プロジェクト(Cross GNU ARM Toolchain)
ツールチェインをインストールしたフォルダを指定します。

    Toolchain name: GNU Tools for ARM Embedded Processors (arm-none-ebi-gcc)
    Toolchain path: C:\dev\ARM\Toolchain\bin


`完了`

### 2. 外部ツールの設定

OpenOCDが繋がるかどうか確認するための作業です。
Eclipseの外部ツールの設定画面を開きます。

`Eclipse: メニュー => 実行 => 外部ツール => 外部ツールの構成`

プログラムを選択し、新規ボタンを押して、`新規構成`を追加します。
追加された`新規構成`を選択し、項目を入力します。

メインタブ

    名前: OpenOCD(F103RB)
    ロケーション: ${openocd_path}\${openocd_executable}
    作業ディレクトリ: ${openocd_path}\..\scripts
    引数: -s "${openocd_path}\..\scripts" -f board/st_nucleo_f103rb.cfg


ビルドタブ

    起動前にビルド: unchecked


共通タブ

    お気に入りのメニューに表示
        外部ツール: checked


`適用`
`閉じる`

メインタブはストリング置換変数を用いずに記述することができます。
ストリング置換変数の内容は設定で確認できます。
設定画面を開き、フィルターに`ストリング置換`と入力すると、簡単に絞り込めます。

`Eclipse: メニュー => ウィンドウ => 設定`
`設定: 実行デバッグ => ストリング置換`

ストリング置換変数を展開すると下記のような状態となります。

    名前: OpenOCD(F103RB)
    ロケーション: C:\dev\ARM\OpenOCD\binopenocd.exe
    作業ディレクトリ: C:\dev\ARM\OpenOCD\scripts
    引数: -s "C:\dev\ARM\OpenOCD\scripts" -f board/st_nucleo_f103rb.cfg


### 3. OpenOCDの起動を確認

設定が終わったら、OpenOCDを起動して確認します。

`Eclipse: メニュー => 実行 => 外部ツール => OpenOCD(F103RB)`

OpenOCDを実行するとコンソール ビューに赤文字でメッセージが出力されます。
Nucleo-F103RBのLED(LD1)がカラフルに点滅していたら成功です。
コンソール ビューに終了ボタンが表示されているので停止します。

### 4. デバッグの設定

Eclipseのデバッグ構成を設定します。

`Eclipse: メニュー => 実行 => デバッグの構成`

左側の項目からGDB OpenOCD Debuggingを選択します。
新規構成ボタンをおして、`nucleo_test Debug`を追加し、項目を入力します。

デバッガータブ

OpenOCD Setup
Config optionsにOpenOCDの起動時の引数を設定します。

    Start OpenOCD locally: checked
    実行可能ファイル: ${openocd_path}/${openocd_executable}
    GDB port: 3333
    Telnet port: 4444
    Config options: -s "${openocd_path}\..\scripts" -f board/st_nucleo_f103rb.cfg


GDB Client Setup

    実行可能ファイル: ${cross_prefix}gdb${cross_suffix}
    その他のオプション:
    コマンド: set mem inaccessible-by-default off


始動タブ

Initialize commands
チェックをつけます。

    Enable ARM semihosting.: checked


Load Symbols and Executable

    シンボルのロード: checked
    Use project binary: selected

    実行ファイルのロード: checked
    Use project binary: selected


ランタイム・オプション

    Debug in RAM: unchecked


Run/Restart Commands

    Pre-run/Restart reset.: unchecked
    Set breakpoint at: checked & main
    継続: checked


共通タブ
チェックを付けます。

    お気に入りのメニューに表示
        デバッグ: checked


`適用`
`閉じる`

### 5. ソースコードの修正

Eclipseはプロジェクトを追加した直後に、ソースコードのパース(解析)を行います。
それによりコード片のインデックスを作成し、高度なデバッグ機能を実現しているのです。
なので、インデックスの作成前に、コードを修正しようとすると、エラーだらけになりますが、慌てずにインデックスの作成完了を待ちましょう。
ヘッダーが存在するのに未定義となる場合は、インデックスの再構築を試してみましょう。

STM32F4xxなどのテンプレートにはエラーが混じってしまっているようで、要修正となります。
今回はSTM32F1xxのテンプレートなので特にエラーの修正は必要がないと思います。
ちなみに、STM32F1xxのテンプレートではStd-Periph-Libが使用されていますが、STM32F4xxなどはHALが使用さます。

Nucleo-F103RBボードではPA5の出力がLD2につながっているので、修正します。
PA5というのはPORT Aの5番目(5bit目)のレジスタという意味です。
データシートをチェックして調べてみましょう。

初めてデータシートを読んだ時はPA5とPORTA5が同じものだとわからなくて悩んだ覚えがあります。

BlinkLed.c

    // Port numbers: 0=A, 1=B, 2=C, 3=D, 4=E, 5=F, 6=G, ...
    #define BLINK_PORT_NUMBER               (0)
    #define BLINK_PIN_NUMBER                (5)


### 6. プロジェクトのビルドおよびデバッグ

Eclipseプロジェクトのビルドを行います。

`Eclipse: メニュー => プロジェクト => すべてビルド(Ctrl + B)`

必要なソフトがすべてインストールされていれば問題なくビルドできるでしょう。
つづけて、Eclipseプロジェクトのデバッグを行います。

`Eclipse: メニュー => 実行 => デバッグ => デバッグの構成`

先ほど設定した `nucleo_test Debug` を選択し、デバッグを開始します。
ツールバーにあるデバッグボタンの▼からでも選択できます。
特に問題がなければコンパイル、OpenOCDの起動、書き込み、デバッグが行われます。

OpenOCDの起動には数秒の時間がかかります。
画面が切り替わり、コンソールにメッセージが出力されれば成功です。

コンソール出力

    Hello ARM World!
    System clock: 8000000Hz
    Second 1


LEDが点滅しなければ、ポートの設定が異なっていることが予想されます。
データシートなどをよく確認してください。

## その他

### HSEの利用

Nucleo-F103RBにはHSEがついていません。
Nucleoボードを最大周波数で利用したい場合は、デバッガ側に付いている水晶を使用できます。
マニュアルに従ってボード裏面の抵抗を付け替える必要があります。
特に問題がなければHSIで48MHzくらいで動かしておけばよいでしょう。

HSEを利用する場合はこちらの記事が参考になります。
[STM32 Nucleo ターゲットのHSEクロック取り扱いとデバッガホスト部からの供給](http://qiita.com/jj1bdx/items/85f99e82d3489f10879e)

### Nucleoボードの活用法

Nucleoボードはデバッガ(ST-LINK/V2-1)だけ切り離して使用することができます。
[NucleoとかいうST-LinkをFRISKケースに入れる](http://wiki.tokor.org/index.php?Nucleo%A4%C8%A4%AB%A4%A4%A4%A6ST-Link%A4%F2FRISK%A5%B1%A1%BC%A5%B9%A4%CB%C6%FE%A4%EC%A4%EB%A1%A1-%A1%A1STM32)

以上です。