VS Codeを用いた"STM32 Nucleo Board STM32F446RE"の開発環境

# 概要
VSCodeを用いた"STM32 Nucleo Board STM32F446RE"の開発環境の構築方法を紹介します。
PCのOSはWin11\(おそらく他のOSでも可能)、プロジェクトはCubeMXで生成してHALドライバを使えるようにします。

# 用意するもの
* STM32 Nucleo Board STM32F446RE (開発環境を整えるだけなら必要なし)
* PC (Win11。おそらく他のOSでも可能)

# 準備
### VSCodeのインストール
この記事を読んでいる人はすでにインストール済みだとは思いますが、未インストールの方はここからインストールしてください。
[VSCode](https://code.visualstudio.com/)

### VSCodeに拡張機能をインストール
VSCODEに拡張機能"STM32 VS Code Extension"をインストールしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/accbd150-0661-4385-8045-a7cde01eece1.png)
(参考:https://www.st.com/content/st_com/ja/campaigns/stm32-vs-code-extension-z11.html)

### STM32CubeMXとSTM32CubeCLTのインストール
以下から"STM32CubeMX"と"STM32CubeCLT"をインストールしてください。
MySTアカウントが必要になると思うので、持っていない人は作成してください。
[STM32CubeMX](https://www.st.com/ja/development-tools/stm32cubemx.html?icmp=tt38569_gl_lnkon_apr2024)
[STM32CubeCLT](https://www.st.com/ja/development-tools/stm32cubeclt.html?icmp=tt38569_gl_lnkon_apr2024)

:::note warn
この2つのソフトはWindows版をダウンロードしてください。
(〇〇〇-Win.exeのような名前です)
:::

### 念のためPCを再起動
VSCode、STM32CubeMX、STM32CubeCLTこれらをインストールしたら念のためPCを再起動した方が良いと思います。

# 新しいプロジェクトの作成
### STM32CubeMXを起動
まず、STM32CubeMXを起動します。
スタートから名前で検索するとよいと思います。

### プロジェクトの作成
1. New projectの"ACCESS TO BOARD SELECTOR"をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/2726dbce-8f4d-4eda-ac05-a4fb00510cea.png)
2. 検索ボックスに使いたいボードの名前を入力し、リストからそのボードを選択します。その後、"Start Project"をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/aa47fbbf-493a-494e-9544-6eb14058d991.png)
3. ダイアログが表示されるのでペリフェラルをデフォルト設定にしたい場合は"Yes"をクリックします。
    (特にこだわりがなければ、とりあえず"Yes"でいいと思います。)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/9178472e-2dce-4e0c-8660-48e29f6b9cf5.png)
4. この画面が表示されたら、"Project Manager"をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/79fc6ae5-b44e-46d5-ae2e-7fd60653a721.png)
5. "Project Name"に好きな名前、"Project Location"にプロジェクトを保存したいフォルダ名、"Toolchain/IDE"にCmakeを入力します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/df6c3279-d8b2-4703-8d59-7f68195307d2.png)
    コード生成するためのファームウェアのバージョンを固定化しておいたほうが良いかも知れません。        (Project Managerの下の方で設定できます。)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/2d7e2de9-a914-4a8f-bb4e-5daac854a957.png)

6. "GENERATE CODE"をクリックします。
    初回のコード生成時は足りないファームウェア等をダウンロードするために、MySTアカウントにログインを求められる場合があります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/016a44ee-5a91-44ad-838c-6611aa07ffb1.png)
7. これでプロジェクトの作成は完了です。

# VSCodeでプロジェクトを開く
### 拡張機能でプロジェクトフォルダを開く
"STM32CubeMX"で生成したプロジェクトをVSCodeの拡張機能"STM32 VS Code Extension"で開きます。
この操作をすることで、VSCodeの自動タスクに関する設定json等が自動で生成されるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/a415e164-c8fa-438a-bb77-285bb3f5aa52.png)

:::note
この操作はプロジェクトを新しく作成した後の初回のみでOKです。
その後は直接VSCodeでフォルダを開けば良いです。
:::

### 試しにNucleoに書き込んでみる
そのまま書きこんでも何も動かないので、書き込めているか分からないため、Lチカプログラムを試しに書き込んでみてください。
main.cに以下のように追加してください。
```diff_cpp
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
+    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
+    HAL_Delay(1000);
+    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
+    HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
```
追加したら、NucleoをPCに接続してください。そして、タブから"Terminal"->"Run Task..."->"Build + Flash"->"Continue without scanning the task output"と選択してNucleoに書き込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/43fd1952-71bc-4e21-8a93-722ccbfa0eae.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/1d49ee32-8f61-4927-b29f-6a9c86a3ef3d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/34890e36-9a0f-4f72-9c9e-b0ecf224e32d.png)
Lチカが確認できたら、書込み成功です。

# まとめ
今回はNucleoの最低限な開発環境をVSCodeで構築する方法を紹介しました。
この記事が誰かの参考になれば幸いです。


今後はVSCodeでのデバッグ方法等を調べて、記事にしようと思います。

デバッグに関しては、ST-LINKをアップグレードするだけでできました。

https://qiita.com/harashi10969/items/41e71ce723277def40f3

# 参考
* https://qiita.com/ior14016jp/items/ae3610f85785957f4420
    拡張機能のバージョンが古いですが、VSCodeでSTMの環境を作成しています。
* https://community.st.com/
    公式がコミュニティサイトを開設してくれています。
* https://www.youtube.com/watch?v=DLmbNfUh62E
    拡張機能についての公式のYouTube動画もあります。