SW4STM32とCubeMXを用いてNucleo開発環境を整える

この記事では、Nucleoの開発環境の整え方と、SW4STM32とCubeMXそれぞれの使い方を、Lチカプログラムを作成しながら解説した記事です。少々長い記事ですがよろしくお願いします。あと、Lチカの際に抵抗（LEDを光らせられる程度のもの）とジャンパーが必要になるので注意してください。

Nucleoで遊ぶにはある程度、開発環境を整える必要があります。その開発環境としてSW4STM32とCubeMXを用います。mbedではなくこちらを用いる理由はいくつかありますが...細かいことは置いておいて早速構築の仕方に移ります。
# 動作環境
window、Mac、Linuxで動作するようです。Windows以外は詳しく確認していないので、動作しなかったなどがあったら、良ければコメントをお願い致します。
#SW4STM32の入手
下記のサイトからダウンロードしてきます。しかし、注意する点があります。ダウンロードする際にアカウント登録が必要になります。~~そして、2018/12/28時点でアカウント作成画面は**httpsではない**です。なので登録の際はアカウント名とパスワードの使い回しはかなり危険です。作成したアカウントはダウンロードする時しか使わないので、その場で新しい捨て垢を作ることをお勧めします。~~
【追記】2020/4/3現在、**https**になっています。

URL https://www.openstm32.org/HomePage
### アカウント作成
サイトの右上あたりの「Log in」ボタンを押してください。
![FireShot Capture 6 - OpenSTM32 Community Site I HomePage - http___www.openstm32.org_HomePage-min.png](https://qiita-image-store.s3.amazonaws.com/0/290563/cbc4e41d-15a9-f13b-f780-784c9eabb28f.png)

そしたら右下の「Register」をクリック。すると作成画面に飛べます。
![FireShot Capture 7 - OpenSTM32 Community Site I HomePage - http___www.openstm32.org_HomePage-min (1).png](https://qiita-image-store.s3.amazonaws.com/0/290563/7ac2e14c-ad05-7d77-ecd0-483bdf2c22d8.png)

なにやら赤い表示と共に、警告が出てきましたね...。
>
Please do not use an email address managed by Microsoft (email address @Outlook, Hotmail, Live...); Microsoft mail servers currently refuse all mails sent fom our servers so you would not be able to validate your email or login to the site...

どうやら、Microsoftが管理する電子メール（例：Outlook,Hotmail,live...）を使ってアカウント登録すると、登録確認用のメールが送られないようです。Gmailは問題ないです。

次に実際にアカウント作成に入っていきます。色々入力する必要がありますが、必須なのは以下のものです

+ ユーザーネーム
+ email
+ パスワード
+ 名前(名)
+ 苗字(姓)
+ 電話番号
+ 住所
+ 郵便番号
+ 住んでいる町
+ 都道府県
+ 住んでいる国
+ 確認用のコード

住んでいる国はいいとして、住所まで必要になります。別に構わないという人は普通に入力すれば、後から確認用のメールがやってきます。しかし、httpのサイトで個人情報を入力するのはかなり危険です。なので、出来るだけ誤魔化せないか自分なりに調べました。
すると、住所、住んでいる町、都道府県は「None」、と入力することで問題なく確認用のメール届きました。電話番号のチェックもかなりてきとうのようで、「1234-1234」とかでも通るらしいです。文字数カウントもしていないようなので、てきとうに打って大丈夫だと思います。

### アカウント作成後
登録した後にやって来る確認用のメールのURLを踏めば、ログインできているはずです。（もしも違っていたら、ログイン画面にユーザーネームとパスワードを入力してログインしてください。）そしたら、左側のMenu欄の中にある「System Workbench for STM32」をクリックして、
![FireShot Capture 6 - OpenSTM32 Community Site I HomePage - http___www.openstm32.org_HomePage_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/290563/aec8eb27-3616-0949-07d7-b7288057586a.jpeg)
「Downloading the System Workbench for STM32 installer」をクリックしてください。
![FireShot Capture 7 - OpenSTM32 Communit_ - http___www.openstm32.org_System%2BWorkbench%2Bfor%2BSTM32.png](https://qiita-image-store.s3.amazonaws.com/0/290563/263e3236-4674-682a-d8d7-4e78be58c2e6.png)


ここからは環境によってどのインストーラーをダウンロードするか決まります。どのOSか、加えて32bit環境なのか64bit環境かも確認した上でインストーラーをダウンロードしてください。WindowsではWindows7のものしかありませんが、私が使用しているWindows10でも問題なく使えました。Windowsの方は一番上の「install_sw4stm32_win_64bits-v2.7.exe」をダウンロードしてください（2018/12/23時点でのバージョン）

インストールの際は、インストーラーの指示通りに進めてください。上部の画面を何かいじる必要はありません。インストールし終わったら、SW4STM32を起動してください。

# SW4STM32の設定を少しいじる
デフォルトだと、プログラムをビルド（コンパイル）した際に自動で保存されない設定になっているので、保存されるように変更します。
（余談ですが、ビルドとコンパイルは少しやっている事が違います。気になる方は調べてみてください。）

まずは、「Window」から「Preferences」をクリックして
、設定画面を開いてください。
![スクリーンショット (31).png](https://qiita-image-store.s3.amazonaws.com/0/290563/f6e8555b-0d27-508a-9c02-d901b0d491c4.png)
次に、「General」をダブルクリックして、「Workspace」をクリックしてください。
![スクリーンショット (33).png](https://qiita-image-store.s3.amazonaws.com/0/290563/27570095-ed2e-c0c4-0e1a-4d623ce151c9.png)
右上にチェックボックスが５つ程並んでいるのが見えるでしょうか。これの、上から四番目の「Save automatically before build」にチェックをいれてください。その後、右下にある「Apply」を押せば設定完了です。
## いったん休憩
取り敢えずこれで、SW4STM32はダウンロードして、使えるようになりました。そういえば、まだこの「SW4STM32」の説明をしていませんでした。SW4STM32とはIDEのことです。IDEの詳しい説明は省きますが、Nucleoで遊ぶときは、基本ここでプログラムを書いていきます。Nucleo（具体的にはSTM32マイコン）のIDEはいくつかありますが、無料でもコード制限があったり、コンパイラがオンライン上にあるため、オフライン環境だとコンパイル出来ないなど欠点があります。SW4STM32だと、これらの欠点がカバー出来るので、このIDEを使用しています。ただ、情報が少なくて自分自身、開発環境の構築に苦戦したので、この記事をかいています。分かりやすい記事になっていたら嬉しいです。

# CubeMxを入手する
下記のサイトからダウンロードしてきます。このソフトの説明は後ほどします。

URL https://www.st.com/ja/development-tools/stm32cubemx.html

### CubeMXのダウンロード
飛んだら、そのサイトの一番下にダウンロードできるリンクがあるので、そこまで移動してクリックしてください。（下の画像参照）
![FireShot Capture 9 - STM32CubeMX - STM32_ - https___www.st.com_ja_development-tools_stm32cubemx.html.png](https://qiita-image-store.s3.amazonaws.com/0/290563/630c36a3-71f3-86dc-9c46-72a88acc97a0.png)
利用規約が出てきて、「accept」を押した後次のような画面が出たと思います。
![FireShot Capture 11 - STM32CubeMX - STM3_ - https___www.st.com_ja_development-tools_stm32cubemx.html.png](https://qiita-image-store.s3.amazonaws.com/0/290563/cacb660e-fd3a-d1d9-ffea-43d9a9b4c5fd.png)
またここでも、アカウントを登録する必要が...ないので、苗字と名前、メールアドレスを入力した後、チェックボックスにチェックを入れて、右下の「ダウンロード」を押してください。しばらく待つと、「STMicroelectronics 」という所からメールが送られてきます。そしたらそのメールの中にある、くっそ長いURLをクリックしてください。そうして暫く待つと、「en.stm32cubemx.zip」という名前のファイルがダウンロードされ始めます。これでCubeMXを入手することが出来ました。

# CubeMXのインストール
まず「en.stm32cubemx.zip」を解凍してください。そしたら、解凍したファイルの中にある、「SetupSTM32CubeMX-5.0.0.exe」をクリックしてください。すると下の画像ようなインストーラーが起動したと思います。
![スクリーンショット (14).png](https://qiita-image-store.s3.amazonaws.com/0/290563/1da87cd2-2ea5-f432-ec53-2040c4cc6ede.png)
あとはインストーラーの指示通りに進めてください。一応気を付けておくポイントがあるので言っておきます。（全然重要ではないですが...）
![スクリーンショット (15).png](https://qiita-image-store.s3.amazonaws.com/0/290563/d30da9d7-a7b1-34ba-3157-7ccb2eb151d4.png)
上のような画像の所まで進めると、二つのチェックボックスが出てきます。上の方は契約に同意するといった内容のものです。下の方はアプリを利用しているときの、機能の使用状況などのデータを会社側に送っても良いか聞いています。構わない方はチェックを入れてもいいですし、チェックを入れなくても先に進むことができます。
この後からは、上部の方は何も弄らなくて大丈夫です。そのまま進めていけば、インストールが完了すると思います。

# CubeMXを使えるようにする
まずソフトを使う前にインストールする必要のあるものがあるので、それをインストールしていきます。
始めに、CubeMXを開いてください。すると下のようなウィンドウが開いたと思います。バージョンが違うと見た目がかなり違いますが、問題はありません。
![スクリーンショット (17).png](https://qiita-image-store.s3.amazonaws.com/0/290563/e8af2182-8052-400e-a829-090a80d9a235.png)
次に、「Help」から「Manage embedded software packages」をクリックしてください。
![スクリーンショット (18).png](https://qiita-image-store.s3.amazonaws.com/0/290563/f522bc60-7363-6df3-a347-f702508201c4.png)
すると下の画像ようなウィンドウが出てきたと思います。
![スクリーンショット (21).png](https://qiita-image-store.s3.amazonaws.com/0/290563/3e3d80f4-059b-8dc4-c3d5-707d60485e3a.png)
ここから使っているNucleoボードによってインストールするものを選択する必要があります。ここで、今もっているNucleoボードの名前を確認してみてください。NUCLEO-F〇〇〇◇◇またはNUCLEO-L〇〇〇◇◇となっていると思います。（〇の中には数字、◇の中には文字が入ります）。この名前から後ろの４文字を削ると、NUCLEO-F〇またはNUCLEO-L〇となります。このF〇 or L〇を確認して、どのSTM32F〇 or STM32L〇を選べかいいか判断してください、例として私の使っているNucleoボードの名前はNUCLEO-F446REです。なので、私の場合はSTM32F4を選んでインストールします。バージョンは最新版でokです。選んでチェックを入れたら、下にある「Install Now」をクリックしてください。
参考程度に画像も貼っておきます。
![スクリーンショット (20).png](https://qiita-image-store.s3.amazonaws.com/0/290563/1ef5e735-b90b-35d8-5796-58017c2d1b70.png)

# 再びいったん休憩
これでCubeMXのインストールおよび使えるように設定し終わりました。ここでこのCubeMXについて話したいと思います。このCubeMXの特徴として、マイコンを動かすのに必要なコードを、設定をすれば勝手にコードを書いてくれるというものです。たとえば、このピンから電流が流れるようにしたい！というときも、CubeMXで設定すれば細かいプログラムなど必要なく、簡単な関数を実行するだけで電流のOn/offを切り替えられるようになります。これはマイコンのより複雑な機能を使うときに大変便利になります。本来いちいち記述しなければいけないコードを、CubeMXで設定するだけで、あとは勝手にCubeMXがコードを書いてくれるのです。NucleoではこのCubeMXとSW4STM32を組み合わせて使うことでNucleoを動かしていきます。
プログラム作成～マイコンに書き込みまでの流れとしては、

1. CubeMXを用いてどのピンにどのような機能を付けるのか決める。加えてマイコン自体の設定も行う
2. CubeMXで設定したと通りのコードを生成させる。
3. 生成されたコードをSW4STM32で開く
4. コードに付け加えて、自分のプログラムを書いていく。
5. プログラムをビルドし、STM32マイコンに書き込む
6. プログラムされた通りに回路が動く

といった流れになっています。
ではこれからこの流れに沿いながら、Lチカ（LEDをチカチカ）させるプログラムを書いていきたいと思います。出来るだけ画像を多くして、分かりやすく解説していきたいと思います。

# Lチカプログラムを作る
まずはじめに、CubeMXでピンの設定を行うために、新しいプロジェクトを作ります。
始めにCubeMXを開いてください。そしたら上部にある「File」から「New Project」をクリックしてください。（下画像参照）
![スクリーンショット (22).png](https://qiita-image-store.s3.amazonaws.com/0/290563/c0dc7422-7b3f-58f7-a2de-b2ab9331d4d2.png)
しばらく待つと、下のようなウィンドウが開かれます。
![スクリーンショット (23).png](https://qiita-image-store.s3.amazonaws.com/0/290563/c88a8075-3b06-3209-f282-48ca2a4c2241.png)
そしたら、そのウィンドウの左上にある「Board Selector」をクリックしてください。
![スクリーンショット (23).png](https://qiita-image-store.s3.amazonaws.com/0/290563/92749f23-71ac-c1b7-9fcf-fd392763eb38.png)
次に、Boards Listの中から自分の使っているボードを見つけてください。私はNUCLEO-F446REを使っているので、Boards Listを半分ほどスクロールした所にありました。目的のボードが見つかったらそれをダブルクリックしてください。下に参考画像も置いておきます。

ボードセレクターをクリックすると表示される画面。ウィンドウの下部にボードリストがある
![スクリーンショット (24).png](https://qiita-image-store.s3.amazonaws.com/0/290563/9211d867-05c4-b09b-a6e6-64ec7a006725.png)
自分の使っているボードを、リストをスクロールしながら頑張って見つける。見つけたらそこをダブルクリック！
![スクリーンショット (25).png](https://qiita-image-store.s3.amazonaws.com/0/290563/e5192658-b1a8-eea3-6153-1dd68471cd06.png)

### プロジェクトの設定をする
いま、CubeMXはおおよそ下の画像のようになっていると思います。実際には選ぶマイコンによってマイコンのピンの数など変わってきますが、おおよそこのようになります。
![スクリーンショット (26).png](https://qiita-image-store.s3.amazonaws.com/0/290563/0689680c-2490-1a64-7501-ff4860b75742.png)
これでプロジェクトを作り終わったので、ここからピンの設定をしていきます。ピンの設定といっても、今回はLEDを光らせるだけなので、一つのピンに手を加えるだけです。まず始めに、黒く表示されているピンをクリックしてください。どのピンを選んでも構いません。するといろいろ表示されたと思います。今回はその中から「GPIO_Output」をクリックしてください。私はPA1ピンをGPIO_Outptに設定しました。ここも参考画像を貼っておきます。

PA1をクリックするといろいろ表示される。この中から使いたい機能をクリックする。
![スクリーンショット (27).png](https://qiita-image-store.s3.amazonaws.com/0/290563/4ad6a5c0-ccbb-193b-c8eb-9633382b7758.png)
GPIO_Outputをクリックすると、PA1は黒色から緑色に変化する。PA1の横にGPIO_Outoutと書かれていることがわかる
![スクリーンショット (28).png](https://qiita-image-store.s3.amazonaws.com/0/290563/b426a520-c96e-c171-a3b4-2b533798dd20.png)
ここまで出来たら、次はプロジェクトの名前などを設定していきます。
最初に、ウィンドウ上部にある「Project Manager」をクリックしてください。
![スクリーンショット (29).png](https://qiita-image-store.s3.amazonaws.com/0/290563/53a1afa1-3a27-4369-85ee-e204888f162a.png)
ここからプロジェクトの名前など設定します。今回ここで変更するのは、「Project name」と「Toolchain/IDE」です。「Project name」は文字通りプロジェクトの名前を決めます。今回はシンプルに「LED」にしておきましょう。「Toolchain/IDE」では使うIDEによって選択します。今回は「SW4STM32」を使っているので、これを選択します。すると、下の画像のような状態になったと思います。また、「Project Location」が、SW4STM32によって生成された「workspace」になっていることも確認します。
![スクリーンショット (30).png](https://qiita-image-store.s3.amazonaws.com/0/290563/a85f7b24-34d6-fc1c-4217-10ed04308ce9.png)
ここまで来たら、あとはコードを生成するだけです。ウィンドウの右上にある「GNERATE CODE」をクリックしてください。
![スクリーンショット (30).png](https://qiita-image-store.s3.amazonaws.com/0/290563/30212e65-19ca-21ef-125a-c599114e7538.png)
これでコードを生成出来ました！次にSW4STM32での作業に移ります。

# SW4STM32でプログラミングする
まず、SW4STM32を開いてください。そしたら、ウィンドウ左側の「Project Explorer」の所にカーソルを合わせて、右クリックしてください。すると、いくつか表示されます。この中から「Import」選択してください。そしたらウィンドウが表示されます。そしたら「Existing Projects into Workspace」をダブルクリックしてください。
![スクリーンショット (36) (1).png](https://qiita-image-store.s3.amazonaws.com/0/290563/f08822ae-76ac-fa56-5ef2-a38685e850cd.png)
その後、ウィンドウの右上にある「Browse」をクリックして...
![スクリーンショット (38).png](https://qiita-image-store.s3.amazonaws.com/0/290563/5408043c-ed76-5767-552a-973e9aec9962.png)
先ほど生成したプロジェクトである「LED」を選択してください。
![スクリーンショット (39).png](https://qiita-image-store.s3.amazonaws.com/0/290563/76332114-20af-a88b-d5db-b0f1dd2bdc08.png)
選択したら、右下の「Finish」をクリック！
![スクリーンショット (40).png](https://qiita-image-store.s3.amazonaws.com/0/290563/f08245c9-0037-3c25-fc83-eafd42e7a730.png)
そうしたら、「Project Explorer」に「LED」が追加されます。次に、「LED」→「Src」→「main.c」の順で、main.cを開いてください。（下の画像参照）
![スクリーンショット (41).png](https://qiita-image-store.s3.amazonaws.com/0/290563/8896bc31-84e2-9ec6-1a32-976800e2b66b.png)

### SW4STM32でプログラムを書く
main.cにLチカプログラムを書いていきます。ただ注意するポイントが一つあります。このmain.cはCubeMXによって生成されたコードなのですが、ユーザーがプログラムを書けるところが予め決められています。それ以外のところに書いてしまうと、再度CubeMXでコードを生成した時に上書きされて、書いたプログラムが消されてしまいます。プログラムが書けるところは予めコメントで書かれています。下記に例を書いておきます

```
/* USER CODE BEGIN 〇〇〇 */
    「BEGIN」から「END」の間にプログラムを書き込む
/* USER CODE END 〇〇〇 */
```
ではLチカプログラムを追加します。但し注意するポイントとして、どのピンをGPIO_Outputに設定したかによってプログラムが微妙に異なってきます。その点についてはあとから説明しますので、とりあえず下記のコードの様になるようにmain.cに書き加えてください。なお、「USER CODE BEGIN 3」はmainc.cの123行目あたりにあると思います。main関数の中にあります。

```
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
      HAL_Delay(1000);
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
      HAL_Delay(1000);
  }
  /* USER CODE END 3 */
}
```

それでは解説に入ります。今回は二つの関数を使用しました。一つ目は「HAL_GPIO_WritePin」関数です。これは電流のON/OFFをさせる関数です。第一引数はGPIOのグループ、第二引数はグループ内のピン番号です。第三引数ではONにするのか、OFFにするのか設定します。ONにするときは「GPIO_PIN_SET」、OFFにするときは「GPIO_PIN_RESET」をそれぞれ書きます。私の場合は「PA1」ピンを利用しています。なので、関数の引数では
HAL_GPIO_WritePin(**GPIOA**, **GPIO_PIN_1**, GPIO_PIN_SET);
となります。例えば「PB10」の電流をON/OFFしたい時は
HAL_GPIO_WritePin(**GPIOB**, **GPIO_PIN_10**, GPIO_PIN_SET);
「PC6」の電流をON/OFFするときは
HAL_GPIO_WritePin(**GPIOC**, **GPIO_PIN_6**, GPIO_PIN_SET);
となります。引数を変えることで、ピンを選択し、ON/OFFが切り替えられるようになります。なのでもしも「PA1」以外のピンを使っていたら、この例を見ながら引数を変えてみてください。

次に「HAL_Delay」関数です。これは、引数に入れた値の分だけ待つ関数です。単位はmsです。

では改めて、このプログラムが何をしているのか分かりますか？プログラムの流れとしては

1. 指定したピンの電流をONにする
2. その状態のまま一秒待つ
3. 指定したピンの電流をOFFにする
4. その状態のまま一秒待つ
5. 1に戻る

という風になっています。ではこのプログラムをNucleo（STM32マイコン）に書き込んでいきましょう。

# Nucleo（STM32マイコン）にプログラムを書き込む
まず、NucleoとPCをUSBで接続させて下さい。それが終わったら、出来たプログラムをビルドしてください。ビルドボタンはウィンドウ上部にあります（下記の画像参照）。もし何かエラーが発生した場合、エラーメッセージを読んでデバックしてください。
![スクリーンショット (42).png](https://qiita-image-store.s3.amazonaws.com/0/290563/e63b0867-2fb9-6ae3-e515-81073e5482e1.png)
そしたら次に、「Project Explorer」の「LED」フォルダを右クリックしてください。
![スクリーンショット (46).png](https://qiita-image-store.s3.amazonaws.com/0/290563/f7d2353a-acbb-84d2-79b7-6e4b613579d0.png)
色々表示されましたが、その中から「Target」にカーソルを合わせて、「Program chip」を選択してください。
![スクリーンショット (43).png](https://qiita-image-store.s3.amazonaws.com/0/290563/781712af-e813-d1d8-2be2-8db7b51851e5.png)
次に、出てきたウィンドウの下部にある「Reset after program」にチェックを入れて「OK」を押してください。
![スクリーンショット (44).png](https://qiita-image-store.s3.amazonaws.com/0/290563/c25652ec-8250-af56-d4d4-70b52ea3689a.png)
これで書き込みが開始されて、上手くいけばプログラム通りにマイコンが動きます。あとは、そこらへんにある抵抗とジャンパーを持って来てください。配線の仕方ですが、+電源はGPIO_Outputに設定したピンに接続してください。-電源はもともとNucleoにはGNDと書かれたピンが存在するので、そこに接続してください。プログラムがうまくいっていればLEDがチカチカします。
# 終わりに
これでSW4STM32とCubeMXを用いた開発環境の構築、およびその使い方をLチカプログラミングを作りながら解説しました。とはいえ、これはまだNucleoのスタート地点に立ったに過ぎません。PWMやUARTといったマイコンに備わっている機能の解説もしたいところではありますが、それはほかの方々に譲りたいと思います。ネットで調べればある程度日本語の情報があります。まとまった情報が欲しいという方は、K.Watanabe様著の「STM32HAL&SW4入門」がオススメです。私もこれを参考書としながら、Nucleoを使っていました。この本には、開発環境のことは勿論、様々なマイコンの機能をとても分かりやすく解説しています。この記事も、この本を参考にしながら、またより分かりやすくなるように作成しました。
ではこれでこの記事はおしまいです。役に立てていたら幸いです。

K.Watanabe様著 「STM32HAL&SW4入門」のURLは下記の通りです。amazon様のKindleにて販売しています。かなり広範囲のマイコンの機能をカバーしていて、とても良い本です。
URL https://www.amazon.co.jp/STM32HAL-SW4%E5%85%A5%E9%96%80-K-Watanabe-ebook/dp/B0738L5KKQ

# 参考文献

K.Watanabe. STM32HAL&SW4入門 Kindle 版.  No.290, 420, 472~789