STM32 printf でデバッグする

STM32 printf でデバッグする

今回は printf()によるデバッグについて書きます。

投稿時の開発環境を記しておきます。

PC:Windows10 OS
IDE: STM32CubeIDE Version1.3.0
Configurator: STM32CubeMX Version5.5.0
Board: STM32Nucleo-F401RE

概要

何か処理した結果をその都度確認したいことがあります。
そんな時は printf() を良く使われると思います。
UARTでシリアル出力する方法も良く使われますが、少々手間がかかります。

そこで今回は IDE上で printf()の出力を確認する方法をご紹介します。

プロジェクトを作成する

IDEを起動し、File- New – STM32 Project を選択し、Target Selection ウィンドウが出たら Board Selector タブを選択し Boards List から NUCLEO-F401RE を選択し Next ボタンを押します。

Project 名に F401DebugPrintf と入力し、Finishボタンを押します。
Initialize all peripherals with their default Mode ? と聞いてくるので Yesを押します。
This kind of project is associated with the STM32CubeMx perspective. Do you want to open this perspective now ? と聞いてくるので Yesを押します。

コーディングする

printf()を使うためには _write()を使います。

_write()は syscall.c の中で以下のように書かれています。

__attribute__((weak)) int _write(int file, char *ptr, int len)
{
	int DataIdx;

	for (DataIdx = 0; DataIdx < len; DataIdx++)
	{
		__io_putchar(*ptr++);
	}
	return len;
}

出力の実体は __io_putchar() であることがわかりました。
__io_putchar()も syscall.c の中で以下のように書かれています。
ここにも weak属性がついているのでこの部分はそのままで、どこかで関数を上書きしてあげれば良いことになります。


extern int __io_putchar(int ch) __attribute__((weak));

main.c の main()の前に以下のコードを書きます。

/* USER CODE BEGIN 0 */
#include <stdio.h>
int __io_putchar(uint8_t ch)
{
	return ITM_SendChar(ch);
}

計装トレース・マクロセル(ITM)は、診断用にprintf形式での
デバッグ情報の取得を可能にするものです。
デバッガへの出力には ITM_SendChar() を使います。

そして while()ループに printf() を実装します。

/* USER CODE BEGIN WHILE */
  while (1)
  {
	  printf("Debug\r\n");
	  HAL_Delay(1000);
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

デバッガ側の設定を行う

Run - Debug Configurations の デバッガ タブを選択し シリアルワイアビューア(SWV)の有効にチェックを入れます。
そして Clock Settings の Core Clock に適切な値を設定します。
このボードでは 84.0 MHz としました。

設定後、Debug ボタンを押します。

次に Window - Show View - Other を選択し、小窓が出たら SWV ITM Data Console を選択して Open します。

右側に並んでいるアイコンの左(赤枠部分)をクリックします。

ITM Sutimulus ポート の一番右側だけにチェックを入れます。
なお、それ以外のチェックにチェックが入っていたら、それらのチェックは全てはずします。

そして OKを押してウィンドウを閉じます。

デバッグを始める前に、もうひとつ最後の設定を行います。

SWV ITM Data Console の右側に並んでいるアイコンの左から2番目の〇の部分をクリックします。

これが非常にわかりにくいのですが、クリックすると〇の部分のボタンがくぼんだように見えます。

この状態で printf()デバッグが行える状態になりました。

それでは Run - Resume してプログラムを実行してください。
1秒毎に Debug の文字が表示されれば成功です。

少々手間がかかりましたが、一度設定してしまえば良いことですし、UARTで確認するよりは楽チンできます。

デバッグのお供に、ぜひどうぞ。

IDEカテゴリの最新記事