LoginSignup
4
2

More than 3 years have passed since last update.

STM32CubeIDEでのデバッグ

Posted at

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"を選択。
New Project 1.png
Targetを選ぶ画面が表示されるので、所持するSTM32F303REを”Part Number”に入れて検索&選択。
New Project 4.png
その後、"Project Name"に名称を入力して"Finish"。

ピンアサイン

初期状態は下記のとおり。
Initial Pin View.png
Datasheetによると、ボタンはPC13に、LEDはPA5にアサインされている。
BTN_PC13.png

LED_PA5.png

PC13をクリックし、"GPIO_Input"を選ぶ。
PC13 Before Assign.png
PC13 After Assign.png
PA5については、"GPIO_Output"を選ぶ。
PA5 After Assign.png

ソースコード生成

"Project","Generate Code"を選択。
Generate Code.png
すると、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"をクリック。
Run&Debug.png
こんな画面が出たかもしれない。(2回目以降、表示されなくなったかも、、、。)
After Run.png
OKをクリックしたら、アンチウイルスソフトAvastから警告あり。

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

デバッグ

Runメニューにある"Debug"または"Debug As"をクリック。
DebugAs.png
次のメッセージが表示されることもあるが、"Switch"をクリックして次に進む。
SwitchToDebug.png

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

次に、for文の最後の処理である102行目「HAL_Delay(200);」にブレークポイントを設定する(Toggle Line Breakpointを選択)。
SettingBP.png
設定後には、ブレークポイントらしきマークが行番号左に表示される。
BP(L=102).png

実行を再開する("Resume"をクリック)。
Resume.png
すると、ブレークポイントで止まる。for文の繰り返し変数カウンタである”i”が"0"となっているのが見える。
1stBreak.png
さらに、"Resume"すると、同じブレークポイントで止まる。今度は、変数”i”が"1"となっているのが見える。
2ndBreak.png

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

終わりに

まずは初期の目的達成。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2