printf函数一般是打印到终端的,stm32芯片调试中经常需要用到串口来打印调试信息,那能不能用串口实现类似windows的Console中的printf呢?

答案是肯定的,那就是printf函数的重定向。

使用KEIL5对stm32的printf函数进行重定向,有两种方法:一种是使用微库,另一种是不使用微库。

方法1--使用微库:

1、使用微库,在KEIL5中点击options for target,在Target标签下有个Use MicroLIB---勾选,使用微库。

2、在串口文件中添加如下代码:

#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

修改相应的串口号,初始化,就能使用printf了。

方法2--不使用微库(那么就要强调不使用半主机(no semihosting)模式)

1、不使用微库(平台式keil-MDK),点击options for target,在Target标签下有个Use MicroLIB---取消勾选,不使用微库。

2、在串口文件中添加如下代码:

#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 //加入以下代码,支持printf函数,而不需要选择use MicroLIB
#pragma import(__use_no_semihosting)
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
} void _ttywrch(int x)
{
x = x;
} //标准库需要的支持函数
struct __FILE
{
int handle;
}; FILE __stdout; //重定义fputc函数
PUTCHAR_PROTOTYPE
{
while((USART2->SR & 0X40) == 0);//循环发送,知道发送完毕
USART2->DR = (u8)ch;
return ch;
} #ifdef __cplusplus
}
#endif //__cplusplus

当然,头文件#include "stdio.h"别忘了加上。同样的,修改相应的串口号,初始化,就能使用printf了。

如果编译的时候出现FILE __stdout;编译不过,可以打开stdio.h文件,将typedef struct __FILE FILE; 

修改为

typedef struct __FILE
{ }FILE;

即可。

关于STM32中printf函数的重定向问题的更多相关文章

  1. 如果简化stm32中printf函数的使用——首先重定向

    STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印.(HAL库例程)https://blog.csdn.net/wu10188/article/details/9 ...

  2. STM32 的 printf() 函数串口重定向(HAL库标准库都适用)

    1.建立工程 2.核心:添加新文件usar_fputc.c (名字随便自己命名),把文件添加到项目中去 #include "stdio.h" #include "stm3 ...

  3. 单片机中printf函数的重映射

    单片机中printf函数的重映射 一.源自于:大侠有话说 1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功能 除了打印你想要的字符到屏幕上外,还能把数字进行格式化 ...

  4. MDK中STM32使用Printf函数详细解析【转载】

    在用MDK调试STM32板子串口时,为了方便串口调试,调用了printf()函数,用Keil仿真是,串口不能正确的输出,软件仿真时,总是卡在那 里.有点纳闷,然后调用USART_SendData()函 ...

  5. STM32中printf重定向到串口

    学习STM32过程中,经常打交道的莫过于串口,你可以将任何信息,当然重要的是调试信息打印到串口中输出,总是用一个字节发送函数或者字符串发送函数 总是有些不放便,之前编程中熟悉的莫过于printf了,下 ...

  6. C中printf函数的用法总结

    函数语法 stdio.h文件中的定义: /* Write formatted output to stdout. */ int printf (const char *__restrict __for ...

  7. 在keil中使用printf()函数的要点

    在keil中printf默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化串口,否则可能引起死机的情况,并且在printf之前应该先将TI置位,摘抄原因如下: 1.printf函数是调用pu ...

  8. STM32使用printf丢失第一个字母的问题

    STM32使用printf函数给串口打印信息的执行步骤为: 1.重定向printf函数 给uart.c文件中增加如下函数: //重定向c库函数printf到USART1 int fputc(int c ...

  9. printf 函数的实现原理

    /* * ===================================================================================== * * Filen ...

随机推荐

  1. c++ STL之unordered_set

    unordered_set的特点: 自身值就是主键,所以值唯一并且不可修改 基于hash表的无序排列 unordered_set基于哈希表,是无序的. 在一个 unordered_set 容器中,元素 ...

  2. MySQL 对 IP 字段的排序问题

    MySQL 对 IP 字段的排序问题 问题描述 想对一张带有 IP 字段的表,对 IP 字段进行升序排序,方便查看每个段的 IP 信息. 表结构和表数据如下: SET NAMES utf8mb4; ; ...

  3. Redis 几个类型常用命令

    Redis 字符串(String) 下表列出了常用的 redis 字符串命令: 序号 命令及描述1 SET key value 设置指定 key 的值2 GET key 获取指定 key 的值.3 G ...

  4. json字符串转map、json数组演示

    公司项目用的IBM封装的json解析,此处采用阿里的fastjson进行演示,代码如下: package com.alphajuns.test; import com.alibaba.fastjson ...

  5. 如何从项目中移除CocoaPods

    一.项目Show in Finder: 删除本地文件(Podfile.Podfile.lock.Pods文件夹) 删除本地生成的xcworkspace文件 打开项目,在Frameworks文件夹下,删 ...

  6. .net分流抢票助手

    官方网站: http://www.12306bypass.com/作者:Cheney.小风分流抢票基于.Net4.0框架开发,在Windows7之后的操作系统可直接打开.其他操作系统如打不开或者打开报 ...

  7. python的I/O编程:文件打开、操作文件和目录、序列化操作

    1 文件读写 1.1 打开文件: open(r'D:\text.txt') 1.2 文件模式 值 功能描述 'r' 读模式 'w' 写模式 'a' 追加模式 'b' 二进制模式 '+' 读写模式 1. ...

  8. 0-1 RSS订阅

    RSS订阅 RSS是什么 中文维基百科对RSS的介绍 w3school对RSS的介绍 少数派的RSS介绍 RSS阅读器 Feedly:注册使用即可,一个账号可以订阅200个RSS源,完全足够日常需要 ...

  9. 【学习笔记】使用python将最新的测试报告以附件的形式发到指定邮箱

    import smtplib, email, os, timefrom email.mime.multipart import MIMEMultipartfrom email.mime.text im ...

  10. 流程控制,循环结构,for,while循环

    '''1.变量名命名规范 -- 1.只能由数字.字母 及 _ 组成 -- 2.不能以数字开头 -- 3.不能与系统关键字重名 -- 4._开头有特殊含义 -- 5.__开头__结尾的变量,魔法变量 - ...