前回は Standard Peripheral Library を使ったLEDチカをさせてみましたが、今度は STM32CubeMX + HAL DriversでLEDチカをさせてみます。Standard Peripheral Libraryは過去に有志が作成したプログラム + 回路を試すという用途しか想定していないので、深追いはしません。STM32CubeMX + HAL Driversを色々と試してみたいと思います。
回路について
ひとまず、ごく簡単な回路を作りました。
本来ならパスコンを入れるべきなんだろうけど入れていません。ブレッドボード上に楽して作ったので。最終的にガジェットに仕立て上げる時には入れましょう。
電源ラインについては全て接続しました。AVRマイコンでは接続しないと安定しないことがあったので。この点については追々ちゃんとマニュアルを読んで、どうするべきか把握しておこうと思います。
STM32CubeMXでスケルトンコードを作成する
STM32CubeMXはCPUを選択し、使用する機能やピンを指定することで、それに見合ったイニシャルコードを生成してくれるというものです。少しでもコードを最適化し、使用するCPU資源を減らすことを趣味のようにしている人たちには性に合わないかもしれませんが、限られた時間でモノを作りたいという人たちにはありがたいものです。STM32マイコンは色々と機能が載っていますが、1つのピンに幾つかの機能が割り当てることができるようになっていてそれらの設定が必要になっています。また、もちろんそれぞれの資源を使いこないために必要なレジスタの設定も必要です。とりあえずSTM32マイコンを勉強中出会っても比較的容易にモノづくりができます。ただ、バグに見舞われた場合にはまってしまう危険がありますが…
STM32CubeMXの起動
何はともあれEclipseを起動しましょう。起動したら、 Window >> Show View >> Other… を選択しましょう。 STM32CubeMX が一覧に存在するはずなので、こちらを選択。
上のスクリーンショットのような画面が表示されたら New Project を選択しましょう。
)
タブ MCU Selector / Board Selector のいずれかを選択しましょう。前者ならば、ターゲットとするマイコンを選択し、後者ならばボードを選択します。当方は STM32L053C8T6 を購入したので、 MCU Selector から選択します。
OKを押すと、 Pinout タブが表示されます。
PB0 にLEDのアノードを接続することにしたので、PB0にGPIOを割り当てます。PB0のピンを左クリックすると、割り当て可能な機能の一覧が表示されます。
GPIO_Output を選択します。
こんな感じの表示になります。
続いて画面左側にあるツリー Peripherals >> SYS をオープンし、 Serial Wire Debug(SWD) を選択します。
最終的には以下のような表示となっているはずです。
続いて、 Configuration タブに移動します。
System >> GPIO をクリックしてみましょう。すると、先ほどGPIOに割り当てた PB0 が表示されています。試しにこの項目をクリックしてみましょう。
目的に応じて設定を変更します。LEDチカをするにはデフォルトのままで良いので、何もせずに閉じます。
クロックの修正が必要ならば、 Clock Configuration タブを表示して修正します。当方はデフォルトのままでよしとしたので変更しませんでした。デフォルトでは2MHz程度で動作するようです。
ここまでできたらプロジェクトを保存します。 Project >> Settings… を選択します。まずは Projct タブから。 Project Name , Project Location , * , Toolchain / IDE を設定します。特に重要なのが Toolchain / IDE です。当方がインストールしたのは SW4STM32 System Workbench for STM32 なので、 SW4STM32 を選択します。当方は以下のように設定しました。
Code Generator タブについては、まずはデフォルトで良いと思います。消費電力をより抑えるために Set all free pins as analog(to optimize the power consumption) を選択しても良いでと思います。設定は後から変更できること、意味をきっちり理解しない状態で設定するのは余計なトラブルに見舞われる懸念があるため、当方はデフォルトのままとしました。
ここまでできたら Ok ボタンを押下しましょう。
続いて、いよいよコードを生成します。 Project >> Generate Code を選択します。すると先ほどの設定に応じたコードがプロジェクトフォルダ配下に生成されます。
プロジェクトのインポート
ここまでの作業ではプロジェクトフォルダ配下にプロジェクトが生成されるだけであり、プロジェクトのインポートが必要です。 File >> import… を選択します。
Exsisting Projects into Workspace を選択し、 Next > を選択します。
Select root directory にはSTM32CubeMXにて Generate Code にて出力したフォルダを指定しましょう。 Projects: に出力したプロジェクトがありますので、こちらを選択します。最後に Finish ボタンを押下します。
生成されたコードを見てみましょう。STM32CubeMXでの設定に対応するコードは Application >> User 配下に出力されます。
まずは main.c を見てみましょう。main関数があります。ところどころ、 「/* USER CODE BEGIN ○ /」〜「/ USER CODE END ◯ /」という行がありますが、開発者はこの間にソースコードを記述していくことになります。 *STM32CubeMX はこの間に挿入されたコードを消去したりしないようにしてPeripheralの設定をコードに出力します。
stm32l0xx_hal_msp.c や stm32l0xx_it.c には、それぞれ HAL_MspInit() 、 SysTick_Handler() がありました。GPIOの初期化コードは MX_GPIO_Init() に含まれていました。
GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
設定した内容に従ってコードが生成されている様子が分かります。
さて、LEDを点滅させるコードを書いてみましょう。
あっ、その前に HAL Drivers の仕様が分からなければコードを書くことができないので、まずは仕様が書かれたPDFファイルをダウンロードしましょう。
Part Number Search ? STMicroelectronics からマイコンに応じたSTM32Cubeを選択。当方の場合は STM32CubeL0 が該当します。 User Manual >> Description にある、 Description of STM32◯◯xx HAL Drivers のリンクをダウンロードします。
さて、今回は単純にmain()関数内のwhile(1)内で点滅させる処理を記述してみます(タイマ処理で点滅させる方がスマートですが、まずは手っ取り早くwhile内に記述してみます)。
int main(void) { : /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); HAL_Delay(1000); } /* USER CODE END 3 */ } }
ハード・ソフト共に不具合を混入していなければ、1秒おきに点灯・消灯を繰り返します。Flashへの書き込み及びデバッグの方法は前回記載した通り。