單片機中printf函數的重映射
1.如果你在學(xué)習單片機之前學(xué)過(guò)C語(yǔ)言,那么一定知道printf這個(gè)函數.它最最好用的功能
本文引用地址:http://dyxdggzs.com/article/201611/321833.htm除了打印你想要的字符到屏幕上外,還能把數字進(jìn)行格式化.例如十進(jìn)制的33,用十進(jìn)制
方式輸出就是33,用十六進(jìn)制的形式就輸出成21,如果用字符形式輸出,那就是ASCII碼
表對應的’!’.
2. 51年代,一些人軟件仿真的時(shí)候也很喜歡使用printf,但實(shí)際代碼運行中,用的人則不多,因
為別說(shuō)51年代,就是用AVR的,也會(huì )覺(jué)得printf這個(gè)函數耗費的CPU資源相當可觀(guān).所以
printf在8位單片機時(shí)代,熟悉的人的確不多.但到了ARM時(shí)代,情況則大為不同.畢竟
ARM的處理能力和51完全不是一個(gè)級別,這使得不少人開(kāi)始喜歡使用printf在實(shí)際項目
中作為調試過(guò)程的串口輸出.因為它的格式化功能實(shí)在是相當方便.
而本例程就是教會(huì )你這么使用printf.
3.程序把printf的輸出對象設定為串口1.有一個(gè)標準的函數是必須要自己定義的,那就是
fputc,把這個(gè)函數的功能寫(xiě)成串口輸出一個(gè)字符.建議在串口的初始化模塊中定義
int fputc(int ch)
{
USART_SendData(USART1, (u8) ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
return ch;
}
然后記得一點(diǎn),就是MicroLib要勾上.其實(shí)大部分情況下,都建議使用MDK附帶的
MicroLib,這東西是有一定用途的.留待以后再更多地介紹.
以上兩步做好后,還記得要包含printf的頭文件:
#include
那么,所有工作就大功告成了,你可以盡情的嘗試printf帶來(lái)的便利.
4.另外大家是否意識到一點(diǎn),就是printf輸出到哪,其實(shí)是由fputc函數決定的.所以如果有興
趣,可以改寫(xiě)這個(gè)fputc函數,使得其printf的對象是DX-32板上的TFT屏或者黑白屏.大家有
興趣的不妨試試.
二、源自于:STM32開(kāi)發(fā)板(正點(diǎn)原子)
//加入以下代碼,支持printf函數,而不需要選擇use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//標準庫需要的支持函數
struct __FILE
{
int handle;
};
FILE __stdout;
//定義_sys_exit()以避免使用半主機模式
_sys_exit(int x)
{
x = x;
}
//重定義fputc函數 ,串口1
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢
USART1->DR = (u8) ch;
return ch;
}
#endif
評論