こんにちは、しゅうです。
環境がある程度整ってきたので、とりあえず開発ボードについているLEDを点滅させてみます!
コードの生成
STM32CubeMXを起動しましょう。すると次のような画面が表示されます。

中央の”New Project”下の”Access to MCU Selector”をクリックしましょう。すると、次のような画面が表示されます。
左上あたりに、検索用のボックスが用意されているので、使いたいSTM32マイコンの型番をそこに入力します。
今回使うBlue PillにはSTM32F103C8が搭載されていますのでそれを検索/選択します。
それぞれのマイコンについて、各種情報が掲載されているのでここでデータシートなどを集めるのも良いかもです!

右下あたりに、検索結果が表示されるので選択したら右上のStart Projectをクリックします。すると、次のような画面が表示されます。
今回は、Blue Pillに搭載されているLEDを光らせます。こちらの回路図を見てみるとBlue Pillに搭載されている2つのLEDの内片方はマイコンのPC13ピンに接続されています。もう片方は電源投入時に光る方のLEDです。

STM32CubeMX上でそのPC13ピンをクリックすると次の画像のようにピン設定のオプションが表示されます。今回はアウトプットとして扱うので、GPIO_Outputを選択しましょう。

するとPC13にプッシュピンが追加されたり、緑色に色が変わったり、ピンの横にGPIO_Outputという表記が追加されたりします。

次に、プロジェクトの設定をします。”Project Manager”タブを選択すると次のような画面が表示されます。
プロジェクトの名前と保存先はそれぞれお好みに設定しましょう。今回はMakefileを使ってプロジェクトをビルドしたいので、”Code Generator”の”Toolchain / IDE”をMakefileに設定します。

今回はこれで設定が完了したので、画面右上のGenerate Codeをクリックしましょう。場合によっては次のような画面が表示されますが、必要なライブラリなどを持ってきてくれるのでそのまま完了するまで見守りましょう。

無事生成が完了すると、1つのファイルを除いて、次のようなファイル構成になります。

そのファイルである、openocd.cfgを新たに作ります。これは書き込み用の設定ファイルになります。4行目のfind interfaceに関しては、先輩の記事や他サイトの記事を参考にstlink-v2などと記入したところ、書き込み時に警告文と共に「stlink.cfgを使ってくれ」と言われたのでそれに変更してあります。おそらくsymlink関係かなと思います。
telnet_port 4444
gdb_port 3333
source [find interface/stlink.cfg]
source [find target/stm32f1x.cfg]
init
proc flash_elf {elf_file} {
reset
halt
flash write_image erase $elf_file
echo "flash write_image ($elf_file) complete"
reset
exit
}
あとは、ビルドして書き込むだけです。
プログラムの編集
Blue PillのLEDを点滅させるプログラムを書きます。
Core/Src/main.c
に2行ほど書き加えます。90行目あたりの無限ループに、LEDを点滅させるためのコードを書きましょう。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
あとは保存して次にビルドをします。
ビルド!
ターミナルを開いて、該当のディレクトリに移動しましょう。そこで次のコマンドを実行しましょう。
$ make DEBUG=1 -j 3 all
-jオプションの後ろの数字は、使用しているパソコンの「CPU数-1」の数にしましょう。最近のPCだとあまり問題はないかもしれませんが、ビルドするものが多くなったりすると、PCが固まりやすくなるので余裕を持たせて実行させるのが良いです。
ビルドが完了するとbuildディレクトリが作成されてその中に書き込み用の.elfファイルが保存されます。
書き込み
いよいよプログラムを書き込みます。
まずはデバイスを接続しましょう、ST-Link V2にジャンパワイヤが付属されているのでそれを使います。
下の画像では、以下のように接続しています。
紫 – SWCLK
灰 – SWDIO
黒 – GND
白 – 3.3V

ST-Link V2を開発PCのUSBポートに接続すると、電源投入を示す赤いLEDが点滅します。場合によっては緑のLEDも点滅するかもしれません。
そして、プログラムを書き込む前にジャンパピンを移す必要があります。下の画像のように、Blue Pillのリセットボタンから遠い方のピンの1番側にジャンパピンを持ってきてからリセットボタンを押します。

次のコマンドで書き込みが行えます。ついでに実行ログも貼っておきます!
$ openocd -f ./openocd.cfg -c "flash_elf build/test_LED.elf"
Open On-Chip Debugger 0.11.0
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select '.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
Info : clock speed 1000 kHz
Info : STLINK V2J35S7 (API v2) VID:PID 0483:3748
Info : Target voltage: 3.164922
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : starting gdb server for stm32f1x.cpu on 3333
Info : Listening on port 3333 for gdb connections
flash_elf
target halted due to debug-request, current mode: Thread
xPSR: 0xa1000000 pc: 0x1ffff3b6 msp: 0x200000c4
Info : device id = 0x20036410
Info : flash size = 64kbytes
flash write_image (build/test_LED.elf) complete
完了したら、ジャンパピンを0番側に戻してリセットボタンを押しましょう。すると書き込まれたプログラムが実行されます。
今回は下のGIFのように、緑のLEDが点滅します。

終わりに
ということで、ここまで無事ビルドや書き込みができることが確認できました。
次回以降はUSB経由で入力/出力を試してみます!
