我有基于LPC 1768的板-LandTiger(值得检查底部的手册)。我使用Keil uVision 4/72 Lite和Segger的J-Link EDU进行编程。我的简单程序与操纵杆和二极管的互动工作正常,但...
我正在尝试实现debug printf,所以我可以在Keil**“Debug(printf)Viewer”窗口中看到printf输出。问题是我没有看到任何输出-我想我走对了路,因为当我运行调试器时,我可以在窗口底部看到跟踪:正在运行**(之前是跟踪:无同步)。不幸的是,我没有看到任何在UART和调试输出窗口。
我已经花了相当多的时间试图使它的工作,并会感激任何帮助,谢谢你;)
我的Keil设置为:
Project/Options for Target/Debug设置为J-Link/J-Trace Cortex。
然后在它的设置中,我选择了SEGGER,并使用端口:SW和最大时钟:10 MHz。
跟踪选项卡启用100 Mhz核心时钟和SWO预分频器= 17(导致5.882352MHz SWO时钟)。
ITM刺激端口设置为启用:0xFFFFFFFF和权限:0x 0000000 F
下面是我的代码的一部分:
定义FOSC 12000000
定义FCCLK(FOSC * 8)
定义FCCO(FCCLK * 3)
定义FPCLK(FCCLK / 4)
定义UART0_BPS 115200
void UART0_Init(void)
{
uint16_t usFdiv;
/* UART0 /
LPC_PINCON->PINSEL0| =(1 << 4);/ 引脚P0.2用作TXD 0(Com 0)/
LPC_PINCON->PINSEL0| =(1 << 6);/ 引脚P0.3用作RXD 0(Com 0)*/
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);
}
和我的fputc为printf(它被称为- checked)
int fputc(int c,FILE *f)
{
if(c == '\n'){
UART0_SendByte(“\r”);
}
return(UART0_SendByte(c));
}
有什么想法吗
问候!
2条答案
按热度按时间5lhxktic1#
您的
fputc
将字节直接发送到UART,UART将连接到板上的RS232连接器。如果你想看到fputc
的输出,你需要在主板和PC之间连接一根电缆,然后用客户端(如超级终端)来查看它。当您谈论跟踪功能时,通常意味着适配器(在您的情况下是J-Link)在程序和调试器之间创建高吞吐量通信,并跟踪程序的执行。还有其他调试功能。例如,如果使用半宿主编译,则程序执行系统调用(
_write
,_open
,...),这些调用被在主机上执行它们的调试器拦截。因此,根据我的经验,要么你调用
printf
,不要覆盖fputc
并使用semihosting编译,并期望在调试窗口上输出,要么你发送到UART,将RS232连接到PC并在超级终端上看到它。我看到你找到了第三种方法,它使用了跟踪功能。我相信半托管选项是一个更通用的解决方案,因为它也可以应用于没有跟踪功能但只有JTAG(或SWD)连接的设置。
brgchamk2#
如果希望输出通过JLINK到达SWD接口,则需要使用printf命令写入ETM单元格。
按照http://cdn.energymicro.com/dl/an/pdf/an0043_efm32_debug_trace_capabilities.pdf第3.4节中的说明进行操作。
总是检查你的“printf”代码,最后一个字节已经出去了,否则输出将不正确。