我想使用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 :(得分: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,否则就写下你自己的小片段。