新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32程序添加printf函數后無法運行的解決方法(串口實驗)

        STM32程序添加printf函數后無法運行的解決方法(串口實驗)

        作者: 時間:2016-11-11 來源:網絡 收藏
        標準庫函數的默認輸出設備是顯示器,要實現在串口或LCD輸出,必須重定義標準庫函數里調用的與輸出設備相關的函數.
        例如: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()之類的函數,使用了半主機模式。使用標準庫會導致程序無法運行,以下是解決方法:方法1.使用微庫,因為使用微庫的話,不會使用半主機模式.



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


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



        };

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

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

        需要添加以下代碼


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


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 荔波县| 泌阳县| 曲靖市| 鄯善县| 资阳市| 内乡县| 玉屏| 隆化县| 桂阳县| 长顺县| 阿鲁科尔沁旗| 南通市| 上饶县| 四平市| 鹤岗市| 阿荣旗| 海晏县| 团风县| 交城县| 连南| 当雄县| 惠安县| 五寨县| 洛隆县| 丰城市| 子洲县| 宁化县| 锦屏县| 泾川县| 湖南省| 白河县| 乌拉特前旗| 乌苏市| 德清县| 韶山市| 正阳县| 鄱阳县| 马鞍山市| 诸城市| 南康市| 霞浦县|