stm32 halライブラリ、makefileでprintf(float型)を使えるようにする!

こんにちは

時が過ぎるのが速すぎて焦っています。もう三月の後半・・・

今日はタイトル通りprintfの実装の仕方を書いていきます。

 

まずはstm32cubeでuartの設定をします。

f:id:sora_siro:20180322104348p:plain

f:id:sora_siro:20180322104400p:plain

こんな感じで・・・baud Rateなどはシリアル通信をするソフトなどとの兼ね合いを付けてください。

そしたらcubeにコードを生成してもらいましょう。

 

次に、syscalls.cをSrc直下においてください。ファイルのリンクを張っておきます。

syscalls.c

この状態でmakeしてもsyscalls.cはコンパイルされません。なのでmakefileに追記する必要があります。2か所あり、一つ目はsource内にsyscalls.cを追記することです。

######################################
# source
######################################
# C sources
C_SOURCES = \
省略
(ex)Src/main.c\
  Src/syscalls.c

2つ目はLDFLAGに-u _printf_floatと追記してください。

LDFLAGS = 省略 -u _printf_float

ここまででひとまずmakefileに追記することはおしまいです。

 

続いて、main.cを開いて下さい。

// includesにこのように書いて下さい。

 
#include <stdio.h>
 

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
void __io_putchar(uint8_t ch) {
HAL_UART_Transmit(&huart1(初期設定で使用したuartを設定してください), &ch, 1, 1);
}

 また、printfを使用する前に(int main()のINIT()のあとにでも)この関数を呼び出しておいて下さい。

setbuf(stdout, NULL);

 

まとめ

マイコンでprintfが最初から実装されていることにありがたみをとても感じました。

マクロ定義の使い方が難しい・・・

 

最後に

知見のある方でこうしたほうがいいのではないかってことがありましたら教えていただきたいです。