[开发工具] keil 下如何使用printf

[复制链接]
4033|24
 楼主| 问天少年 发表于 2024-5-30 11:00 | 显示全部楼层 |阅读模式
1. keil Use MicroLIB
  1. 使用微库(平台式keil-MDK)

  2. 1、点击“魔术棒” Target标签下有个Use MicroLIB---勾选。

  3. 2、包含头文件:#include "stdio.h"

  4. 3、printf重定向,修改fputc()函数的内容~

  5. int fputc(int ch, FILE *f)
  6. {
  7.         USART_SendData(DEBUG_USART, (unsigned char) ch);
  8.        
  9.         while (!(DEBUG_USART->SR & USART_FLAG_TXE));
  10.        
  11.         return (ch);
  12. }

  13. 这里的:USART_SendData(DEBUG_USART, (unsigned char) ch);

  14. while (!(DEBUG_USART->SR & USART_FLAG_TXE));

  15. 就是往串口发送一个字节的代码,修改相应的串口,初始化。

  16. 这样就能使用printf了~可以一试
2. keil Not Use MicroLIB
  1. 方法2--不使用微库(那么就要强调不使用半主机(no semihosting)模式)

  2. 1、在调用printf的文件中#include "stdio.h"

  3. 2、重写fputc,但需要先加点东西:
  4. #include "stdio.h"
  5. #pragma import(__use_no_semihosting)
  6. struct __FILE
  7. {  
  8.         int handle;
  9. };
  10. FILE __stdout;

  11. FILE __stdin;

  12. //int _sys_exit(int x)
  13. void _sys_exit(int x)
  14. {
  15.         x = x;
  16. }

  17. int fputc(int ch, FILE *f)
  18. {
  19.   /* Place your implementation of fputc here */
  20.   /* e.g. write a character to the USART */
  21.   USART_SendData(Open_USART, (uint8_t) ch);
  22.   /* Loop until the end of transmission */
  23.   while (USART_GetFlagStatus(Open_USART, USART_FLAG_TC) == RESET){}

  24.   return ch;
  25. }

  26. 这样,就完成了,同样可以使用printf语句了~
3. 自己实现 printf
  1. 可以移植一个printf .
  2. https://github.com/lisider/learn_os/tree/master/print_format/
  3. https://github.com/lisider/learn_os/blob/master/print_format/print.c
其他

  1. printf("SUD File: %s, Line: %05d: %-20s\n",__FILE__, __LINE__,__func__);
  2. /*myprintf.h*/
  3. #ifndef __MY_PRINTF_H_
  4. #define __MY_PRINTF_H_
  5.    
  6. #define __DEBUG_SU
  7. #define __SIMPLEDBG

  8. #ifdef __DEBUG_SU                                    
  9.     #ifdef __SIMPLEDBG
  10.         #define DEBUG_SU(format,...) printf(""format"\n",##__VA_ARGS__)  
  11.     #else // __SIMPLEDBG
  12.         #define DEBUG_SU(format,...) printf("File: %s, Line: %05d: %-30s"format"\n",__FILE__, __LINE__,"thread_uart", ##__VA_ARGS__)              
  13.     #endif // __SIMPLEDBG
  14. #else  // __DEBUG_SU
  15.     #define DEBUG_SU(format,...)  
  16. #endif // __DEBUG_SU

  17. #endif // __MY_PRINTF_H_




nomomy 发表于 2024-6-4 10:58 | 显示全部楼层
需要在你的源文件中包含stdio.h头文件,因为printf函数是定义在这个头文件中的。
benjaminka 发表于 2024-6-4 15:34 | 显示全部楼层
int fputc(int ch, FILE *f)
{
    /* 发送一个字节到USART1 */
    USART_SendData(USART1, (uint8_t)ch);
   
    /* 等待发送完成 */
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
   
    return ch;
}
usysm 发表于 2024-6-7 17:19 | 显示全部楼层
#include <stdio.h>
#include "stm32f4xx_hal.h" // 替换为你的STM32型号对应的头文件

int fputc(int ch, FILE *f) {
    /* 这里假设你已经初始化了USART1 */
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
    return ch;
}
olivem55arlowe 发表于 2024-6-7 21:24 | 显示全部楼层
在Keil的项目设置中,你需要确保已经选中了正确的C库。这通常是在“Target”或“Options for Target”下的“Link”页中设置的。你应该选择一个包含了printf函数的库,例如Microsoft C/C++ Runtime Library。
tifmill 发表于 2024-6-8 17:11 | 显示全部楼层
如果不使用MicroLIB,需要手动实现一些底层I/O功能,并确保没有使用半主机(no semihosting)模式。这通常涉及重写fputc函数,该函数负责实际的数据输出。
wangdezhi 发表于 2024-6-8 20:48 | 显示全部楼层
在Keil的IDE中,你可以通过以下步骤来配置调试工具以显示printf的输出:

打开Keil的工程。
进入“Options for Target”对话框,通常可以通过点击工具栏上的魔术棒图标或者选择“Project”菜单下的“Options for Target <target name>”来访问。
在弹出的对话框中,选择“Debug”标签页。
在“Settings”区域,选择“Port”或“UART”选项卡(取决于你的调试硬件)。
配置相应的串口参数,如波特率、数据位、停止位和校验位,以匹配你的硬件设置。
保存设置并关闭对话框。
minzisc 发表于 2024-6-9 15:12 | 显示全部楼层
printf函数默认尝试将输出发送到标准输出设备,但在嵌入式环境中,这通常需要被重定向到串口。你需要提供一个自定义的fputc函数来实现这一重定向。这个函数会被printf内部调用来输出每一个字符。
pmp 发表于 2024-6-9 19:31 | 显示全部楼层
在任何使用printf的C文件中,首先需要包含stdio.h头文件,这是使用printf函数的基本前提。
mnynt121 发表于 2024-6-10 16:01 | 显示全部楼层
在使用printf之前,必须对使用的串口进行初始化设置,包括配置波特率、数据位、停止位等。
jtracy3 发表于 2024-6-10 19:13 | 显示全部楼层
Keil MDK的默认printf实现并不直接支持输出到串口。你需要自己实现一个fputc函数来重定向printf的输出。这通常是通过覆盖_sys_write或fputc函数来实现的。
gouguoccc 发表于 2024-6-10 23:02 来自手机 | 显示全部楼层
重新映射putc函数,或者自己使用格式化字符串函数sprintf来实现。
kkzz 发表于 2024-6-11 13:19 | 显示全部楼层
使用MicroLIB:在Keil中,可以通过勾选"Use MicroLIB"选项来简化printf的使用。MicroLIB是Keil为小型嵌入式系统提供的一个轻量级标准库,它包括了必要的I/O函数,如printf。
ingramward 发表于 2024-6-12 11:12 | 显示全部楼层
printf是C语言标准库中的一个函数,用于在控制台输出格式化的字符串。
tabmone 发表于 2024-6-12 20:15 | 显示全部楼层
一是重定向printf函数的输出到串口,二是配置Keil的调试工具以显示输出信息。
qiufengsd 发表于 2024-6-14 16:01 | 显示全部楼层
在使用printf之前,需要包含相应的头文件。在源代码文件的开头添加以下代码:

#include<stdio.h>
everyrobin 发表于 2024-6-15 15:18 | 显示全部楼层
Keil MDK的默认printf实现并不直接支持输出到串口。你需要自己实现一个fputc函数来重定向printf的输出。这通常是通过覆盖_sys_write或fputc函数来实现的。
alvpeg 发表于 2024-6-15 20:37 | 显示全部楼层
在Keil中,通常使用的是Microsoft的C库,而不是Newlib或者GNU C库,后者在其他一些ARM开发环境中使用。
EmmaTT 发表于 2024-6-18 21:38 | 显示全部楼层
包含stdio之后直接用sprintf构建字符串也行
youtome 发表于 2024-6-19 19:19 | 显示全部楼层
在Keil中,默认情况下printf可能不会直接工作,因为它不知道如何将输出发送到目标硬件(如调试器或目标板上的UART)。因此,通常的做法是像上面那样使用debug_printf,或者根据你的硬件配置自己编写相关的输出函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

564

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部