Embedded 用Printf在ARM单片机串口上显示
我想使用printf在ARM微控制器的串行端口上显示文本。我不能这样做。感谢您的帮助 我的init_序列像这样Embedded 用Printf在ARM单片机串口上显示,embedded,serial-port,printf,microcontroller,Embedded,Serial Port,Printf,Microcontroller,我想使用printf在ARM微控制器的串行端口上显示文本。我不能这样做。感谢您的帮助 我的init_序列像这样 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; /*
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*/
}
这显然是错误的。对于微型计算器,您通常必须定义自己的
putc
函数来将字节发送到所使用的UART<代码>打印然后将调用您的putc
检查编译器附带的库的文档
请注意,这与如何初始化UART完全无关。重要的是你在使用哪个UART
(关于一个无关的问题,而不是说:
PINSEL0 = 0x00050000; /* Enable RXD1 TxD1 */
U1LCR = 0x00000083; /*8 bits, 1 Stop bit */
通常有#为寄存器定义,这些寄存器(通常)有助于可读性,提供指向文档中位名称的链接,并减少在每行添加和维护注释的需要。例如:
PINSEL0 = PICSEL0_RXD1EN | PICSEL0_TXD1EN;
U1LCR = U1LCR_8BITS | U1LCR_1STOPBIT;
…等等。)要使printf()
,put()
等在嵌入式平台上工作,您需要实现一些与C库一起工作的钩子。这通常依赖于编译器提供的C库,因此可能依赖于编译器。但在许多情况下,库只要求您提供一个putc()
函数(或类似名称),该函数接受一个字符(由printf()
库函数生成)并将其发送到您选择的输出设备。那可能是一个内存缓冲区,串口,USB信息,等等
从C库的角度来看,putc()
函数将一直运行到完成,因此实现它是简单的阻塞函数(等待串行端口空闲并发送字符)还是非阻塞函数取决于您(将其放入缓冲区,由后台中断任务发送;但如果输出足够快的字节,缓冲区可能会填满,然后必须阻塞或丢弃字符)。如果您有RTO,也可以使其正常工作,实现阻塞写入,在串行端口可用之前一直休眠在信号量上
总之,请阅读编译器及其C库的文档,它会告诉您需要做什么才能使printf()正常工作
带有GCC编译器的AVR micro示例链接:
使用newlib C库的ARM GCC编译器:
-
我对ARM尤其不确定
对于某些芯片,在IDE中,您需要指定需要一个堆来使用printf,以及它应该有多大。程序员不会自动将一个堆放在上面
检查程序员/IDE的菜单,查看是否有指定堆大小的位置
我同意Steve的观点,这只有在你能真正使用printf的情况下才能实现,否则你需要编写自己的小片段。你可能需要提供更多信息才能得到答案:(a)确切地说是哪个微控制器?“ARM”基本上只指定了指令集。(b)为什么上面的代码“显然”是这样的错误?有很多部件一起工作以使printf()
工作,串行端口初始化只是其中之一。您知道这是错误的部件吗?(c)您是否有任何工作的示例代码,可能是由制造商提供的?(d)你有示波器吗?例如LPC213x微控制器。这个代码是错误的,因为它不能与printf一起工作。没有任何可以工作的代码。