【问题标题】:Using Printf to display on serial port of an ARM microcontroller使用 Printf 在 ARM 微控制器的串口上显示
【发布时间】:2009-11-09 08:36:32
【问题描述】:

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

这显然是错误的。

【问题讨论】:

  • 您可能需要提供更多信息才能得到答案:(a) 究竟是哪个微控制器? “ARM”基本上只是指定指令集。 (b) 为什么上面的代码“明显”错了?有很多部分协同工作以使printf() 工作,串行端口初始化只是其中之一。你知道这是错误的部分吗? (c) 您是否有任何可能由制造商提供的示例代码? (d) 你有示波器吗?
  • 例如 LPC213x 微控制器。此代码是错误的,因为它不适用于 printf。没有任何有效的代码。

标签: embedded serial-port printf microcontroller


【解决方案1】:

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

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

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

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

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

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

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

..等等。)

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      我不太确定 ARM 的具体情况......

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

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

      我同意史蒂夫的观点,这只有在你可以真正使用 printf 的情况下,否则你自己写一个小 sn-p。

      【讨论】:

        猜你喜欢
        • 2013-09-07
        • 1970-01-01
        • 2013-01-18
        • 1970-01-01
        • 2010-12-21
        • 1970-01-01
        • 2017-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多