2009-11-09 37 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,否则写你自己的小片段。

相关问题