Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Embedded 用Printf在ARM单片机串口上显示_Embedded_Serial Port_Printf_Microcontroller - Fatal编程技术网

Embedded 用Printf在ARM单片机串口上显示

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; /*

我想使用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; /* 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一起工作。没有任何可以工作的代码。