打印
[开发工具]

keil 下如何使用printf

[复制链接]
1820|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
问天少年|  楼主 | 2024-5-30 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. keil Use MicroLIB
使用微库(平台式keil-MDK)

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

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

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

int fputc(int ch, FILE *f)
{
        USART_SendData(DEBUG_USART, (unsigned char) ch);
       
        while (!(DEBUG_USART->SR & USART_FLAG_TXE));
       
        return (ch);
}

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

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

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

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

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

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

FILE __stdin;

//int _sys_exit(int x)
void _sys_exit(int x)
{
        x = x;
}

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

  return ch;
}

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

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

#ifdef __DEBUG_SU                                    
    #ifdef __SIMPLEDBG
        #define DEBUG_SU(format,...) printf(""format"\n",##__VA_ARGS__)  
    #else // __SIMPLEDBG
        #define DEBUG_SU(format,...) printf("File: %s, Line: %05d: %-30s"format"\n",__FILE__, __LINE__,"thread_uart", ##__VA_ARGS__)              
    #endif // __SIMPLEDBG
#else  // __DEBUG_SU
    #define DEBUG_SU(format,...)  
#endif // __DEBUG_SU

#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;
}

使用特权

评论回复
5
olivem55arlowe| | 2024-6-7 21:24 | 只看该作者
在Keil的项目设置中,你需要确保已经选中了正确的C库。这通常是在“Target”或“Options for Target”下的“Link”页中设置的。你应该选择一个包含了printf函数的库,例如Microsoft C/C++ Runtime Library。

使用特权

评论回复
6
tifmill| | 2024-6-8 17:11 | 只看该作者
如果不使用MicroLIB,需要手动实现一些底层I/O功能,并确保没有使用半主机(no semihosting)模式。这通常涉及重写fputc函数,该函数负责实际的数据输出。

使用特权

评论回复
7
wangdezhi| | 2024-6-8 20:48 | 只看该作者
在Keil的IDE中,你可以通过以下步骤来配置调试工具以显示printf的输出:

打开Keil的工程。
进入“Options for Target”对话框,通常可以通过点击工具栏上的魔术棒图标或者选择“Project”菜单下的“Options for Target <target name>”来访问。
在弹出的对话框中,选择“Debug”标签页。
在“Settings”区域,选择“Port”或“UART”选项卡(取决于你的调试硬件)。
配置相应的串口参数,如波特率、数据位、停止位和校验位,以匹配你的硬件设置。
保存设置并关闭对话框。

使用特权

评论回复
8
minzisc| | 2024-6-9 15:12 | 只看该作者
printf函数默认尝试将输出发送到标准输出设备,但在嵌入式环境中,这通常需要被重定向到串口。你需要提供一个自定义的fputc函数来实现这一重定向。这个函数会被printf内部调用来输出每一个字符。

使用特权

评论回复
9
pmp| | 2024-6-9 19:31 | 只看该作者
在任何使用printf的C文件中,首先需要包含stdio.h头文件,这是使用printf函数的基本前提。

使用特权

评论回复
10
mnynt121| | 2024-6-10 16:01 | 只看该作者
在使用printf之前,必须对使用的串口进行初始化设置,包括配置波特率、数据位、停止位等。

使用特权

评论回复
11
jtracy3| | 2024-6-10 19:13 | 只看该作者
Keil MDK的默认printf实现并不直接支持输出到串口。你需要自己实现一个fputc函数来重定向printf的输出。这通常是通过覆盖_sys_write或fputc函数来实现的。

使用特权

评论回复
12
gouguoccc| | 2024-6-10 23:02 | 只看该作者
重新映射putc函数,或者自己使用格式化字符串函数sprintf来实现。

使用特权

评论回复
13
kkzz| | 2024-6-11 13:19 | 只看该作者
使用MicroLIB:在Keil中,可以通过勾选"Use MicroLIB"选项来简化printf的使用。MicroLIB是Keil为小型嵌入式系统提供的一个轻量级标准库,它包括了必要的I/O函数,如printf。

使用特权

评论回复
14
ingramward| | 2024-6-12 11:12 | 只看该作者
printf是C语言标准库中的一个函数,用于在控制台输出格式化的字符串。

使用特权

评论回复
15
tabmone| | 2024-6-12 20:15 | 只看该作者
一是重定向printf函数的输出到串口,二是配置Keil的调试工具以显示输出信息。

使用特权

评论回复
16
qiufengsd| | 2024-6-14 16:01 | 只看该作者
在使用printf之前,需要包含相应的头文件。在源代码文件的开头添加以下代码:

#include<stdio.h>

使用特权

评论回复
17
everyrobin| | 2024-6-15 15:18 | 只看该作者
Keil MDK的默认printf实现并不直接支持输出到串口。你需要自己实现一个fputc函数来重定向printf的输出。这通常是通过覆盖_sys_write或fputc函数来实现的。

使用特权

评论回复
18
alvpeg| | 2024-6-15 20:37 | 只看该作者
在Keil中,通常使用的是Microsoft的C库,而不是Newlib或者GNU C库,后者在其他一些ARM开发环境中使用。

使用特权

评论回复
19
EmmaTT| | 2024-6-18 21:38 | 只看该作者
包含stdio之后直接用sprintf构建字符串也行

使用特权

评论回复
20
youtome| | 2024-6-19 19:19 | 只看该作者
在Keil中,默认情况下printf可能不会直接工作,因为它不知道如何将输出发送到目标硬件(如调试器或目标板上的UART)。因此,通常的做法是像上面那样使用debug_printf,或者根据你的硬件配置自己编写相关的输出函数。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

532

帖子

1

粉丝