單片機使用printf函數進行串口打印輸出
由說明文件可以看出,我們可以改寫這個底層的putchar函數來適應不同的硬件。keil里面的putchar函數是默認用串行口輸出信息的,我們可以自由定義成另外的輸出模塊,比如自定義IO向1602液晶輸出信息。
keil的printf函數大致搞明白了,回頭再研究下IAR for MSP430,可惜,我沒有能夠查看該軟件標準函數庫里的printf.c 和 putchar.c,不過我覺得程序沒有通過串口向電腦打印輸出信息,是因為底層的putchar函數沒有定義為通過MSP430G2553的UART進行輸出,那如果我自己重定向一個putchar函數,覆蓋掉標準函數庫里面的putchar,是不是就能夠輸出了呢。于是編寫putchar函數如下:
int putchar(int c)
{
if(c == )
{
while(UCA0STAT & UCBUSY);
UCA0TXBUF = ;
}
while(UCA0STAT & UCBUSY);
UCA0TXBUF = c;
return c;
}
編譯后,輸出完全正確。大功告成。
將測試程序向大家展示一下,希望能幫到大家。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
uart.c
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include
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
}
int putchar(int c)
{
if(c == )
{
while(UCA0STAT & UCBUSY);
UCA0TXBUF = ;
}
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 = %f%s",value,string);
while(1);
}
評論