今回は 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で確認するよりは楽チンできます。
デバッグのお供に、ぜひどうぞ。
コメントを書く