Nucleo-F303K8でprintfを使う


目的

SW4STM32(System Workbench for STM32)にてARMセミホスティング機能を用いてprintfが利用可能な環境を整えます。

環境

項目 内容
OS Windows 10 Home 64bit
開発環境 SW4STM32, eclipse cdt oxygen, STM32CubeMX
ボード Nucleo-F303K8

手順概要

  1. STM32CubeMX設定
  2. eclipse リンカ設定
  3. eclipse コード修正
  4. eclipse デバッガ設定

STM32CubeMX設定

  • "New Project"から開発対象ボードを選択し(私の場合はNucleo-F303K8)て新規プロジェクトを生成します。
  • "Pinout"タブから"SYS"の"Debug"部分にて"Serial Wire"を選択します。

  • "Project"->"Settings"にてプロジェクト名(printf_test)と、プロジェクト生成先開発環境"SW4STM32"を選択します。

  • "Project"->"Generate Code"でSW4STM32プロジェクトを生成します。

eclipse リンカ設定

ここではリンクオプションでセミホスティングを有効にします。

  • "File"->"Import"->"General"->"Existing Projects into Workspace"でCubeMXで生成したプロジェクトを読み込みます。

  • eclipse画面の左側のProject Explorerから"printf_test"プロジェクトを選択して、Alt+Enter (もしくは、右クリック->"Properties")で設定画面を開きます。

  • "MCU GCC Linker"->"Miscellaneous"にて, Linker flagsに"-specs=nosys.specs -specs=nano.specs -specs=rdimon.specs -lc -lrdimon"と入力します

  • "printf_test"を選択後、右クリックして"Build Configurations"->"Build All"で再度ファームウェアをビルドします。

通常の"Build"コマンドでは、セミホスティングを有効化する上記設定は反映されません。必ず"Build All"コマンドでビルドしてください

eclipse コード修正

"main.c"ファイルを開いてコードを以下のように修正します。

  • USER CODE 0に以下の文を追加します。(main関数の外側)
/* USER CODE BEGIN 0 */
extern void initialise_monitor_handles(void);
/* USER CODE END 0 */
  • USER CODE 1に以下の文を追加します。(main関数内側)
/* USER CODE BEGIN 1 */
initialise_monitor_handles();
int count = 0;
/* USER CODE END 1 */
  • USER CODE 3に以下の文を追加します。(while loop内側)
 /* USER CODE BEGIN 3 */
      printf("Count %d\n", count);
      count++;
      HAL_Delay(1000);
  }
  /* USER CODE END 3 */

1000msec毎に数値がカウントアップされてprintfにて表示されるプログラムです。

改行文字"\n"がないと表示されないので忘れずに入れてください


デバッガ設定でセミホスティングを有効にします。

  • 虫マークをクリックした後、ポップアップウィンドウで"Ac6 STM32 C/C++ Application"を選択します。

  • いったん停止ボタンを押します。

  • 虫ボタン横の下三角マークをクリックして、"Debug Configurations"を選択します。

  • "Startup"のInitialization Commandsの欄に"monitor arm semihosting enable"と記入します。

  • "Apply"ボタンを押した後、"Debug"ボタンを押します。

  • プログラムにエラーがなければ、そのままデバッグが開始されてmain関数内で一時停止します。

  • その後"Resume"ボタンを押すとプログラムの実行を進められます。

  • 以下のように、"Console"に1sec毎にカウントアップして数字が表示されると成功です。