2009-11-09 118 views
2

我想使用printf在ARM微控制器的串口上顯示文本。我無法這樣做。任何幫助表示讚賞。使用Printf在ARM微控制器的串口上顯示

我init_serial看起來像這樣

void init_serial (void) 
{ 
PINSEL0 = 0x00050000; /* Enable RXD1 TxD1 */ 
U1LCR = 0x00000083; /*8 bits, 1 Stop bit */ 
U1DLL = 0x000000C2; /*9600 Baud Rate @12MHz VPB Clock */ 
U1LCR = 0x00000003; /* DLAB=0*/ 
} 

這顯然是錯誤的。

+0

您可能需要提供更多信息才能得到答案:(a)究竟哪個微控制器? 「ARM」基本上只是指定了指令集。 (b)爲什麼上述代碼「顯然」錯了?有很多部件一起工作來使'printf()'工作,串口初始化只是其中之一。你知道嗎?這是錯誤的部分? (c)您是否有任何示例代碼可用,可能由製造商提供? (d)你有示波器嗎? – 2009-11-09 08:52:22

+0

例如LPC213x微控制器。此代碼是錯誤的,因爲它不適用於printf。沒有任何可用的代碼。 – 2009-11-09 09:05:02

回答

7

對於微控制器,您通常必須定義您自己的putc函數,以將字節發送到正在使用的任何UART。 print將會打電話給您的putc

檢查隨編譯器提供的庫的文檔。

請注意,這與您如何初始化UART完全無關。重要的是其中您正在使用的UART。

(在一個不相關的問題,而不是說:

PINSEL0 = 0x00050000; /* Enable RXD1 TxD1 */ 
U1LCR = 0x00000083; /*8 bits, 1 Stop bit */ 

通常有#define S表示寄存器這(通常)援助的可讀性,提供的文檔中的鏈接位名稱,並減少需要要添加,並保持在這樣的每一行例如點評:

PINSEL0 = PICSEL0_RXD1EN | PICSEL0_TXD1EN; 
U1LCR = U1LCR_8BITS | U1LCR_1STOPBIT; 

..和等)

4

爲了使printf(),puts()等工作在嵌入式平臺上,您需要實現一些鉤子與C庫一起工作。這通常依賴於編譯器提供的C庫,所以可能依賴於編譯器。但是在很多情況下,庫只需要提供一個函數(或類似的名稱),它需要一個字符(由庫函數生成)並將其發送到您選擇的輸出設備。這可能是一個內存緩衝區,串口,USB信息,無論如何。

但從C庫點時,putc()功能將運行至完成,所以無論你實現它是一個簡單的阻塞函數(等到串口是免費的就看你併發送字符)或非阻塞(將其放入緩衝區,由後臺中斷任務發送;但如果輸出的字節足夠快,則緩衝區可能會填滿,然後必須阻止或放棄字符)。你也可以使它與你的RTOS正常工作,如果你有一個,實現阻塞寫入睡眠信號量,直到串口可用。

因此,總之,請閱讀您的編譯器及其C庫的文檔,它應該告訴您需要做什麼才能使printf()工作。

用於AVR微實施例鏈路與GCC編譯器:

ARM GCC編譯器使用newlib C庫:

0

我不知道ARM尤其...

對於一些芯片,在IDE中,你需要指定你需要一個堆使用的printf ,以及它應該有多大。程序員不會自動放置一個。

檢查你的程序員/ IDE的菜單,看看是否有地方指定堆大小。

我同意史蒂夫,這是隻有當你可以真正使用printf,否則寫你自己的小片段。

相關問題