CubeMX環境でprintfを使う

UART出力

STM32マイコンのCubeMX環境(HAL Driver使用)でprintfを使ってUARTに文字列を出力したい場合、下記のようなputchar関数を実装すればよい。この例では標準出力をUART2に出力している。もちろん、あらかじめCubeMXで対応するUARTの設定をおこなって初期化コードを生成しておくこと。
ちなみに、Nucleo-64ボードではUART2がST-LINKチップに接続されており、ST-LINKを経由してPCの仮想COMポートに接続できる。

// 標準出力をUART2へ
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
  HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
  return ch;
}

デバッガのターミナルI/Oに出力

IARのEWARM環境の場合、デバッガのターミナルI/Oにprintfで文字列を出力することもできる。これには、デバッガのSWO端子が接続されている必要がある。また、上記のUART出力とは排他である。__io_putchar()ないしfputc()が未定義のとき、ターミナルI/Oに出力される。

  • プロジェクトの「オプション > 一般オプション > ライブラリ設定」で「セミホスティング」、「セミホスティング経由」を選択
  • メニューの「表示 >ターミナルI/O」でターミナルを表示

注意事項

いずれにせよ、WindowsLinuxなどのOS上での動作と異なり、printfはバッファされておらず、同期待ち(送信完了まで帰ってこない)になるので要注意です。割り込みルーチンの中で使うのは基本的にはご法度です。