意外と知られていないようなので.これはじつはUARTのデータシートに書いてあります.載るようになったのはVer.2.30からのようです. このUART_printf.cをプロジェクトに加えるだけでOKです.あ,もちろんUART_1_PutChar(c)などの部分は自分の作ったモジュールの名前に合わせて変えてください.
[20150928追加] GCC環境(PSoC4/5LP)のprintf系関数で %f がうまくいかない問題も,UART_printf.c ではこそっと解決されています.
/* Add an explicit reference to the floating point printf library to allow
the usage of floating point conversion specifier */
#if defined (__GNUC__)
asm (".global _printf_float");
#endif
Creator 3.* だったかな,でライブラリが変わったときにデフォでリンクしなくなったということのようです(出典).リンクオプションで -u _printf_float を追加するのと同じ効果だそうです.
#オプションついでにいうと,math.hをインクルードしたのに数学関数使えないジャン!なときは,メニューバーからProject-Build Settings-ARM GCCほげほげ-Linker-General と進んで,Additional Libraries に"m"と書くのも著名なはまりポイントですね.要はlibm.aをデフォルトではリンクしないということ.組み込みだもんね.
何年か前にPastelmagicの掲示板で話題になったときの記事はこちら.もう古い情報かな.UART_printf.cとは解決方法が違います.
[20150928さらに追加] 大事なことが抜け落ちていました.PSoC5LPでprintfを使うには,デフォルトのHeap Size (0x80=128bytes)では小さすぎます.大きめにとってください.ここでは0x1000=4kbytesにしてみます.
#昨日の自分は他人,だなあ.身に沁みる… orz
#結局 newlib-nanoのソース読んだのは内緒ね!(爆死)
CY8CKIT-059用に作ったテストプログラムをここに置きます.PSoC Creator 3.3用です.KitProg USB-UARTのポート番号を確認し,TeraTerm等でご確認ください.その際,ボーレートの設定をお忘れなく.テストプログラムは115,200ボーで作りましたので,USBUARTデバイスとTeraTermの双方で設定が必要です.
PSoC Creator 3.2 SP1 版のテストプログラムはこちらです.
ポート番号を調べる
USBUARTデバイスでのボーレート設定
TeraTermを起動してポートを設定
ボーレートを設定する.
受信改行コードをLFにしておく
TeraTermによる実行画面のようす
[20150928さらにさらに追加] PSoC4環境で確かめてみました.やはりHeap Size がデフォルトの0x80(=128)bytesでは動きません.0x800(=2048)bytesではうまくいきました.が,PSoC4はメモリが少ないのでちょっと取り過ぎかもしれません.数字を少しづつ変えて調整することになるでしょう.
CY8CKIT-049-42xx (PSoC4 Prototyping Kit)で動くテストプログラムです.PSoC Creator 3.3用です.Bootloader Hostを使って書き込みます.詳しくはこちらのページを参照してください.(Creator 3.2用のドキュメントですが,open new project したときの最初の画面(5ページ目)以外は変わっていません.
このボードでUSBUARTを使おうとするとSDC版UARTモジュールってのを使うことになるんですね.で,ちょっと関数名が違うと.UART_printf.cの中の関数名もUART_1_UartPutCharのように変わっています.
PSoC3での検証はまたの機会に.
printfの途中でmalloc失敗してるんですね〜