2

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

我正在尝试实现调试 printf,因此我可以在 Keil “调试(printf)查看器”窗口中看到 printf 输出。问题是我没有看到任何输出 - 我认为我在正确的轨道上,因为当我运行调试器时,我可以在窗口底部看到Trace:Running (在它之前是Trace:No Synchronization)。不幸的是,我在 UART 和调试输出窗口中看不到任何东西。

我花了很多时间试图让它工作,并感谢任何帮助,谢谢;)

我的 Keil 设置是:

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

然后在它的设置里面,我用Port:SWMAX CLOCK:10 MHz选择了SEGGER

Trace 选项卡通过100Mhz Core ClockSWO Prescaler = 17启用(这导致5.882352MHz SWO Clock)。

ITM 刺激端口设置为Enable:0xFFFFFFFFPrivilege:0x0000000F

以下是我的部分代码:

定义 FOSC 12000000

定义 FCCLK (FOSC * 8)

定义 FCCO (FCCLK * 3)

定义 FPCLK (FCCLK / 4)

定义 UART0_BPS 115200

无效 UART0_Init (无效)

{

uint16_t usFdiv;

/* UART0 */

LPC_PINCON->PINSEL0 |= (1 << 4);/* 引脚 P0.2 用作 TXD0 (Com0) */

LPC_PINCON->PINSEL0 |= (1 << 6);/* 引脚 P0.3 用作 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)

{

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

返回(LPC_UART0->THR = ucData);

}

还有我用于 printf 的 fputc(它被称为 - 检查)

int fputc(int c, 文件 *f)

{

如果 (c == '\n') {

UART0_SendByte('\r');

}

返回(UART0_SendByte(c));

}

有任何想法吗?

问候!

4

2 回答 2

0

fputc将字节直接发送到 UART,然后发送到板上的 RS232 连接器。如果你想看到你的输出fputc,你需要在板子和PC之间连接一根电缆,然后用超级终端等客户端查看它。

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

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

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

于 2013-09-06T18:06:53.270 回答
0

如果您希望输出通过 JLINK 进入 SWD 接口,您希望使用 printf 命令写入 ETM 单元。

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

始终检查您的“printf”代码是否最后一个字节已输出,否则输出将不正确。

于 2014-04-01T20:42:21.657 回答