日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

STM32中printf與scanf的重定向問題

 華燈初放l 2018-04-13

關(guān)于STM32中 printf 與 scanf 的重定向問題在此我僅對(duì)不使用 "USE MircoLIB" 的情況做整理(針對(duì)Keil RVMDK開發(fā)環(huán)境)。


① :首先需要在 usart.h 中包含 “stdio.h” 頭文件

② :在 usart.c 中,加入如下代碼塊,以此避免使用半主機(jī)模式,并重定向 printf 和scanf 函數(shù);


  1. #if 1  
  2. #pragma import (__use_no_semihosting_swi)  
  3. /*標(biāo)準(zhǔn)庫需要的支持函數(shù),use_no_semihosting_swi以避免使用半主機(jī)模式*/  
  4. struct __FILE  
  5. {  
  6.     int handle;  
  7. };  
  8.   
  9. FILE __stdout;  
  10. FILE __stdin;  
  11. /*重定向Printf函數(shù)*/  
  12. int fputc(int ch,FILE *f)  
  13. {  
  14.     return (SendChar(ch));  
  15. }  
  16. /*重定向Scanf函數(shù)*/  
  17. int fgetc(FILE *f)  
  18. {  
  19.     return (SendChar(GetKey()));  
  20.     /*調(diào)用scanf()在串口中輸入數(shù)據(jù)時(shí),必須以空格結(jié)束,否則無法完成發(fā)送*/  
  21. }  
  22.   
  23. void _ttywrch(int ch)  
  24. {  
  25.     SendChar(ch);  
  26. }  
  27.   
  28. int _ferror(FILE *f) {  
  29.   /* Your implementation of ferror */  
  30.   return EOF;  
  31. }  
  32.   
  33. //定義_sys_exit()以避免使用半主機(jī)模式  
  34. void _sys_exit(int return_code){  
  35.     //x = x;  
  36. label:goto label;  
  37. }  
  38.   
  39. #endif  

③ :在 usart.c 中添加SendChar()與GetKey()函數(shù)

  1. int SendChar(int ch)  
  2. {  
  3.     while(!(USART1->SR & USART_FLAG_TXE));  
  4.     USART1->DR = (ch & 0x1FF);  
  5.   
  6.     return ch;  
  7. }  
  8.   
  9. int GetKey(void)  
  10. {  
  11.     while(!(USART1->SR & USART_FLAG_RXNE));  
  12.     return ((int)(USART1->DR & 0X1FF));  
  13. }  


完成以上三步,即可實(shí)現(xiàn)printf()函數(shù)與scanf()的串口重定向,將標(biāo)準(zhǔn)輸入輸出流的來源或去向改為串口。


關(guān)于第二步所使用的避免使用半主機(jī)模式的代碼,其實(shí)Kei已經(jīng)為我們寫好了一個(gè)Retarget.c文件,在Keil/ARM/Startup目錄下.

另外本文針對(duì)的開發(fā)環(huán)境為Keil RVMDK,本人在Emblocks開源開發(fā)工具中實(shí)驗(yàn)時(shí),本方法是無法實(shí)現(xiàn)printf和Scanf的重定向的,以及在開源工具下如何"Use microLIB"的問題都有待進(jìn)一步探討。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多