Makefile+CubeMX+CubeIDEでSTM32開発

標準の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のビルドに対応します。

コメントを残す

メールアドレスが公開されることはありません。