標準のCubeIDEの使い方は、
①CubeIDEでプロジェクトを作る
②CubeIDE内 CubeMXでコード生成
③CubeIDEでデバッグ
とCubeIDEのみで全て完結します。
一方で、この手法だと次のような欠点があります。
・CubeIDEのバージョンアップやOS間、IDE間の移動に弱い
CubeIDEは、基本的に同一のバージョンで利用することで安定したビルド環境が構築されますが、Makefileで管理すれば、CubeIDEだけでなく、VSCodeや他のIDEでもビルド環境が整います。面倒ですが、コマンドベースでの管理も可能です。
・CubeIDE内のCubeMXが非常に酷なGUI
狭い環境での操作を強要されます。
(FullHDだと、ピン配置を見ながらタイマの設定なんてできたもんじゃないです。)
CubeIDE内のMXではなく、CubeMXを単体で起動することで、ある程度開放されます。
・プロジェクトファイルの管理がGUIベース
インクルードパスなどの設定がEclipseベースGUIのため、ソースで管理しにくいです。
xmlなので、ゴリ押し設定をできなくはないですが、そこまでしてやる意味あるの?と言われてしまうと疑問です。
これらを解決するために、次のような手法を取ることで、より簡単に開発することができます。
方針
①CubeMXでMakefile Projectを作成する
②CubeIDEでEmpty STM32 Projectを作成する
③作成したMakefile ProjectをEmpty STM32 Projectにマージする
④以降、Makefileベースのビルドと、STM32 MCU Debugを利用して開発をすすめる
以下に概要図を載せます。
それでは実際に作ってみましょう。
今回はSTM32G431RBTの載った、NUCLEO-G431RBを使ってLチカをするプロジェクトを実際に作ってみます。
今回は特にバージョンに縛られませんが、以下の環境にて確認致しました。
IDE
STM32CubeIDE
Version: 1.0.0
Build: 2872_20190423-2022 (UTC)
CubeMX
STM32CubeMX
Version: 5.4.0
STM32G431 Firmware
STM32Cube FW_G4 V1.1.0
①Makefile Projectを作成
CubeMXを利用してMakefileのプロジェクトを作成します。
Fileタブ -> New Projectから、マイコンを選ぶ。
今回は「NUCLEO-G431RB」
Start Projectを押すと、「Initialize all peripherals with their default Mode?」の文字が出るので、迷わずYes。
これはマイコンボードの標準の配置に(LEDなどすでにピンが確定しているもの)勝手に配置してくれます。
このページを見ている皆様には釈迦に説法かもしれませんが、このページでピン配置や内部機能を設定することができます。
今回はLチカができれば良いので、何も触らない。
Project Managerタブに移り、ProjectNameを入力。今回は「G431RBMakeProj」とした。
Toolchain/IDEに「Makefile」を入力。
Code Generatorに移り、Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheralにチェックを入れる。これを入れることで、main.cにすべてのイニシャライズコードが記述されず、ソースが分離されるので管理しやすくなる。
ここでGENERATE CODEを押すとMakefile Projectのコードが作られる。
②Empty STM32 Projectを作成
CubeIDEを利用してEmpty STM32 Projectを作成します。
Project Explorer(右クリック)→New->STM32 Project
こちらもNUCLEO-G431RBを選んでNextを押す。
今回はProjectNameを「G431RB_Proj」としました。
Targeted Project TypeにEmptyが選択されていることに注意。
Finishを押すことでプロジェクトが生成されます。
ここでプロジェクト内のすべてを消しておいてください。
③プロジェクトをマージする
作っておいたMakefileのプロジェクトから、Empty プロジェクトへ中身をコピーします。
重複しているものは上書き保存です。
CubeIDEに戻ります。
このままだと、CubeIDEを再起動するまでコピーしたものが見えないので、プロジェクトをリフレッシュします。
最後に、プロジェクトのプロパティ->C/C++ Build -> Builder Settingsから次のように変更します。
・Generate Makefiles automaticallyのチェックを外す。
・Build directoryを次のようにする。(Buildを消す)
これでプロジェクトの設定が終了しました。
本当はこの段階ですべての工程が終了して、正しくビルド・デバッグが動作するはずですが、
CubeMXのいつものガバで正しくビルドができないと思います。
以下の工程は、そのうち必要なくなるかと思います。
④Makefileを修正する
Makefileの中のCPUを次のように直します。
#######################################
# CFLAGS
#######################################
# cpu
CPU = -mcpu=cortex-m4
⑤Lチカする
main関数にLチカコードを記述します。
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_LPUART1_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
手順は以上です。お疲れさまでした。
以下から本日作成したソースを取得できます。
トラブルの際にご活用ください。
https://github.com/YutakaNakamura/G431LEDBlinkMakeProj/tree/LEDBlink_with_C/G431RB_Proj
git clone
git clone https://github.com/YutakaNakamura/G431LEDBlinkMakeProj/tree/LEDBlink_with_C/G431RB_Proj -b LEDBlink_with_C
以下に続きを書きました。Makefileを編集してcppのビルドに対応します。