Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン22(printfのソースファイル、ヘッダファイルの作成)

STM32(nucleof401)でprintf使用

1.本日の内容

 (1) STM32マイコン(nucleof401RE)でprintfを使用できるようにする。

 (2) printfを使用できるソースファイル、ヘッダファイルを作成する。

 参考:STM32マイコン_12(printfの導入) - Project_OKI’s diary

 

・目次

 

2.内容

​​(1) やる内容の詳細​

 ・STM32マイコン(nucleof401re)でprintfが使用できるように、

  printf.cとprintf.hファイルを作成する。

 ・printf.cとprintf.hを使用し、printfを実装する。

youtu.be

※動画ではCubeIDEを使用しているが基本設定はCubeMXも同じ。

(2) CubeMXの設定

 ・printfはUART2を使用する。

  →CubeMXの設定は下記参照

  →STM32マイコン_2(UART通信:TeraTermにHellow表示) - Project_OKI’s diary

 

(3) プログラムの作成

動作:printfでtestをTeratermに表示する。

 

・printf.cファイルの作成

/**	****************************** */
/**
 *	@file		printf.c
 *	@brief		ファイルの説明
 *	@brief		Compiler 	: Atollic True Studio for STM32 9.0.0
 *	@brief		CPU		: STM32F401
 *	@date		$LastChangedDate: 2023/03/04  $
 *	@version	$Revision	: 1.00 $
 */
/**	******************************* */

/* ********************************* */
//		インクルード ファイル */
/* ********************************* */
#include "printf.h"

/** ******************************* */
/**		外部定義変数	*/
/** ******************************* */


/** ******************************** */
/**		内部定義変数	 */
/** ******************************** */


/**	******************************** */
/**
 *	説明
 *	UARTを使用して、文字を送信する
 *	@param	int c			: 出力文字
 *	@return	void			: None
 */
/**	******************************** */

int __io_putchar(int c) {
  if( c == '\n' ) {
    int b = '\r';
    HAL_UART_Transmit(&huart2,(uint8_t*)&b, 1, 1);
  }
  HAL_UART_Transmit(&huart2,(uint8_t*)&c, 1, 1);
  return 0;
}
/* ** ファイルの最後 ( printf.c ) ** */

 

・printf.hファイルの作成

/**	****************************** */
/**
 *	@file		printf.h
 *	@brief		printfを使用可能とする。
 *	@brief		Compiler 	: Atollic True Studio for STM32 9.0.0
 *	@brief		CPU			: STM32F401RE
 *	@date		$LastChangedDate	: 2023/03/04 $
 *	@version	$Revision			: 1.00 $
 *
 */
/**	****************************** */

#ifndef		PRINTF_H	///<PRINTF_H 未定義?
#define		PRINTF_H	///<PRINTF_H 定義済み!!


/**	****************************** */
/*		インクルード ファイル   */
/**	****************************** */
#include "main.h"
#include "stdio.h"

/**	****************************** */
/*		定数値の定義         */
/**	****************************** */


/**	****************************** */
/*		構造体の定義	       */
/**	****************************** */


/**	****************************** */
/*		外部変数の定義	      */
/**	****************************** */
//UART2を使用
extern UART_HandleTypeDef huart2;

/**	****************************** */
/*	関数のプロトタイプ宣言*/
/**	****************************** */


#endif																///<PRINTF_H 未定義 End
/* **** ファイルの最後 ( printf.h ) ******************************************************************** 
main.c
  /* USER CODE BEGIN 2 */
   setbuf(stdout,NULL);
   printf("test\n");
  /* USER CODE END 2 */
 
(4) プログラムの説明
 (a) int __io_putchar(int c) {
  ・UART通信(huart2)を使用して、文字を送信する関数
  ・printfで\nを使用した時、 \n\r(改行コード)を送信する。
  ・標準出力関数putchar()の代替関数として使用される。
  ・pritnf()で文字を表示する場合、実際にはこの関数が呼び出される。
 
 (b) setbuf(stdout,NULL);
  ・標準出力をバッファリングしないように設定する関数
  ・一般的にはプログラムの先頭に記載する。
  ・リアルタイムでログ情報を表示する必要がある場合に使用する。
  ・通常、標準出力ストリーム(stdout)は、出力がバッファリングされ、
   改行またはプログラム終了時に自動的にフラッシュされる。
  ・setbuf(stdout, NULL)を使用すると、出力がバッファリングされず、
   すぐに出力される。
  ・これを使用せず、バッファリングされると、出力がすぐに表示されない

 

 (c) 上記CubeMX又はCubeIDEでピンの設定を行い、プログラムを出力する。

  ・ドラック&ドロップでprintf.c及びprintf.hをプロジェクトにコピー。

  ・main.cの処理を記載し、デバック実行を行う。

 

3.関連記事

関連記事一覧:
 
組み込みC言語