STM32CubeIDEでデバッグしてみる その1

  • 2020.01.11
  • IDE
STM32CubeIDEでデバッグしてみる その1

今回もSTM32CubeIDEに関する話題です。呼び名が少々長いので、今後こちらのサイトでは STM32CubeIDE を単にIDEと呼ぶことにします。

今回はSTマイクロから発売しているNucleo-F401REボードをIDE上で実際に動かしてみます。 ボードに搭載されているマイコンはCortex-M4の64ピンで、RAMが96KB、フラッシュメモリーは512KBです。 ボードの詳細については こちら を参照してください。

ボードは比較的安価(購入価格は2,000円しない程度)で、ネットや秋葉原で購入できるものを選びました。

Amazonでは以下から購入できるようです。マイコン単体の画像になっていますけれど・・・

それでは、さっそくIDEでボードを動かしてみましょう。環境は以下の通りです。

投稿時の開発環境
PC:Windows10 OS
IDE: STM32CubeIDE Version1.1.0
Configurator: STM32CubeMX Version5.4.0
Board: STM32Nucleo-F401RE

起動してみる

USBケーブルでボードとPCを接続しておきます。

IDEを起動してメニューの File – New – STM32 Project を選択します。

Target Selection というウィンドウが出ますので、真ん中のタブの Board Selector を選択します。

右側の枠内のBoard ListからNUCLEO-F401REを選択しNextボタンを押します。

Project Setupというウィンドウが出ますので、Project Nameの枠内に F401 と入力して、Finishボタンを押します。(OptionsのラジオボタンはそのままでOKです)

Initialize all peripherals with theri default Mode?

と聞いてきますので Yes ボタンを押します。

続いて

This kind of project is associated with the STM32CubeMx perspective. Do you want to open this perspective now?

と聞いてきますので Yes ボタンを押します。

一番最初は使うデバイスのファームウェアをアップデートしなければなりません。ですからインターネットに接続しなければならないのと、ダウンロードに少々時間がかかります。(私の環境では7分程度かかりました)

お時間に余裕のある時に試していただけたらと思います。

ビルドしてみる

Project – Build All を選択してビルドします。

特別なことがない限り、consoleに以下のようなメッセージが表示されて無事ビルドが完了します。

xx:xx:xx Build Finished. 0 errors, 0 warnings. (took xxx ms)

この状態でプログラムを実行しても挙動がわからないですね。

コーディングしてみる

それでは何かプログラムを書いてみましょう。

左側に Project EXplorer があり、プロジェクト名が > F401 と表示されています。
> をクリックするとプロジェクトのツリーの下の階層が見えてきます。
> F401 > Core > Src と下の階層に降りていくと main.c が見えてきます。

main.c をダブルクリックすると画面中央のエディタで編集できるようになります。
main.c を編集していく前に注意点があります。

以下のようにソースコードが書かれていますが、

/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

ファイルをインクルードする場合を例にあげてみます。
追加するコードは以下のように USER CODE BEGIN xxx と USER CODE END xxx の間に記述します。

/* USER CODE BEGIN Includes */
#include "hogehoge.h"
/* USER CODE END Includes */

コードジェネレーターの機能を使わなければこの規則に従う必要はありませんが、念のためにこの規則に従っておくことをお奨めします。
コードジェネレーターを使った場合には 「USER CODE BEGIN xxx と USER CODE END xxx」に挟まれた場所以外のところに書かれたソースコードは削除されてしまいますのでご注意ください。
コードジェネレーターについては別の機会にお話します。

マイコン関連で最初に書くお決まりのコードと言えばLチカですね。
「Lチカって何?」と思われる方のために簡単に説明しておきます。
LはLEDの略、チカはチカチカの略で、LEDをチカチカさせることをいいます。
I/Oの制御で最も初歩的なものでプログラムの動作確認に良く使われます。

NUCLEO-F401REの回路図は こちら からダウンロードできますので参考にしてください。

回路図(4/4)より制御できそうなLEDはLD2(緑色)です。

D13という信号名ですが回路図(2/4)を見るとPA5につながっています。

PA5はGPIOポートAのビット5です。

そこで main.c の USER CODE BEGIN 1 と END 1 の間に以下のようにコードを書いてみてください。

int main(void)
{
  /* USER CODE BEGIN 1 */

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  __HAL_RCC_GPIOA_CLK_ENABLE();
  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);

  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
  HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
  HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);

  /* USER CODE END 1 */

そしてビルドしてエラーがないことを確認してください。

ブレークポイントを貼ってみる

キーボードを使って「HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);」 の行にカーソルを持っていき、
Ctrl + Shift + B します。
(CtrlキーとShiftキーを押しながらBキーを押す)

そうすると、この行の左側に●が表示されます。これがブレークポイントの目印になります。
もう一度Ctrl + Shift + Bすると、ブレークポイントは解除されます。

または行番号のところをマウスでダブルクリックしてもブレークポイントを貼ることができます。

それではメニューから Run – Debug を選択してください。

プログラムを実行する

Run – Debug すると「GPIO_InitTypeDef GPIO_InitStruct = {0};」の行でプログラムは停止します。

そして Run – Resume を選択する(または F8キーを押す)とプログラムを実行しブレークポイントを貼った行で停止します。
ご存じだとは思いますが、ブレークポイントを貼った場所にプログラムが来ると、そこで停止します。

ここから先はプログラムを1行ずつ実行していきます。

最初に実行する行は「HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);」です。
GPIO_PIN_SET は このピンの電圧レベルをH側に上げることを意味しています。
GPIOA(LEDのアノード側)に電圧を加えるのでLEDが点灯することになります。

1行ずつプログラムを実行することを「ステップ実行する」といいます。

それではステップ実行してみましょう。
Run – Step Over を選択します(または F6キーを押す)

基板の中央付近にある緑色のLEDが点灯します。

最初に実行する行は「HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);」です。
GPIO_PIN_RESET は このピンの電圧レベルをL側に下げることを意味しています。
LEDのアノード側に電圧を供給しなくなるのでLEDが消灯することになります。

それではステップ実行してみましょう。
Run – Step Over を選択します(または F6キーを押す)

LEDが消灯します。

次に実行する行は「HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);」です。
Toggle(トグル)は2つの状態を切り替えるという意味です。
今LEDは消灯しているので、この行を実行するとLEDが点灯します。

それではステップ実行してみましょう。
Run – Step Over を選択します(または F6キーを押す)

LEDが点灯します。

次に実行する行も「HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);」です。
今LEDは点灯しているので、この行を実行するとLEDが消灯します。

それではステップ実行してみましょう。
Run – Step Over を選択します(または F6キーを押す)

LEDが消灯します。

いかがでしたでしょうか?
今回はIDEのほんの一握りの機能についてご紹介しました。

次回は追加したコードについて説明します。

この続きを読むには こちら からどうぞ。

IDEカテゴリの最新記事