两种方法,一个使用微库,另一个不使用微库。

使用微库

  1. 使用微库,在KEIL5中点击options for target,在Target标签下有个Use MicroLIB—-勾选,使用微库。
  2. 在串口文件中添加如下代码 ```c

    include “stdio.h”

    ifdef GNUC

    define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

    else

    define PUTCHAR_PROTOTYPE int fputc(int ch, FILE* f)

    endif / GNUC /

ifdef __cplusplus

extern “C” {

endif //__cplusplus

PUTCHAR_PROTOTYPE { while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); USART_SendData(USART2, (uint8_t)ch); return (ch); }

ifdef __cplusplus

}

endif //__cplusplus

  1. 修改相应的串口号,初始化,就能使用printf了。
  2. <a name="header-3427-1934"></a>
  3. # 不使用微库
  4. 1. 不使用微库(平台式keil-MDK),点击options for target,在Target标签下有个Use MicroLIB---取消勾选,不使用微库。
  5. 2. 在串口文件中添加如下代码:
  6. ```c
  7. #ifdef __GNUC__
  8. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  9. #else
  10. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE* f)
  11. #endif /* __GNUC__ */
  12. #ifdef __cplusplus
  13. extern "C" {
  14. #endif
  15. //加入以下代码,支持printf函数,而不需要选择use MicroLIB
  16. #pragma import(__use_no_semihosting)
  17. //定义_sys_exit()以避免使用半主机模式
  18. void _sys_exit(int x)
  19. {
  20. x = x;
  21. }
  22. void _ttywrch(int x)
  23. {
  24. x = x;
  25. }
  26. //标准库需要的支持函数
  27. struct __FILE
  28. {
  29. int handle;
  30. };
  31. FILE __stdout;
  32. //重定义fputc函数
  33. PUTCHAR_PROTOTYPE
  34. {
  35. while((USART2->SR & 0X40) == 0);//循环发送,知道发送完毕
  36. USART2->DR = (u8)ch;
  37. return ch;
  38. }
  39. #ifdef __cplusplus
  40. }
  41. #endif //__cplusplus

当然,头文件#include “stdio.h”别忘了加上。
同样的,修改相应的串口号,初始化,就能使用printf了。
如果编译的时候出现FILE stdout;编译不过,可以打开stdio.h文件,将typedef struct FILE FILE; 修改为以下代码。

  1. typedef struct __FILE
  2. {
  3. }FILE;