ぴかぴかさせよう!
こんにちは、むーちょspです。
前回は環境構築を行いました。
どこか飛ばしたりミスったりしていなければ、今回で問題なくLEDをぴかぴかさせることができるようになると思います。
もしなにかエラーが出た場合はトラブルシューティングを用意しているので活用してください。
ほかの記事のまとめはこちら。
今回の作戦
今回は、LEDをチカチカさせます。
通称Lチカです。
世のプログラマは初めにHello Wrold!を出力させることでプログラミングを学び始めますが、マイコンにディスプレイはないので、世の組み込みプログラマはLチカを通してマイコンのプログラミングを学び始めます。
虎の巻でもLチカから始めていくことにしましょう。
マイコン
今回使うマイコンはNucleo Board STM32F303K8です。
秋月電子にも売っています。
今回はNucleoに乗っているLEDを使ってLチカをしようと思います。
別途LEDやブレッドボードを用意する手間が省けるのでね。
その他必要なもの
micro-BのUSBケーブルを用意しましょう。マイコンに書き込むのに必要です。
あとPC。
CubeMX
必要なものが用意出来たら、さっそく始めるとしましょう。
プロジェクトの新規作成
まずは前回の環境構築でインストールしてもらったCubeMXを開きましょう。
こんな画面が開くと思います。
左は今まで作ってきたプロジェクトが表示される部分です(くそみたいなプロジェクト名ばっかだなこれ)。
たぶんまだ何も表示されていないと思います。
ほんで、真ん中の黒い四角い部分が、プロジェクトを新しく作る部分になります。
今回はNucleoボードを使うので真ん中のACCESS TO BOARD SELECTORを選びましょう。
(もし石から自分で回路を作る場合は上のACCESS TO MCU SELECTORを選ぶことになります。)
クリックすると新しく画面が出てくると思います。
この画面でプログラミングに使うマイコンを選びます。
左上で検索できるので、303で検索してNUCLEO-F303K8を選択します。
見つけられたら、右上のStartProjectからプロジェクトを始めます。
"Initialize all peripherals with their default Mode?"と聞かれたらYesを選んでおきましょう。
そうすると、新しくプロジェクトが立ち上がると思います。
ここでピンとかペリフェラルを設定していくことになります。
ピン設定
さて、今回はLEDを使うので、どこかしらのピンをOUTPUTに設定することになります。
今回使うNUCLEO-F303K8にはLEDが三つ搭載されていますが、我々ユーザーが使えるのはLD3だけです。(LD1はUSBで通信すると光るやつ、LD2は電源が来ていると光るやつ。)
そして、LD3はPB3につながっています。
というわけで、PB3をOUTPUTに設定しましょう。
PB3のピンをクリックするといろいろ出てきます。
そこでGPIO_Outputを選ぶとOUTPUTに設定されます。

ピン設定は以上です。
プロジェクトの設定
続いてプロジェクトの設定をしましょう。
Project Managerタブを開きます。
Project Nameのところにプロジェクト名を入力します。
今回はLチカなのでL_chikaで。
次にProject Locationを選びます。要は保存先です。Browseから選べます。
ここでは日本語が無いパスを選ぶことをお勧めします。日本語が入っているとビルドがうまくいかない場合があるので。
最後にToolchain / IDEのところをCMakeに変更します。
プロジェクトの設定は以上。
コード生成
すべてが終わったら、右上のGENERATE CODEをクリックしましょう。
おそらく最初にGENERATE CODEをすると以下のようなダイアログが出ると思います。
追加パッケージのダウンロードを求めるダイアログなので、Yesを選択しましょう。
Yesを選ぶとアカウントへのログインを求められるので、CubeMXとかをダウンロードしたアカウントにログインしてダウンロードしましょう。
successfullyとか出ればコードの生成は成功です!
さっそく、生成されたコードを使ってプログラミングを行いましょう。
Visual Studio Code
さて、コードの生成ができたら次はプログラミングです。
VSCodeで開く
まずはVSCodeを開きましょう。
そしたら、先ほど作成したプロジェクトをVSCodeで開きます。
ファイル(F)からフォルダーを開く...でも開けますし、「ようこそ」とかエクスプローラーに表示されているフォルダーを開く...からも行けますし、エクスプローラーからドラッグ&ドロップでも行けます。
おそらく最初に開くと作成者を信頼しますか?と出てくるので、問答無用で信頼しちゃいましょう!

開いたら、左端の一番上のエクスプローラーを開いてちゃんと読み込めていることを確認しましょう。
コードを書く
開けたらコードを書いていきましょう。
左側のエクスプローラーを開き、Core/Src/main.cを開きます。
するとこんな感じの画面になると思います。
おそらく66行目あたりにint main(void)があり、その中の100行目あたりにwhile (1)があると思います。
このwhile (1)がArduinoで言うところのloop()に当たるものです。
基本的にプログラムはこのwhile (1)前後に書いていくことになります。
さっそくコードを書きましょう。
今回書くプログラムはこちら。
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
HAL_Delay(500);
このコードをwhile文の中に書いてください。
コードの解説
簡単にコードの解説をします。
とは言っても、やってることとしては
LED点ける
500ミリ秒待つ
LED消す
500ミリ秒待つ
っていうだけですけどね。
HAL_GPIO_WritePin関数で出力を切り替えています。
GPIOBはポートBを、GPIO_PIN_3はピン3を指し、合わせてPB3を指しています。
今回使うLEDがつながっているピンですね。
そして、GPIO_PIN_SETでON、GPIO_PIN_RESETでOFFです。
そしてHAL_Delay関数で少し待つをしています。
待つ時間の単位はミリ秒で、1/1000秒です。
1秒待つ場合は1000を指定します。
このコードを書くわけですが、書くときに注意が必要です。
生成されたコードにはたくさんのコメントがありますが、コードはこのコメントのBEGINとENDの間に書かなければなりません。
今回の場合だと、/* USER CODE BEGIN 3 */と/* USER CODE END 3 */の間に書きましょう。
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
HAL_Delay(500);
}
/* USER CODE END 3 */
このように書かないと、あとからCubeMXでピンの変更をして再びGENERATE CODEをした場合に書いたコードが消えてしまいます。
逆に言えば、このBEGINとENDの間を編集すればコードが消えたり変更されたりすることはありません。
ほかの場所も同じなので、このことは覚えておきましょう。
これだいじ
ビルドする
さて、コードが書けたらビルドをすることにしましょう。
まず左下のビルドを押します。
そうすると最初はDebugかReleaseかを選ぶことになると思うので、Debugを選びましょう。

そうすると、画面下でばーっと文字が流れ、最後に
ビルドが終了コード 0 で終了しました
と表示されると思います。これが出れば成功です!
左のエクスプローラーからbuildを選んで、その中にプロジェクト名.elfがあると思います。
これがマイコンに書き込むためのファイルになります。

もしこの段階でエラーが出てうまくいかない場合はトラブルシューティングを当たってみてください。
そこになさそうなら自分でエラーを読むか調べるかしてください。
コードの入力ミスとかだとさすがに対応できませんので。
CubeProgrammer
さて、無事にビルドが終了コード 0 で終了した皆さんに残されたステップは書き込みだけになりました。
最後に作ったプログラムをマイコンに書き込むことにしましょう。
PCとマイコンをつなぐ
普通にUSBケーブルを使ってマイコンとPCをつなぎます。
繋いだら、CubeProgrammerを立ち上げましょう。
右のSerial numberのところがNucleoのポート番号になっていればOKです。
選んだら右上のConnectを押しましょう。
Data read successfully!と出てくれば接続成功です!
書き込む
接続が確立出来たら、さっそくプログラムを書き込みましょう。
左のところから下矢印のアイコンを選び、ます。
この画面が書き込み画面です。
Browseから、先ほどビルドで作成した.elfファイルを選びます。
選べたら、Start Prgrammingを押しましょう。
File Download Completeと出てきたら書き込み完了です!
実行する
まずはDisconnectを押して接続を切ります。
次にマイコンをリセットします。
Nucleo-F303K8のリセットボタンはLD2とLD3の間のボタンです。
するとプログラムが実行され始めます。
リセットボタン横のLD3が点滅を始めたら成功です!
やったぜ
LEDが点滅し始めた皆さん、お疲れさまでした。
これで、皆さんは晴れてHALを自在に使えるようになりました!
ちなみに、環境構築の最初の方で触れた参考資料の方だとVSCodeで書き込みまでやっています。今回の環境構築でも書き込み用の拡張機能を入れているので、上のサイトの最後の方でやっているやり方をすれば書き込みが出来るはずです。
ただ、私は多分環境構築の中でパスに日本語が混じるせいかうまくビルドできないので今回のような手法をとりました。
STM32Cube自前のコンパイラがユーザーディレクトリの中に環境構築するせいだと思うんですけど、インストール場所を変えられたりユーザー名が日本語でも使えるようにしてほしいですね。
やり方を知ってる人がいたら教えてほしいです。
次回からはタイマーに触れていこうと思っています。
もしプロジェクトの立て方とかビルドの仕方とかがわからなくなったらここに戻ってきましょう。
そんな感じ。







