在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

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

            作者: 時間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
            標(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__#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)庫會導(dǎo)致程序無法運(yùn)行,以下是解決方法:方法1.使用微庫,因?yàn)槭褂梦斓脑?不會使用半主機(jī)模式.



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


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



            };

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

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

            需要添加以下代碼


            #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;
            }


            評論


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

            關(guān)閉