CCWO

挫けそうになるブログ #音楽 ##ライブ ##弾いてみた #programming ##Python ##C ##C++ ##VSCode ##Markdown ##TeX ##Git #電子工作 ##エフェクター ##PIC ##RX,RZ ##STM32 ##FPGA ##Raspberry Pi ##Ubuntu ##Fusion 360 #スポーツ ##筋トレ

STM32F303K8 semihosting

開発環境

評価ボード Nucleo STM32F303K8
IDE System Workbench for STM32 (SW4STM32)
Library Hal Library
OS windows 10 pro

とはいってもデバッグを文字列でしたいですよね。
semihosting機能を試してみたいと思います。こちらの2つを参考にさせていただきました。
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
こちら参考にしました。