printf()是C语言中的一个标准输出函数,原形在stdio.h中。在一般屏幕输出时,printf()是一个非常好用的函数,但在嵌入式系统中,需要使用retarget重新定向到输出的串口完成特定字符和字符串的输出。这在Keil中不是问题,在EmBITZ中使用就碰到问题了,作者就为这个问题浪费了前后一个月的时间,包括查阅大量emIDE官方网站和EmBITZ网站。EmBITZ网站中提到了这个问题,说可能是EmBITZ 1.0和1.I中使用的5.4版本的GCC的原因,有人在编译STM32程序时碰到了这个问题,求助后也解决了,但没有给出最终的解决方案。结合作者实验,现在给出一个采用寄存器方式的解决方案。
新唐官方的Register-Direct-Access例程中需要使用串口的场合都提供了一个retarget.c重定向函数,这个函数中在Keil中使用是没有任何问题的。但在EmBITZ和emIDE可以编译通过,但在芯片中是无法运行的。解决这个问题的方法是就是,使用emIDE提供的syscall.c函数替换retarget.c函数,syscall.c函数位于emIDE下的\arm\Templates\Start_CortexM\Src目录中,把这个函数导入你的EmBITZ项目文件中(位于项目文件的Src目录),其余不需要做任何修改,就可看到数据从UART0输出了。
不直接调用syscall函数的另一个解决方法就是,修改UART.h和UART.c函数。在UART.h中增加一个字符串输出函数声明:
void Send_String_To_PC (char *s); //add in 20161109 to prevent use of printf
在UART.c中增加一个实现函数(位于Send_Data_To_PC函数下面):
void Send_String_To_PC (char *s)
{
while (*s)
{
Send_Data_To_PC(*s); //反复调用字符输出函数输出字符串
s++;
}
}
然后,就可以在main.c主函数中使用printf()函数或Send_String_To_PC ()函数实现字符串的输出了。祝好运。 |