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"代码中检查最后一个字节是否已用完,否则输出将不正确。
您的
谈论跟踪功能时,通常意味着适配器(在您的情况下为J-Link)在程序和调试器之间创建高吞吐量通信,并遵循程序的执行。还有其他调试功能。例如,如果您使用半主机进行编译,则程序将执行由在主机上执行它们的调试器截获的系统调用(
因此,根据我的经验,您可以调用
我看到您找到了使用跟踪功能的第三种方法。我相信半主机选项是一种更通用的解决方案,因为它也可以应用于不具有跟踪功能而仅具有JTAG(或SWD)连接的设置。