新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)中printf函數(shù)的重映射

單片機(jī)中printf函數(shù)的重映射

作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
一、源自于:大俠有話說

1.如果你在學(xué)習(xí)單片機(jī)之前學(xué)過C語言,那么一定知道printf這個(gè)函數(shù).它最最好用的功能

本文引用地址:http://m.butianyuan.cn/article/201611/321833.htm

除了打印你想要的字符到屏幕上外,還能把數(shù)字進(jìn)行格式化.例如十進(jìn)制的33,用十進(jìn)制

方式輸出就是33,用十六進(jìn)制的形式就輸出成21,如果用字符形式輸出,那就是ASCII碼

表對應(yīng)的’!’.

2. 51年代,一些人軟件仿真的時(shí)候也很喜歡使用printf,但實(shí)際代碼運(yùn)行中,用的人則不多,因

為別說51年代,就是用AVR的,也會覺得printf這個(gè)函數(shù)耗費(fèi)的CPU資源相當(dāng)可觀.所以

printf在8位單片機(jī)時(shí)代,熟悉的人的確不多.但到了ARM時(shí)代,情況則大為不同.畢竟

ARM的處理能力和51完全不是一個(gè)級別,這使得不少人開始喜歡使用printf在實(shí)際項(xiàng)目

中作為調(diào)試過程的串口輸出.因?yàn)樗母袷交δ軐?shí)在是相當(dāng)方便.

而本例程就是教會你這么使用printf.

3.程序把printf的輸出對象設(shè)定為串口1.有一個(gè)標(biāo)準(zhǔn)的函數(shù)是必須要自己定義的,那就是

fputc,把這個(gè)函數(shù)的功能寫成串口輸出一個(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帶來的便利.

4.另外大家是否意識到一點(diǎn),就是printf輸出到哪,其實(shí)是由fputc函數(shù)決定的.所以如果有興

趣,可以改寫這個(gè)fputc函數(shù),使得其printf的對象是DX-32板上的TFT屏或者黑白屏.大家有

興趣的不妨試試.

二、源自于:STM32開發(fā)板(正點(diǎn)原子)

//加入以下代碼,支持printf函數(shù),而不需要選擇use MicroLIB

#if 1

#pragma import(__use_no_semihosting)

//標(biāo)準(zhǔn)庫需要的支持函數(shù)

struct __FILE

{

int handle;

};

FILE __stdout;

//定義_sys_exit()以避免使用半主機(jī)模式

_sys_exit(int x)

{

x = x;

}

//重定義fputc函數(shù) ,串口1

int fputc(int ch, FILE *f)

{

while((USART1->SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢

USART1->DR = (u8) ch;

return ch;

}

#endif



評論


技術(shù)專區(qū)

關(guān)閉