[英]Print floating point number using printf() at ARM Cortex M0 uart console
[英]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的输出。 问题是我看不到任何输出-我认为我走在正确的轨道上,因为当我运行调试器时,我可以在窗口底部看到Trace:Running (之前是Trace:No Synchronization )。 不幸的是,我在UART和调试输出窗口中看不到任何东西。
我花了很多时间尝试使其工作,感谢您的帮助,谢谢;)
我的Keil设置是:
目标/调试的项目/选项设置为J-Link / J-Trace Cortex 。
然后在它的设置中,我选择了SEGGER和Port:SW和MAX CLOCK:10 MHz 。
“跟踪”选项卡在100Mhz 核心时钟和SWO预分频器= 17的情况下启用(其结果为5.882352MHz SWO Clock )。
ITM刺激端口设置为Enable:0xFFFFFFFF和Privilege: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;
}
发送代码:
整数UART0_SendByte(int ucData)
{
while(!(LPC_UART0-> LSR&0x20)){};
返回(LPC_UART0-> THR = ucData);
}
而我的printf的fputc(称为-已选中)
int fputc(int c,文件* f)
{
如果(c =='\\ n'){
UART0_SendByte('\\ r');
}
返回(UART0_SendByte(c));
}
有任何想法吗?
问候!
您的fputc
将字节直接发送到UART,该UART到达板上的RS232连接器。 如果要查看fputc
的输出,则需要在开发板与PC之间连接电缆,并通过超级终端等客户端进行查看。
当谈到跟踪功能时,通常意味着适配器(在您的情况下为J-Link)在程序和调试器之间创建高吞吐量通信,并遵循程序的执行。 还有其他调试功能。 例如,如果使用半主机进行编译,则程序将执行系统调用( _write
, _open
,...),调试器会在主机上执行这些系统调用。
因此,以我的经验,您可以调用printf
,不要重写fputc
并使用半主机进行编译,并希望在调试窗口中看到输出,或者发送到UART,将RS232连接到PC并在超级终端上查看它。
我看到您找到了使用跟踪功能的第三种方法。 我相信半主机选项是一种更通用的解决方案,因为它也可以应用于不具有跟踪功能而仅具有JTAG(或SWD)连接的设置。
如果希望输出通过JLINK进入SWD接口,则要使用printf命令写入ETM单元。
请遵循http://cdn.energymicro.com/dl/an/pdf/an0043_efm32_debug_trace_capabilities.pdf的 3.4节中的说明。
始终在“ printf”代码中检查最后一个字节是否已耗尽,否则输出将不正确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.