使用Printf在ARM微控制器的串行端口上显示

时间:2009-11-09 08:36:32

标签: embedded serial-port printf microcontroller

我想使用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*/
}

这显然是错误的。

3 个答案:

答案 0 :(得分:7)

对于微型控制器,您通常必须定义自己的putc函数,以便将字节发送到您正在使用的任何UART。然后,print会致电您的putc

查看随编译器提供的库的文档。

请注意,这与您初始化UART的方式完全无关。重要的是你正在使用的 UART。

(在一个不相关的问题上,而不是说:

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

寄存器通常有#define个(通常)有助于提高可读性,提供文档中位名称的链接,并减少在这样的每一行上添加和维护注释的需要。例如:

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

..等等。)

答案 1 :(得分:4)

要使 printf() puts() 等在嵌入式平台上运行,您需要实现一些与C库一起使用的挂钩。这通常取决于编译器提供的C库,因此可能与编译器有关。但在很多情况下,图书馆只需要您提供 putc() 功能(或类似名称),该功能需要一个字符(由 printf()生成库函数)并将其发送到您选择的输出设备。这可能是内存缓冲区,串口,USB消息等等。

从C库的角度来看, putc() 函数将是运行完成的,因此您是否将其实现为简单的阻塞函数取决于您(等待串口空闲并发送字符)或非阻塞(将其放入缓冲区,由后台中断任务发送;但如果足够快地输出足够的字节,缓冲区可能会填满,然后你必须阻止或丢弃字符)。如果你有一个RTOS,你也可以使它正常工作,实现一个在信号量上休眠的阻塞写,直到串口可用。

总而言之,请阅读编译器及其C库的文档,它应该告诉您需要做什么才能使 printf() 工作。

AVR micro与GCC编译器的示例链接:

使用newlib C库的ARM GCC编译器:

答案 2 :(得分:0)

我特别不确定ARM ...

对于某些芯片,在IDE中,您需要指定需要堆来使用printf,以及它应该有多大。程序员不会自动打开一个。

检查程序员/ IDE的菜单,看看是否有指定堆大小的地方。

我同意Steve的观点,这只是你真的可以使用printf,否则就写下你自己的小片段。