关于ARM Cortex-M3微控制器中使用UART的c:Printf输出

Printf output using UART in ARM Cortex-M3 microcontroller

我有基于LPC1768的板-LandTiger(底部值得检查手册)。我使用Segger的Keil uVision4 / 72 Lite和J-Link EDU对其进行编程。我与操纵杆和二极管进行交互的简单程序可以正常工作,但是...

我正在尝试实现debug printf,所以我可以在Keil" Debug(printf)Viewer "窗口中看到printf的输出。问题是我看不到任何输出-我认为我走在正确的Rails上,因为当我运行调试器时,我可以在窗口底部看到Trace:Running(之前是Trace:No Synchronization)。不幸的是,我在UART和调试输出窗口中看不到任何东西。

我已经花了很多时间尝试使其工作,感谢您的帮助;)

我的Keil设置为:

将"目标/调试"的"项目/选项"设置为J-Link / J-Trace Cortex。

然后在其设置中,我选择了SEGGER,端口:SW和MAX CLOCK:10 MHz。

在100Mhz核心时钟和SWO预分频器= 17的情况下启用了``跟踪''选项卡(这将导致5.882352MHz SWO时钟)。

ITM刺激端口设置为Enable:0xFFFFFFFF和Privilege:0x0000000F

这是我的代码的一部分:

define FOSC 12000000

define FCCLK (FOSC * 8)

define FCCO (FCCLK * 3)

define FPCLK (FCCLK / 4)

define UART0_BPS 115200

void UART0_Init (void)

{

uint16_t usFdiv;

/* UART0 */

LPC_PINCON->PINSEL0 |= (1 << 4);/* Pin P0.2 used as TXD0 (Com0) */

LPC_PINCON->PINSEL0 |= (1 << 6);/* Pin P0.3 used as RXD0 (Com0) */

LPC_UART0->LCR = 0x83;

usFdiv = (FPCLK / 16) / UART0_BPS;

LPC_UART0->DLM = usFdiv / 256;

LPC_UART0->DLL = usFdiv % 256;

LPC_UART0->LCR = 0x03;

LPC_UART0->FCR = 0x06;
}

发送代码:

int UART0_SendByte (int ucData)

{

while (!(LPC_UART0->LSR & 0x20)){};

return (LPC_UART0->THR = ucData);

}

我的printf的fputc(称为-已选中)

int fputc(int c, FILE *f)

{

if (c == '\
') {

UART0_SendByte('\
');

}

return (UART0_SendByte(c));

}

有什么想法吗?

致谢!


如果要将输出通过JLINK转到SWD界面,则要使用printf命令写入ETM单元。

按照http://cdn.energymicro.com/dl/an/pdf/an0043_efm32_debug_trace_capabilities.pdf的3.4节中的说明进行操作。

请始终在您的" printf"代码中检查最后一个字节是否已用完,否则输出将不正确。


您的fputc直接将字节发送到UART,该UART到达板上的RS232连接器。如果要查看fputc的输出,则需要在开发板和PC之间连接电缆,并通过超级终端之类的客户端进行查看。

谈论跟踪功能时,通常意味着适配器(在您的情况下为J-Link)在程序和调试器之间创建高吞吐量通信,并遵循程序的执行。还有其他调试功能。例如,如果您使用半主机进行编译,则程序将执行由在主机上执行它们的调试器截获的系统调用(_write_open,...)。

因此,根据我的经验,您可以调用printf,不要覆盖fputc并使用半主机进行编译,并期望在调试窗口中输出,或者发送到UART,将RS232连接到PC并查看它在超级终端上。

我看到您找到了使用跟踪功能的第三种方法。我相信半主机选项是一种更通用的解决方案,因为它也可以应用于不具有跟踪功能而仅具有JTAG(或SWD)连接的设置。