STM32F303K8 semihosting
開発環境
評価ボード | Nucleo STM32F303K8 |
IDE | System Workbench for STM32 (SW4STM32) |
Library | Hal Library |
OS | windows 10 pro |
とはいってもデバッグを文字列でしたいですよね。
semihosting機能を試してみたいと思います。こちらの2つを参考にさせていただきました。
http://jazz-love.ddo.jp/wordpress/2016/03/02/stm32%E3%82%BB%E3%83%9F%E3%83%9B%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/jazz-love.ddo.jp
yuqlid.hatenablog.com
やっぱり、デバッガあるならデバッグコンソール画面でみたいって最初に思いますよね。(やることは上と同じ)
プロジェクト 右クリック→Properties→C/C++ Build→Settings→MCU GCC Linker→Miscellaneous
Linker flagsを次のように編集
-specs=nosys.specs -specs=nano.specs -specs=rdimon.specs -lc -lrdimon
次に、プロジェクト 右クリック→Debug As→Debug Configurations...→Startup
Initialize Commandsを次のように編集
monitor reset halt monitor arm semihosting enable
次にmain.cを次のように編集
/* USER CODE BEGIN 0 */ extern void initialise_monitor_handles(void); /* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ uint8_t time = 0; initialise_monitor_handles(); /* 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_USART2_UART_Init(); MX_CAN_Init(); /* USER CODE BEGIN 2 */ // UART // char buf[] = "STM32F303K8 UART2 TESTS\n"; // HAL_UART_Transmit(&huart2, (uint8_t *)buf, sizeof(buf), 0xFFFF); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ HAL_Delay(500); time++; printf("time = %d\n",time); /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
これで次のようになっていてConsoleに赤字でprintfの内容が表示されていけば成功です。
これでprintfが実装されました。けれど、これってfloatは出来るのって思ってやってみたら、
time = time = time = time = time =
みたいになってしまったので、
Linker flagsを次のように編集
-specs=nosys.specs -specs=nano.specs -specs=rdimon.specs -lc -lrdimon -u _printf_float
に変更すると、
time = 0.1 time = 0.2 time = 0.3 time = 0.4 time = 0.5
と出来ました。よかったよかった。ただ、コードサイズは増えるので要注意です。ただ最近のマイコンはFlashが結構多いですし、SW4STM32ならコードサイズフリーでコンパイルできるので特に気にする必要はなさそうですね。(floatのprintfは24KBくらいある模様)
これでTeraTermいらずです。また不便が出てきたら別の方法を考えてみます。
gsmcustomeffects.hatenablog.com
こちら参考にしました。
20170821の記事