STM32で Printf() を使い Teraterm で デバッグ


はじめに
1年以上前の 2020年8月にSTM32L432 を用いた開発環境をWindows上で構築した。
この時 非常に参考になったのは、この記事 です。

ここでは、STM32で printf() を使える様にしたので メモ書きとして記します。


Printf()を用いて Tera Term で デバッグ(文字出力)

参考にした記事に Lチカ(STM32 のLEDを点滅) を実現する ソースコードが記載されている。
今回、ここに Printf() を実装した。もちろん、Lチカ 以外でも 同じ方法で Printf()が実現出来る。
※STM32 のUART 設定は、usert.c で行われているので ソースコードを見てください。
 デフォルトのままであれば、Terminal Adapter側で下図の設定で動作します。

◎syscalls.cの追加
 \Src フォルダーの中に syscalls.c を置く。
 syscalls.cは、STM32CubeMX と STM32L4用のパッケージをインストールした時点で下記に
 サンプルコードとして置かれているので これをコピーして使う。

C:\Users\xxxx\STM32Cube\Repository\STM32Cube_FW_L4_V1.17.0\Projects\NUCLEO-L432KC\Examples\PWR\PWR_ModesSelection\SW4STM32\syscalls.c

◎main.c のソースコードを変更

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
------- 省略 -------

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
------- 省略 -------

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    printf("LED Toggle!!\r\n");
    HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
    HAL_Delay(5000);//ms

  }
  /* USER CODE END 3 */
------- 省略 -------

◎usert.c のソースコードを変更

/**
  ******************************************************************************
  * @file    usart.c
  * @brief   This file provides code for the configuration
  *          of the USART instances.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
------- 省略 -------

/* USER CODE BEGIN 1 */
/* Add by My.Name for Printf */
#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;
}
/* USER CODE END 1 */
------- 省略 -------

☆2021年11月 3日(水) 午後18時40分 初版(Ver1.00) 作成