STM32CubeIDEでのデバッグ

#STM32 Nucleoでデバッグ
数年前から、STM32CubeMXを使ってNucleoボードのデバッグができるところを確認しようと思っていた。先日、ようやく重い腰をあげて、トライしようと[STM32の開発関連サイト](https://www.st.com/ja/development-tools/stm32-software-development-tools.html)を見ると、[STM32CubeIDE](https://www.st.com/ja/development-tools/stm32cubeide.html)という統合環境を使った方がベターあることが判明。（とは言っても、これもかなり前から存在している。）

##STM32CubeIDE
[ここ](https://www.st.com/ja/development-tools/stm32cubeide.html)からDownload。このIDEの特徴を箇条書き（引用）する。
- advanced C/C++ development platform
- based on the Eclipse®/CDT framework
- GCC toolchain for the development, and GDB for the debugging

##使用したボード
[Nucleo STM32F303RE](https://www.st.com/ja/evaluation-tools/nucleo-f303re.html)。各種サイトで2000円程度で売られている。

##テストサンプル
ボード内にあるボタンを押したら、LEDが数回繰り返し点滅する、、、という単純なもの。

##STM32CubeIDEの操作手順
###プロジェクト作成
"File","New","STM32 Project"を選択。
![New Project 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/7c3c5461-8313-b3f5-db45-b6559b72c5c1.png)
Targetを選ぶ画面が表示されるので、所持するSTM32F303REを”Part Number”に入れて検索＆選択。
![New Project 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/b6d0142c-2b07-eabb-d595-8e7ce9538ab3.png)
その後、"Project Name"に名称を入力して"Finish"。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/1927c1b1-aab8-077a-2bc8-b93a5cd3985d.png", width=70%>

###ピンアサイン
初期状態は下記のとおり。
![Initial Pin View.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/771ace0f-320a-de7e-572c-27aa9ec7ece4.png)
[Datasheet](https://www.st.com/resource/en/user_manual/dm00105823-stm32-nucleo-64-boards-mb1136-stmicroelectronics.pdf)によると、ボタンはPC13に、LEDはPA5にアサインされている。
![BTN_PC13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/605da549-bf08-0e30-6dfc-6761871866ad.png)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/7314786b-0e7e-0bba-840b-1deb884a5e97.png", width=25%>
![LED_PA5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/5d67b58d-1d4f-ef1b-2fa6-ef2c7df43f69.png)

PC13をクリックし、"GPIO_Input"を選ぶ。
![PC13 Before Assign.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/ece95d3c-dca0-1665-b802-6104387da81a.png)
![PC13 After Assign.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/a41dbdda-6897-c858-ce34-0206ea1c6222.png)
PA5については、"GPIO_Output"を選ぶ。
![PA5 After Assign.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/bb0c6358-f985-2b62-03af-73eb8abc0ac4.png)

##ソースコード生成
"Project","Generate Code"を選択。
![Generate Code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/2382b83c-7200-dddd-ec62-e635f75f2e35.png)
すると、Core/Src/main.cにGPIO初期化コードが自動生成される。

```c
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  (略)
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  (略)
}
　
/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PA5 */
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}
```
PC13とPA5の初期化コード（前者はINPUT、校舎はOUTPUTなど）が見える。

##処理をソースコードへ
「ボタンを押したら、LEDが数回（下記では5回）繰り返し点滅する」処理を、main()に追加する。

```c
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
	  if (!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)) {
		  for (i=0; i<5; i++) {
			  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
			  HAL_Delay(1200);
			  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
			  HAL_Delay(200);
		  }
	  }
	  HAL_Delay(100);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
```
ボタン押下読み取りにはHAL_GPIO_ReadPin()を、LED点灯にはHAL_GPIO_WritePin()を使う。STM32F3シリーズのAPI（HAL）の詳細は[こちら](https://www.st.com/content/ccc/resource/technical/document/user_manual/a6/79/73/ae/6e/1c/44/14/DM00122016.pdf/files/DM00122016.pdf/jcr:content/translations/en.DM00122016.pdf)で見つかる。

##実行
初めての実行、"Run"をクリック。
![Run&Debug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/276077a1-a32e-592e-e08d-f9f677f060cd.png)
こんな画面が出たかもしれない。（2回目以降、表示されなくなったかも、、、。）
![After Run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/b9a3d456-55bb-edeb-296f-f7ee76daeb1b.png)
OKをクリックしたら、アンチウイルスソフトAvastから警告あり。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/fcc6d5ca-d0ae-e059-5d93-666e5f9d1e20.png", width=60%>
調べると、[ここ](https://community.st.com/s/question/0D53W000004kPeb/avast-virus-checker-tells-me-that-the-newly-installed-stm32cubeide-is-infected-see-attached-what-should-i-do)に該当記事が見つかったので、例外登録（例外を作成）してそのまま進むことにした。
期待どおりの動作（ボタンを押したら、LEDが数回繰り返し点滅する）を確認したので、次のデバッグに進む。

##デバッグ
Runメニューにある"Debug"または"Debug As"をクリック。
![DebugAs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/52c375e1-03d0-cfa6-4501-f5cd74a07348.png)
次のメッセージが表示されることもあるが、"Switch"をクリックして次に進む。
![SwitchToDebug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/adc2e91b-6ccb-a2fe-f720-4fe8c01394c8.png)

すると、main()の最初の実行箇所「HAL_Init();」で止まるようだ。
![InitialStop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/abf14638-fb35-0e70-fed4-61cdeb4c4383.png)

次に、for文の最後の処理である102行目「HAL_Delay(200);」にブレークポイントを設定する（Toggle Line Breakpointを選択）。
![SettingBP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/baa08606-d5ea-c988-9f42-bbbbc2065e15.png)
設定後には、ブレークポイントらしきマークが行番号左に表示される。
![BP(L=102).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/3e2c0df7-5155-ca4f-3630-644d1ce80241.png)

実行を再開する（"Resume"をクリック）。
![Resume.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/aedb296d-f9d8-d118-bff4-0bd10b32dbdc.png)
すると、ブレークポイントで止まる。for文の繰り返し変数カウンタである”i”が"0"となっているのが見える。
![1stBreak.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/4efba738-e5c7-d0dc-47b5-c48633ed51d5.png)
さらに、"Resume"すると、同じブレークポイントで止まる。今度は、変数”i”が"1"となっているのが見える。
![2ndBreak.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/c07df892-9e46-158c-4831-4687c2476d7c.png)

例えば、”Value"をクリックし、値を変更することも可能。
![ChangeValue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/27862dc7-9464-11f5-f463-6f20a4794ba7.png)

##終わりに
まずは初期の目的達成。