新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > MSP430G2553單片機使用printf函數進行串口打印輸出

        MSP430G2553單片機使用printf函數進行串口打印輸出

        作者: 時間:2016-11-13 來源:網絡 收藏
        以前在使用keil編寫51單片機程序的時候,經常使用printf函數打印輸出一些關鍵的過程數據到電腦,方便監控程序的運行狀況。最近使用IAR for MSP430 調試MSP430G2553程序的時候,發現了一些小問題,MSP430G2553單片機并沒有按照我的預期輸出數據到電腦。
        帶著疑惑我查看了keil的幫助文件里面的printf函數說明,原來printf函數最終是調用putchar函數來實現打印輸出字符的。
        putchar,該函數將制定的表達式的值所對應的字符輸出到標準輸出終端上。表達式可以是字符型或整型,它每次只能輸出一個字符。我們來看keil標準函數庫里的putchar函數的函數體。
        根據說明提示,我在D:KeilC51LIB文件夾里面找到了putchar.c文件
        #include
        #define XON 0x11
        #define XOFF 0x13
        /*
        * putchar (full version): expands n into CR LF and handles
        * XON/XOFF (Ctrl+S/Ctrl+Q) protocol
        */
        char putchar (char c) {
        if (c == n) {
        if (RI) {
        if (SBUF == XOFF) {
        do {
        RI = 0;
        while (!RI);
        }
        while (SBUF != XON);
        RI = 0;
        }
        }
        while (!TI);
        TI = 0;
        SBUF = 0x0d; /* output CR */
        }
        if (RI) {
        if (SBUF == XOFF) {
        do {
        RI = 0;
        while (!RI);
        }
        while (SBUF != XON);
        RI = 0;
        }
        }
        while (!TI);
        TI = 0;
        return (SBUF = c);
        }
        #if 0 // comment out versions below
        /*
        * putchar (basic version): expands n into CR LF
        */
        char putchar (char c) {
        if (c == n) {
        while (!TI);
        TI = 0;
        SBUF = 0x0d; /* output CR */
        }
        while (!TI);
        TI = 0;
        return (SBUF = c);
        }
        /*
        * putchar (mini version): outputs charcter only
        */
        char putchar (char c) {
        while (!TI);
        TI = 0;
        return (SBUF = c);
        }
        #endif
        由說明文件可以看出,我們可以改寫這個底層的putchar函數來適應不同的硬件。keil里面的putchar函數是默認用串行口輸出信息的,我們可以自由定義成另外的輸出模塊,比如自定義IO向1602液晶輸出信息。
        keil的printf函數大致搞明白了,回頭再研究下IAR for MSP430,可惜,我沒有能夠查看該軟件標準函數庫里的printf.c 和 putchar.c,不過我覺得程序沒有通過串口向電腦打印輸出信息,是因為底層的putchar函數沒有定義為通過MSP430G2553的UART進行輸出,那如果我自己重定向一個putchar函數,覆蓋掉標準函數庫里面的putchar,是不是就能夠輸出了呢。于是編寫putchar函數如下:
        /*********************************************************************
        * 函數名 : putchar,函數重定向,自動覆蓋標準庫函數
        * 函數功能 : 向串口終端發送一個字符
        * 形參 : c為待發送的字符
        * 返回值 : c
        *********************************************************************/
        int putchar(int c)
        {
        if(c == n)
        {
        while(UCA0STAT & UCBUSY);
        UCA0TXBUF = r;
        }
        while(UCA0STAT & UCBUSY);
        UCA0TXBUF = c;
        return c;
        }
        編譯后,輸出完全正確。大功告成。
        將測試程序向大家展示一下,希望能幫到大家。
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        uart.c
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        #include <msp430g2553.h>
        /**********************************************************************
        * 函數名 : UartInit
        * 函數功能 : 初始化msp430g2553的USCI寄存器,使其工作在UART模式
        * 形參 : 無
        * 返回值 : 無
        * ********************************************************************/
        void UartInit()
        {
        BCSCTL1 = CALBC1_1MHZ; // Set DCO
        DCOCTL = CALDCO_1MHZ;
        BCSCTL2 &= ~(DIVS_3);
        P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
        P1SEL2 = BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD
        UCA0CTL1 |= UCSSEL_2; // SMCLK
        UCA0BR0 = 104; // 1MHz 9600
        UCA0BR1 = 0; // 1MHz 9600
        UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1
        UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
        UC0IE |= UCA0RXIE; // Enable RX int
        }
        /*********************************************************************
        * 函數名 : putchar,函數重定向,自動覆蓋標準庫函數
        * 函數功能 : 向串口終端發送一個字符
        * 形參 : c為待發送的字符
        * 返回值 : c
        *********************************************************************/
        int putchar(int c)
        {
        if(c == n)
        {
        while(UCA0STAT & UCBUSY);
        UCA0TXBUF = r;
        }
        while(UCA0STAT & UCBUSY);
        UCA0TXBUF = c;
        return c;
        }
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        main.c
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        #include
        #include "uart.h"
        #include "stdio.h"
        void main()
        {
        float value = 123.123456789;
        char *string="http://www.hao123.com";
        WDTCTL = WDTPW + WDTHOLD;
        UartInit();
        printf("value = %fn%sn",value,string);
        while(1);
        }
        信息打印輸出到電腦的超級終端,截圖如下:



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 梅州市| 永修县| 晋城| 永新县| 扎兰屯市| 阳高县| 嘉定区| 黄龙县| 沛县| 咸宁市| 汝城县| 资中县| 周口市| 肥城市| 施秉县| 水富县| 长垣县| 黑龙江省| 阿克陶县| 西盟| 金沙县| 鹰潭市| 庆城县| 丰都县| 攀枝花市| 安庆市| 石景山区| 万宁市| 宣武区| 舞阳县| 共和县| 光山县| 安顺市| 肥乡县| 温州市| 南乐县| 寿光市| 绥宁县| 阜康市| 新竹市| 柳江县|