目的
SW4STM32(System Workbench for STM32)にてARMセミホスティング機能を用いてprintfが利用可能な環境を整えます。
環境
項目 | 内容 |
---|---|
OS | Windows 10 Home 64bit |
開発環境 | SW4STM32, eclipse cdt oxygen, STM32CubeMX |
ボード | Nucleo-F303K8 |
手順概要
- STM32CubeMX設定
- eclipse リンカ設定
- eclipse コード修正
- 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"と入力します
通常の"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 */
1000[msec] (1[sec])毎に数値がカウントアップされてprintfにて表示されるプログラムです。
改行文字"\n"がないと表示されないので忘れずに入れてください
デバッガ設定でセミホスティングを有効にします。
- 虫マークをクリックした後、ポップアップウィンドウで"Ac6 STM32 C/C++ Application"を選択します。
-
いったん停止ボタンを押します。
-
虫ボタン横の下三角マークをクリックして、"Debug Configurations"を選択します。
-
"Startup"のInitialization Commandsの欄に"monitor arm semihosting enable"と記入します。
-
"Apply"ボタンを押した後、"Debug"ボタンを押します。
-
プログラムにエラーがなければ、そのままデバッグが開始されてmain関数内で一時停止します。
-
その後"Resume"ボタンを押すとプログラムの実行を進められます。
- 以下のように、"Console"に1sec毎にカウントアップして数字が表示されると成功です。