娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年10月21日(星期一)

正在發生

2018年10月21日 | STM32——關于printf重定向到串口的問題

發布者:Aq123456258 來源: eefocus關鍵字:STM32  printf重定向  串口 手機看文章 掃描二維碼
隨時隨地手機看文章

簡單地說:想在mdk 中用printf,需要同時重定義fputc函數和避免使用semihosting(半主機模式), 

標準庫函數的默認輸出設備是顯示器,要實現在串口或LCD輸出,必須重定義標準庫函數里調用的與輸出設備相關的函數. 

例如: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()之類的函數,使用了半主機模式。使用標準庫會導致程序無法運行,以下是解決方法: 

方法1.使用微庫,因為使用微庫的話,不會使用半主機模式. 

方法2.仍然使用標準庫,在主程序添加下面代碼: 

#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,請在工程屬性的“Target“-》”Code Generation“中勾選”Use MicroLIB;今天參考了一下論壇,使用微庫可以很好的解決這個問題。 

2.另一種方法:(其實大同小異)   

需要添加以下代碼  

(論壇里應該有完整介紹這個的帖子,但是我沒搜到,也許是沉了。) 

#pragma import(__use_no_semihosting)   

/******************************************************************************   

*標準庫需要的支持函數   

******************************************************************************/   

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()以避免使用半主機模式   

///

  

///   

///   

_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.  

 按我的理解,這個模式是用來調試的,通過仿真器,使用主機的輸入輸出代替單片機自己的,也就是說即便單片機沒有輸出口也能printf到電腦上。反過來,由于這個模式更改了printf()等的實現方式,輸入輸出就不走單片機的外設了,所以只重定義fputc不起作用。 

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

以上僅為個人理解,如有錯誤請指正。 



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

C庫函數重定向: 

用戶能定義自己的C語言庫函數,連接器在連接時自動使用這些新的功能函數。這個過程叫做重定向C語言庫函數,如下圖所示。 

舉例來說,用戶有一個I/O設備(如UART)。本來庫函數fputc()是把字符輸出到調試器控制窗口中去的,但用戶把輸出設備改成了UART端口,這樣一來,所有基于fputc()函數的printf()系列函數輸出都被重定向到UART端口上去了。 

下面是實現fputc()重定向的一個例子: 

externvoidsendchar(char*ch); 

intfputc(intch,FILE*f) 

{/*e.g.writeacharactertoanUART*/ 

chartempch=ch; 

sendchar(&tempch); 

returnch; 

} 

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

 

第二個問題,路徑:D:\Keil3.80\ARM\Examples\ST\STM32F10xFWLib\Example

關鍵字:STM32  printf重定向  串口 引用地址:STM32——關于printf重定向到串口的問題

上一篇:ARM裸機程序之LED燈
下一篇:STM32的RTC晶振不起振的原因及解決方法

推薦閱讀

受物聯網、個人設備、數據中心的強勁帶動,未來五年,人工智能為半導體帶來的收益將增長13倍以上,年復合增長率超過50%,成為集成電路廠商不可錯過的藍海盛宴。?尤其在以下這幾個領域,半導體供應商可以積極尋求為人工智能訓練開發新器件并由此獲得新商機。?工作負載加速器。目前,基于GPU的系統正在許多訓練系統中使用。然而,隨著開發人員獲得神經網絡...
#include "msp430g2553.h"#define uint unsigned int#define uchar unsigned char /***************************************** RS--->>P2.0 RW--->>P2.1 E---->>P2.2 PSB-->>P2.3 PAUSE>>P2.4 RES-->>P2.5******************************************/#define DataPort P1OUT //MCU P2<------> LCM /*void DelayMs(uint x)...
2020年9月,由中國人工智能產業發展聯盟(AIIA)主辦的“AIIA2020人工智能開發者大會”在北京舉行。Imagination Technologies作為投身人工智能領域多年的領先半導體知識產權供應商,也參與了此次活動。Imagination中國區戰略市場與生態高級總監時昕代表公司出席,并在主論壇上發表了“基于GPU與神經網絡加速器的異構計算平臺”的主題演講,分享了AI芯片的...
看門狗定時器由獨立的128 kHz片內振蕩器驅動。通過設置看門狗定時器的預分頻器可以調節看門狗復位的時間間隔,如 P44Table26 所示。看門狗復位指令 WDR 用來復位看門狗定時器。此外,禁止看門狗定時器或發生復位時它也被復位。復位時間有 10 個選項。如果沒有及時復位定時器,一旦時間超過復位周期, ATmega48/88/168 就復位,并執行復位向量指向...

史海拾趣

問答坊 | AI 解惑

如何能編好單片機的程序(8)

。 15、修改別人程序的修養 ----------- 當你維護別人的程序時,請不要非常主觀臆斷的把已有的程序刪除或是修改。我經常看到有的程序員直接在別人的程序上修改表達式或是語句。修改別人的程序時,請不要刪除別人的程序,如果你覺得別人的程序有 ...…

查看全部問答∨

SIRF的android平臺整出來沒?

如題, 有哪位同仁知道詳情嗎?…

查看全部問答∨

關于wince開發平臺搭建R3的安裝問題

現在想開始wince的開發學習,再搭建平臺的時候有點問題了 我已經按照網上說的 vs2005  vs2005sp1  msdn   wince6.0  wince6.0sp1已經安裝好了,現在剩下的我要怎么安裝呢? 這是一個問題了 聽說r3修復了 ...…

查看全部問答∨

dopod700開發 顯示自制對話框 最下面一行怎么出現鍵盤的圖標,而且允許操作,如何刪除它

我在資源里添加一個對話框,并在函數里dlg.DoModal()顯示它,怎么最底下一行有個鍵盤的圖標呢,而且在屏幕上點它,還會在畫面上出現整個鍵盤的鍵,如何刪除它或不讓它看到呢??誰知道的跟我說下好么,謝謝大哥,大姐了,幫幫忙...…

查看全部問答∨

求助msp430 spi問題

串口通訊問題 我使用ADS7886做模數轉換,但結果總死在第一個 while(!(IFG2 & UCA0RXIFG))這里了。。 麻煩哪位高手幫下忙,萬分感謝!!! void init_spi() { P3DIR |=0X41; P3SEL |=0X21; UCA0CTL0 |=UCMSB+UCMST+UCSYNC;//3線8位spi UC ...…

查看全部問答∨

逆變器制作全過程(新手必看)

制作600W的正弦波逆變器, 該機具有以下特點: 1.SPWM的驅動核心采用了單片機SPWM芯片,TDS2285,所以,SPWM驅動部分相對純硬件來講,比較簡單,制作完成后要調試的東西很少,所以,比較容易成功。 2.所有的PCB全部采用了單面板,便于大家制作, ...…

查看全部問答∨

msp430g2553_uart_printf

http://blog.sina.com.cn/lscore 該程序在msp430g2553硬件平臺上利用UART實現了標準輸出函數printf的功能,可移植與其他硬件平臺…

查看全部問答∨

關于TTL反相器三極管工作狀態的問題

請問在該圖中,當輸入電壓為高電平3.6V時,T2,T3為什么處于飽和狀態,而不是放大狀態呢?…

查看全部問答∨

請問適合用于 DDS 的濾波器

大家好: 我現在用的 DDS 是 AD9833,如上圖所示,輸出用一個反向放大器放大正弦波, 可是發現波形會有鋸齒成分,請問有哪一種濾波器可以消除鋸齒成分使波形更圓滑一點? 要用低通還是帶通?而截止頻率應該設計為多少呢?謝謝。…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 上虞市| 鄂州市| 祁门县| 和林格尔县| 普格县| 湄潭县| 平乐县| 苏尼特右旗| 台东市| 岑巩县| 博兴县| 衡阳市| 三河市| 岳阳市| 保德县| 凌源市| 水城县| 隆化县| 桂东县| 武威市| 桓台县| 叙永县| 汽车| 铅山县| 昌宁县| 宝坻区| 清流县| 兴安县| 随州市| 哈尔滨市| 雷州市| 横山县| 沙河市| 大庆市| 厦门市| 济南市| 政和县| 万载县| 永福县| 漯河市| 文登市|