2

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

这显然是错误的。

4

3 回答 3

7

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

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

请注意,这与您如何初始化 UART 完全无关。重要的是您使用的是哪个UART。

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

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

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

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

..等等。)

于 2009-11-10T10:33:50.757 回答
4

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

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

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

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

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

于 2009-11-11T01:05:08.613 回答
0

我不确定ARM特别...

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

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

我同意史蒂夫的观点,这只有在您可以实际使用 printf 的情况下,否则请编写您自己的小片段。

于 2009-11-13T13:43:44.273 回答