<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32程序添加printf函數(shù)后無(wú)法運(yùn)行的解決方法(串口實(shí)驗(yàn))

          STM32程序添加printf函數(shù)后無(wú)法運(yùn)行的解決方法(串口實(shí)驗(yàn))

          作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏
          標(biāo)準(zhǔn)庫(kù)函數(shù)的默認(rèn)輸出設(shè)備是顯示器,要實(shí)現(xiàn)在串口或LCD輸出,必須重定義標(biāo)準(zhǔn)庫(kù)函數(shù)里調(diào)用的與輸出設(shè)備相關(guān)的函數(shù).
          例如:printf輸出到串口,需要將fputc里面的輸出指向串口(重定向),方法如下:#ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endifPUTCHAR_PROTOTYPE{USART_SendData(USART1, (uint8_t) ch);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);return ch;}因printf()之類的函數(shù),使用了半主機(jī)模式。使用標(biāo)準(zhǔn)庫(kù)會(huì)導(dǎo)致程序無(wú)法運(yùn)行,以下是解決方法:方法1.使用微庫(kù),因?yàn)槭褂梦?kù)的話,不會(huì)使用半主機(jī)模式.



          方法2.仍然使用標(biāo)準(zhǔn)庫(kù),在主程序添加下面代碼:


          #pragma import(__use_no_semihosting)
          _sys_exit(int x)
          {
          x = x;
          }
          struct __FILE
          {
          int handle;



          };

          FILE __stdout;
          另一個(gè)高手的講解
          剛開(kāi)始學(xué)stm32,順著gpio、uart。。。的順序慢慢爬
          初始化的方法學(xué)習(xí)了馬老師的STM32_Init.h****,自己英文還可以,加上avr的基礎(chǔ)還不錯(cuò),所以gpio和時(shí)鐘配置都很順利
          碰到uart就頭大了,看到各種例程里都是printf()函數(shù),自己也想用,畢竟是avr想用卻開(kāi)銷(xiāo)不了的東西。但是我自己寫(xiě)的程序里一旦出現(xiàn)printf,單片機(jī)的不干活了。查論壇首先發(fā)現(xiàn)要重定義fputc函數(shù),照做了,還是不行。
          后來(lái)懷疑是uart1初始化問(wèn)題,用自己寫(xiě)的put_c函數(shù)卻沒(méi)問(wèn)題。
          后來(lái)又發(fā)現(xiàn)一種說(shuō)法,需要避免使用semihosting(半主機(jī)模式),我也把代碼加進(jìn)去了(改fputc去掉了),還是不行。
          再一想,重定義fputc是絕對(duì)必須的,加上了之后問(wèn)題解決,成功使用printf("(敏感詞0373) n");輸出了,哈哈
          ***************************************************************************************************

          以上廢話,可以不看。
          簡(jiǎn)單地說(shuō):想在mdk 3.80a中用printf,需要同時(shí)重定義fputc函數(shù)和避免使用semihosting(半主機(jī)模式),
          論壇里應(yīng)該有完整介紹這個(gè)的帖子,但是我沒(méi)搜到,也許是沉了。重發(fā)出來(lái)希望能幫上像我這樣的菜鳥(niǎo)們。

          需要添加以下代碼


          #pragma import(__use_no_semihosting)
          /******************************************************************************
          *標(biāo)準(zhǔn)庫(kù)需要的支持函數(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;
          }


          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();