當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]usart這部分代碼我也是從網(wǎng)上copy出來的,一下是作者的解釋:簡單地說:想在mdk 中用printf,需要同時(shí)重定義fputc函數(shù)和避免使用semihosting(半主機(jī)模式),標(biāo)準(zhǔn)庫函數(shù)的默認(rèn)輸出設(shè)備是顯示器,要實(shí)現(xiàn)在串口或LCD輸出

 

usart這部分代碼我也是從網(wǎng)上copy出來的,一下是作者的解釋:
簡單地說:想在mdk 中用printf,需要同時(shí)重定義fputc函數(shù)和避免使用semihosting(半主機(jī)模式),
標(biāo)準(zhǔn)庫函數(shù)的默認(rèn)輸出設(shè)備是顯示器,要實(shí)現(xiàn)在串口或LCD輸出,必須重定義標(biāo)準(zhǔn)庫函數(shù)里調(diào)用的與輸出設(shè)備相關(guān)的函數(shù).
例如:printf輸出到串口,需要將fputc里面的輸出指向串口(重定向),方法如下:
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
USART_SendData(USART1, (uint8_t) ch);
/* Loop until the end of transmission */
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
return ch;
}
因printf()之類的函數(shù),使用了半主機(jī)模式。使用標(biāo)準(zhǔn)庫會(huì)導(dǎo)致程序無法運(yùn)行,以下是解決方法:
方法1.使用微庫,因?yàn)槭褂梦斓脑?不會(huì)使用半主機(jī)模式.
方法2.仍然使用標(biāo)準(zhǔn)庫,在主程序添加下面代碼:
#pragma import(__use_no_semihosting)
_sys_exit(int x)
{
x = x;
}
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
如果使用的是MDK,請(qǐng)?jiān)诠こ虒傩缘?ldquo;Target“-》”Code Generation“中勾選”Use MicroLIB;今天參考了一下論壇,使用微庫可以很好的解決這個(gè)問題。
2.另一種方法:(其實(shí)大同小異)
需要添加以下代碼
(論壇里應(yīng)該有完整介紹這個(gè)的帖子,但是我沒搜到,也許是沉了。)
#pragma import(__use_no_semihosting)
/******************************************************************************
*標(biāo)準(zhǔn)庫需要的支持函數(shù)
******************************************************************************/
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;

///

 


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

///
///
_sys_exit(int x)
{
x = x;
}

 

 

 

int fputc(int ch, FILE *f)
{
//USART_SendData(USART1, (u8) ch);
USART1->DR = (u8) ch;

/* Loop until the end of transmission */
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
{
}

return ch;
}
semihosting的作用,介紹如下
Semihosting is a mechanism for ARM targets to communicate input/output requests
from application code to a host computer running a debugger. This mechanism could be
used, for example, to allow functions in the C library, such as printf() and scanf(), to use the screen and keyboard of the host rather than having a screen and keyboard on the target system.
This is useful because development hardware often does not have all the input and
output facilities of the final system. Semihosting allows the host computer to provide these facilities.
Semihosting is implemented by a set of defined software interrupt (SWI) operations.
The application invokes the appropriate SWI and the debug agent then handles the SWI
exception. The debug agent provides the required communication with the host.
In many cases, the semihosting SWI will be invoked by code within library functions. The application can also invoke the semihosting SWI directly. Refer to the C library descriptions in the ADS Compilers and Libraries Guide for more information on support for semihosting in the ARM C library.
按我的理解,這個(gè)模式是用來調(diào)試的,通過仿真器,使用主機(jī)的輸入輸出代替單片機(jī)自己的,也就是說即便單片機(jī)沒有輸出口也能printf到電腦上。反過來,由于這個(gè)模式更改了printf()等的實(shí)現(xiàn)方式,輸入輸出就不走單片機(jī)的外設(shè)了,所以只重定義fputc不起作用。

用代碼關(guān)閉此模式后,需要同時(shí)更新一下__stdout 和__stdin 的定義,所以有后面的語句。

以上僅為個(gè)人理解,如有錯(cuò)誤請(qǐng)指正。


另外,勾選microlib之后,也許編譯的時(shí)候就不把開啟semihosting的文件包進(jìn)去了,所以沒事。

C庫函數(shù)重定向:
用戶能定義自己的C語言庫函數(shù),連接器在連接時(shí)自動(dòng)使用這些新的功能函數(shù)。這個(gè)過程叫做重定向C語言庫函數(shù),如下圖所示。
舉例來說,用戶有一個(gè)I/O設(shè)備(如UART)。本來庫函數(shù)fputc()是把字符輸出到調(diào)試器控制窗口中去的,但用戶把輸出設(shè)備改成了UART端口,這樣一來,所有基于fputc()函數(shù)的printf()系列函數(shù)輸出都被重定向到UART端口上去了。
下面是實(shí)現(xiàn)fputc()重定向的一個(gè)例子:
externvoidsendchar(char*ch);
intfputc(intch,FILE*f)
{/*e.g.writeacharactertoanUART*/
chartempch=ch;
sendchar(&tempch);
returnch;

這個(gè)例子簡單地將輸入字符重新定向到另一個(gè)函數(shù)sendchar(),sendchar()假定是個(gè)另外定義的串口輸出函數(shù)。在這里,fputc()就似乎目標(biāo)硬件和標(biāo)準(zhǔn)C庫函數(shù)之間的一個(gè)抽象層。

第二個(gè)問題,路徑:D:Keil3.80ARMExamplesSTSTM32F10xFWLibExamples

 

 

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉