STM32 Discovery開発ボードのKeilを用いた開発環境構築

# 記事の概要
STM32 Discovery開発ボードの[STM32F407 DISCOVERY Board](https://akizukidenshi.com/catalog/g/gM-05313/)を用いて開発環境を構築し、LED点滅をさせるプロジェクトを作成します。

統合開発環境にはKeilの無料試用版を用います。
他のSTM32 Discovery開発ボードでも同様の手順で環境構築できると思います。

プロジェクトの作成にはCubeMXを使用する方法と使用しない方法があります。
本記事では、CubeMXを使用しない方法を紹介します。

# Keilのインストール
Keilを以下のサイトからダウンロードしてください。

https://www.keil.com/demo/eval/arm.htm

名前、e-mailなどの入力を求められますので、必要事項を入力してsubmitをクリックしてください。
以下のMDK***.EXEファイルをダウンロードして実行します。

<img width="50%" alt="Keilインストール2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/d2927fa4-ab5b-40ee-6acb-d03aeb0bd76e.png">

次へをクリックします。
<img width="50%" alt="Keilインストール3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/1055be89-9945-2392-f16b-e16b033e3068.png">

チェックボックスに同意して、次へをクリックします。
<img width="50%" alt="Keilインストール4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/1ea4522f-9dfd-3a18-bd6d-89b447e6f6da.png">

インストール先を指定して（初期設定で問題なし）、次へをクリックします。
<img width="50%" alt="Keilインストール5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/d016ee68-3f0c-3b60-6157-f159329ba528.png">

名前、email、所属を入力して、次へをクリックします。
<img width="50%" alt="Keilインストール6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/c6c6c13b-21a0-2df6-8fd1-41dd051abd71.png">

インストール完了後、次へをクリックします。
<img width="50%" alt="Keilインストール7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/9080f36e-d244-55df-49c9-05c078d2f4f3.png">

インストールが成功すると以下の画面が表示されます。
<img width="50%" alt="Keilインストール8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/0302d6c9-8cff-160c-5edd-d157d5ad814a.png">

## パッケージのインストール
インストール後、自動でパッケージのインストール画面が表示されます。
<img width="80%" alt="パッケージインストーラ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/9f66538c-3c8d-0a8a-479e-622f76d76db0.png">

Boardタブを選択し、STM32F4-Discoveryをクリックすると、右画面が表示されます。
その中からKeil::STM32F4xx_DFPのInstallをクリックしてください。
<img width="80%" alt="パッケージインストーラ2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/1c234e87-769b-582e-ff23-7c3c796292d5.png">

後で追加でパッケージのインストールをしたい場合は、メニューのパッケージ・アイコンをクリックしてください。
<img width="80%" alt="パッケージインストーラ0.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/ca9e0705-0e7d-64f3-d0a5-5523f26f1482.png">



# 新規プロジェクト作成（CubeMXを使用しない場合）

以下の動画を参考にして新規プロジェクトを作成します。

https://www.youtube.com/watch?v=kHWdMnlEW8E

## 新規プロジェクト作成
新規プロジェクトを作成するには、Project→New $\mu$Vision Projectをクリックします。
<img width="50%" alt="新規プロジェクト作成1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/c36a922d-70aa-6b52-93f1-0b6bd072cc8e.png">

プロジェクトの名称を設定して作成をクリックします。
「新しいフォルダ」から新規プロジェクト用のフォルダを作成して、そのフォルダ内に置くことをお勧めします。
<img width="50%" alt="新規プロジェクト作成2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/94ac0a39-170f-2235-9919-2e6a5072e875.png">

## マイクロプロセッサの指定
次にマイクロプロセッサの指定画面が表示されます。
<img width="50%" alt="新規プロジェクト作成3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/8d924c38-e623-6a51-123f-44e73673121e.png">

STM32F407 DISCOVERY Boardに使用されているのはSTM32F407VGT6なので、STM32F407→STM32F407VGTxをクリックします。
<img width="50%" alt="新規プロジェクト作成3b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/ab9e586e-d8e4-d774-bba7-ce476b5c8d35.png">


## ソフトウェアコンポーネントの選択
次に、自動でソフトウェアコンポーネント設定画面が開きます。

<img width="70%" alt="新規プロジェクト作成4a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/97aaa297-1797-6586-0564-a4ce0d779400.png">

各項目を以下のように設定します。

- Board Support
    - STM32F4-Discovery
- CMSIS
    - CORE
- Device
    - Startup
    - STM32Cube Framework(API)
        - Classic
            - オレンジ色の表示が出た場合はResolveをクリック
    - STM32Cube HAL
        - 使用する周辺モジュールを追加で選択
            - オレンジ色の表示が出た場合はResolveをクリック

以下の画面のように、項目を選択時にオレンジ色になった場合は、Resoleveをクリックして必要な項目を自動選択します。

<img width="70%" alt="新規プロジェクト作成4b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/357a5c0d-92eb-32ce-3c99-1eb595828209.png">

以上の設定完了後、以下の画面が開きます。Deviceにソフトウェアコンポーネントの設定が反映されています。
後でソフトウェアコンポーネントを再設定したい場合は、メニューのソフトウェアコンポーネント・アイコンをクリックしてください。
<img width="50%" alt="新規プロジェクト作成5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/e4cea65f-f3c4-7545-ad94-496562adc5fb.png">

## オプション設定
次に以下のオプション・アイコンをクリックしてオプション設定をします。
<img width="50%" alt="新規プロジェクト作成6a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/19403ea2-1317-41e9-f558-39bc56bed7c3.png">

開発ボードをPCに接続した状態で、「Linker」タブのUseからST-Linkerを選択します。
<img width="50%" alt="新規プロジェクト作成6b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/7829ad40-2400-909b-a18d-bbf424fa8fc5.png">

次にUseの隣にあるsettingをクリックします。
場合によってはST-Linkのインストールもしくはアップデートが必要になります。
以下のようなアップデート画面が表示された場合は、Driver Connectをクリックしてドライバーを検索し、Yesをクリックしてアップデートします。
<img width="50%" alt="新規プロジェクト作成6c.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/e071bff3-a112-ca4d-5459-0110801748ac.png">

ST-Linkが検知されていれば、setting画面にST-Linkが表示されているはずです。
<img width="50%" alt="新規プロジェクト作成6d.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/80086e57-f01e-d360-6117-4ee0a181d247.png">

Flash DownloadのReset and Runにチェックを入れておきます。
これによりファームウェアを開発ボードにダウンロードすると、リセットを押さなくても自動でプログラムが開始するので便利です。
<img width="50%" alt="新規プロジェクト作成6e.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/d77554c4-aeb7-2d66-da8c-485aeb3715ef.png">


先に紹介した動画では、「C/C++(AV6)」タブにおいてDefineにUSE_HAL_DRIVERと入力し、Include Pathにプロジェクト・ファイルの置かれているフォルダを指定していましたが、私の環境ではこの設定は必要ありませんでした。


先に紹介した動画では、「Target」タブにおいて外部クリスタルを8MHzに設定していますが、実際には選択できません。
<img width="50%" alt="新規プロジェクト作成6h.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/b5ab0b63-4334-7065-5ae3-422369e545b6.png">


以下のサイトを見ますと、外部クリスタルはデバイスシミュレーションを使用する場合のみに設定できるので、開発ボードでデバッグする場合には設定する必要がないそうです。
新しいCortex-Mデバイスの周辺機器シミュレーションドライバーが利用できないため、この設定は.uvprojxプロジェクトでは無効になっているとのことです。

https://developer.arm.com/documentation/ka004823/latest



## サンプルプロジェクトのビルドとダウンロード
次にLEDを点滅させるプログラムを作成して、ビルドとダウンロードしてみます。
ここでは、先の動画内で紹介されていた以下のサンプルプロジェクトを用います。

https://programming.msphotogs.co.uk/stm32f4-discovery-beginners-tutorial-blink-leds

このサンプルプロジェクトは、HAL libraryを使用せず、レジスタの設定に値を代入しています。

なお、このサンプルプロジェクトのために、最適化レベルをO1からO0に変更します。
サンプルプロジェクトはforループを2000000回繰り返して一定の待機時間を作ります。
ですが最適化レベルがO1になっていると、これを無意味なforループと判定して削除してしまいます。

<img width="50%" alt="新規プロジェクト作成6i.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/ae137051-37c3-9b08-8126-3f7674c67653.png">

Projectメニューにおいて、ファイルを追加したいフォルダを右クリックしてAdd New Itme...を選択し、新規ファイルを追加します。
<img width="50%" alt="新規プロジェクト作成7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/c2463921-05bd-bffb-af21-2c7780a8564c.png">

C言語ファイルのmain.cを作成して、フォルダの適当な場所に置きます。
<img width="50%" alt="新規プロジェクト作成7b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/c26358ce-baad-a391-f999-674855d774b4.png">

main.cに先ほどのサンプルプロジェクトのmain.cをコピー＆ペーストしてから、メニューに表示されているビルド・アイコンをクリックします。
<img width="80%" alt="新規プロジェクト作成8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/2e91650e-eb6f-d57a-5809-b91ed5cced81.png">


ビルドが成功したのならば、メニューに表示されているダウンロード・アイコンをクリックします。
書き込みに成功すると、（オプション設定において、書き込み後に自動でリセット開始する設定にしたので）LED点滅が始まります。
<img width="50%" alt="新規プロジェクト作成9a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/4b17f625-d690-e10c-4285-6a13ca186893.png">


Debug→Start/Stop Debug Sessionをクリックすれば、デバック画面に遷移します。
<img width="50%" alt="新規プロジェクト作成9b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/530e08a7-bcfa-547f-2b88-b7a043e70727.png">

ブレークポイントを置くなどしてRUNをクリックすれば、デバックが開始されます。
Start/Stop Debug Sessionを再度クリックすればデバック終了します。
<img width="50%" alt="新規プロジェクト作成9c.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/9902a2e1-1499-add6-7456-90e5aa9003f2.png">

## HAL libraryの利用
サンプルプロジェクトと同じことを、HAL libraryを利用して書き直すと以下のようになります。

```C:main.c
#include "stm32f4xx.h"

int main(){	
	// Loop Variables
	uint32_t i;
		
	__HAL_RCC_GPIOD_CLK_ENABLE();
	
	GPIO_InitTypeDef myLEDconfig;
	myLEDconfig.Mode = GPIO_MODE_OUTPUT_PP;
	myLEDconfig.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
	
	HAL_GPIO_Init(GPIOD, &myLEDconfig);
	
	while(1)
	{
		HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
		
		// Delay
		for(i = 0; i < 2000000; i++){}; // Loop repeats 2,000,000 implementing a delay
	}	
}
```

# CubeMXによる新規プロジェクト作成
本記事では解説しませんが、CubeMXを使用する方法は以下を参照してください。

以下の動画とQiita記事が参考になります。

https://www.youtube.com/watch?v=uJvPwxa5n00&t=207s

https://qiita.com/gkmaro634/items/7b2ce4f72615c96f41d3

CubeMXは以下からインストールできます。

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