CCWO Embedded Space

CCWOの日々の開発を発信するブログ

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
f:id:CCWO:20170821145007p:plain
Linker flagsを次のように編集

-specs=nosys.specs -specs=nano.specs -specs=rdimon.specs -lc -lrdimon

次に、プロジェクト 右クリック→Debug As→Debug Configurations...→Startup
f:id:CCWO:20170821145223p:plain
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の内容が表示されていけば成功です。
f:id:CCWO:20170821145429p:plain
これで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の記事