STM32 printf重定向

摘要:
在STM32串行通信程序中使用printf发送数据非常方便。到目前为止,配置已完成。您可以使用printf在项目中随意将数据发送到串行端口。)//USART1可由程序USART1-˃DR=中的串行通信端口替换;return;}IntGetKey{while(!);return;}这将完成配置。您可以在主文件中自由使用printf。

STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK)

 

在STM32串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。

 

下面就说一下使用printf需要做哪些配置。

 

有两种配置方法:

一、对工程属性进行配置,详细步骤如下

1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。

2、在main文件中重定义<fputc>函数    如下:

   // 发送数据

   int fputc(int ch, FILE *f)

   {

      USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等

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

      return (ch);

   }

   // 接收数据

   int GetKey (void)  { 

      while (!(USART1->SR & USART_FLAG_RXNE));

      return ((int)(USART1->DR & 0x1FF));

   }

   这样在使用printf时就会调用自定义的fputc函数,来发送字符。

3、在工程属性的 “Target" -> "Code Generation" 选项中勾选 "Use MicroLIB"” 

   MicroLIB 是缺省C的备份库,关于它可以到网上查找详细资料。

 

至此完成配置,在工程中可以随意使用printf向串口发送数据了。

 

二、第二种方法是在工程中添加“Regtarge.c”文件

1、在main文件中包含 “stdio.h” 文件

2、在工程中创建一个文件保存为 Regtarge.c , 然后将其添加工程中

在文件中输入如下内容(直接复制即可)

#include <stdio.h>

#include <rt_misc.h>

#pragma import(__use_no_semihosting_swi)

extern int  SendChar(int ch); // 声明外部函数,在main文件中定义

extern int  GetKey(void);

struct __FILE {

  int handle;                 // Add whatever you need here 

};

FILE __stdout;

FILE __stdin;

int fputc(int ch, FILE *f) {

  return (SendChar(ch));

}

int fgetc(FILE *f) {

  return (SendChar(GetKey()));

}

void _ttywrch(int ch) {

 SendChar (ch);

}

int ferror(FILE *f) {                            // Your implementation of ferror

  return EOF;

}

void _sys_exit(int return_code) {

label:  goto label;           // endless loop

}

 

3、在main文件中添加定义以下两个函数

int SendChar (int ch)  {

  while (!(USART1->SR & USART_FLAG_TXE)); // USART1 可换成你程序中通信的串口

  USART1->DR = (ch & 0x1FF);

  return (ch);

}

int GetKey (void)  {

  while (!(USART1->SR & USART_FLAG_RXNE));

  return ((int)(USART1->DR & 0x1FF));

}

至此完成配置,可以在main文件中随意使用 printf 。

免责声明:文章转载自《STM32 printf重定向》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇嵌入式Web服务器BOA移植linux top 命令下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue 权限管理怎么做

前言 在一个项目中,一些功能会涉及到重要的数据管理,为了确保数据的安全,我们会在项目中加入权限来限制每个用户的操作。作为前端,我们要做的是配合后端给到的权限数据,做页面上的各种各样的限制。 需求 因为这是一个工作上的业务需求,所以对于我来说主要有两个地方需要进行权限控制。 第一个是侧边菜单栏,需要控制显示与隐藏。 第二个就是页面内的各个按钮,弹窗等。 流程...

STM32 无法通过 %f 打印浮点数

一、问题 使用 IAR 开发 STM32,发现无法通过 printf 重定向到串口打印出浮点数。代码如下: 输出结果如下: 可见,浮点数部分无法正常显示。 二、解决方法 这是由于 IAR 默认选择的 printf 库不支持浮点数的的输出。可在设置选项中修改。如下:默认使用 small,改为 auto 即可。 三、备注 在不修改设置的情况下,尝试过如...

Linux shell之打印输出

经常需要和shell命令打交道,但是一直没有系统的学习,接下来会花1到2个月的时间系统的学习一下shell命令,接下来就开启shell命令的奇妙旅行吧。本章主要介绍shell的打印输出。 知识要点 shell脚本都是以#!/bin/bash开头;这是固定的写法,其中/bin/bash是bash命令的路径。 一般都会通过chmod授予shell脚本的可执行...

循环结构实验

第五章 循环结构实验   C程序设计实验报告 实验项目: 1、用for语句实现循环 2、用while循环语句实现循环 3、用do_while语句实现循环 4、用while语句和for语句配合实现循环 5、用for语句嵌套实现循环 姓名:陈建清实验地点:教学楼514教室  实验时间:2019.4.17 一、实验目的与要求 1、用for语句实现循环 目的:掌...

linux网路编程:字节序(大端、小端、网络、主机)

字节序:就是数据在内存中的存放顺序,也可称之为端模式。 大端模式和小端模式的定义 1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。 3) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/...

printf()函数不能直接输出string类型

因为string不是c语言的内置数据,所以直接printf输出string类型的是办不到的。 要这样输出: printf("%s ",a.c_str()); 举例: #include<bits/stdc++.h> using namespacestd; intmain(){ string a="人生"; printf("%s "...