STM32CubeIDEでのデバッグ


STM32 Nucleoでデバッグ

数年前から、STM32CubeMXを使ってNucleoボードのデバッグができるところを確認しようと思っていた。先日、ようやく重い腰をあげて、トライしようとSTM32の開発関連サイトを見ると、STM32CubeIDEという統合環境を使った方がベターあることが判明。(とは言っても、これもかなり前から存在している。)

STM32CubeIDE

ここから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。各種サイトで2000円程度で売られている。

テストサンプル

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

STM32CubeIDEの操作手順

プロジェクト作成

"File","New","STM32 Project"を選択。

Targetを選ぶ画面が表示されるので、所持するSTM32F303REを”Part Number”に入れて検索&選択。

その後、"Project Name"に名称を入力して"Finish"。

ピンアサイン

初期状態は下記のとおり。

Datasheetによると、ボタンはPC13に、LEDはPA5にアサインされている。


PC13をクリックし、"GPIO_Input"を選ぶ。


PA5については、"GPIO_Output"を選ぶ。

ソースコード生成

"Project","Generate Code"を選択。

すると、Core/Src/main.cにGPIO初期化コードが自動生成される。

/**
  * @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()に追加する。

  /* 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)の詳細はこちらで見つかる。

実行

初めての実行、"Run"をクリック。

こんな画面が出たかもしれない。(2回目以降、表示されなくなったかも、、、。)

OKをクリックしたら、アンチウイルスソフトAvastから警告あり。

調べると、ここに該当記事が見つかったので、例外登録(例外を作成)してそのまま進むことにした。
期待どおりの動作(ボタンを押したら、LEDが数回繰り返し点滅する)を確認したので、次のデバッグに進む。

デバッグ

Runメニューにある"Debug"または"Debug As"をクリック。

次のメッセージが表示されることもあるが、"Switch"をクリックして次に進む。

すると、main()の最初の実行箇所「HAL_Init();」で止まるようだ。

次に、for文の最後の処理である102行目「HAL_Delay(200);」にブレークポイントを設定する(Toggle Line Breakpointを選択)。

設定後には、ブレークポイントらしきマークが行番号左に表示される。

実行を再開する("Resume"をクリック)。

すると、ブレークポイントで止まる。for文の繰り返し変数カウンタである”i”が"0"となっているのが見える。

さらに、"Resume"すると、同じブレークポイントで止まる。今度は、変数”i”が"1"となっているのが見える。

例えば、”Value"をクリックし、値を変更することも可能。

終わりに

まずは初期の目的達成。