一、printf重定向简介

  我们知道C语言中printf函数默认输出设备是显示器,如果要实现在 串口或者LCD上显示,必须重定义标准库函数里调用的与输出设备相关的函数。比如使用printf输出到串口,需要将fputc里面的输出指向串口, 这一过程就叫重定向。 那么如何让STM32使用printf函数呢?

int fputc(int ch,FILE *p) //函数默认的,在使用printf函数时自动调用

{

  USART_SendData(USART1,(u8)ch);

  while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

  return ch;

}

二、printf函数格式

printf("<格式化字符串>", <参量表>);

//.h文件
1 #ifndef __usart_H
2 #define __usart_H
3
4 #include "system.h"
5 #include "stdio.h"
6
7 void USART1_Init(u32 bound);
8
9
10 #endif

//.c文件
 1 #include "usart.h"
2
3 int fputc(int ch,FILE *p) //函数默认的,在使用printf函数时自动调用
4 {
5 USART_SendData(USART1,(u8)ch);
6 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
7 return ch;
8 }
9
10 /*******************************************************************************
11 * 函 数 名 : USART1_Init
12 * 函数功能 : USART1初始化函数
13 * 输 入 : bound:波特率
14 * 输 出 : 无
15 *******************************************************************************/
16 void USART1_Init(u32 bound)
17 {
18 //GPIO端口设置
19 GPIO_InitTypeDef GPIO_InitStructure;
20 USART_InitTypeDef USART_InitStructure;
21 NVIC_InitTypeDef NVIC_InitStructure;
22
23 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
24 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
25 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //打开时钟
26
27
28 /* 配置GPIO的模式和IO口 */
29 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX //串口输出PA9
30 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
31 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出
32 GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化串口输入IO */
33 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX //串口输入PA10
34 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //模拟输入
35 GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化GPIO */
36
37
38 //USART1 初始化设置
39 USART_InitStructure.USART_BaudRate = bound;//波特率设置
40 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
41 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
42 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
43 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
44 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
45 USART_Init(USART1, &USART_InitStructure); //初始化串口1
46
47 USART_Cmd(USART1, ENABLE); //使能串口1
48
49 USART_ClearFlag(USART1, USART_FLAG_TC);
50
51 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断
52
53 //Usart1 NVIC 配置
54 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
55 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
56 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3
57 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
58 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、
59 }
60
61 /*******************************************************************************
62 * 函 数 名 : USART1_IRQHandler
63 * 函数功能 : USART1中断函数
64 * 输 入 : 无
65 * 输 出 : 无
66 *******************************************************************************/
67 void USART1_IRQHandler(void) //串口1中断服务程序
68 {
69 u8 r;
70 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
71 {
72 r =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
73 USART_SendData(USART1,r);
74 while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
75 }
76 USART_ClearFlag(USART1,USART_FLAG_TC);
77 }
 // main文件
1 #include "system.h"
2 #include "SysTick.h"
3 #include "led.h"
4 #include "usart.h"
5
6
7 /*******************************************************************************
8 * 函 数 名 : main
9 * 函数功能 : 主函数
10 * 输 入 : 无
11 * 输 出 : 无
12 *******************************************************************************/
13 int main()
14 {
15 u8 i=0;
16 u16 data=1234;
17 float fdata=12.34;
18 char str[]="Hello World!";
19 SysTick_Init(72);
20 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组
21 LED_Init();
22 USART1_Init(9600);
23
24 while(1)
25 {
26 i++;
27 if(i%20==0)
28 {
29 led1=!led1;
30
31 printf("输出整型数data=%d\r\n",data);
32 printf("输出浮点型数fdata=%0.2f\r\n",fdata);
33 printf("输出十六进制数data=%X\r\n",data);
34 printf("输出八进制数data=%o\r\n",data);
35 printf("输出字符串str=%s\r\n",str);
36
37 }
38 delay_ms(10);
39 }
40 }

(stm32f103学习总结)—printf重定向的更多相关文章

  1. stm32中如何进行printf重定向用于串口调试输出

    1 在main中包含stdio.h 文件 2 Target选项框里选Use MicroLib 选项 3 在main中添加UART1_Configuration()初始化的代码 Uart1初始化,voi ...

  2. Java SE学习之printf 日期转换符

    本文是学习网络上的文章时的总结,感谢大家无私的分享. System.out.printf()方法能够对日期做处理输出. 相应列表 转换符 类型 举例 c 完整的日期和时间 Mon Feb 09 18: ...

  3. 笔记:stm32 printf重定向到UART疑点解析

    在调试过程中往往需要通过打印来看系统运行状态:在STM32平台上,打印重定向有多种实现方案:其一是编译时使用keil自带的MacroLIB,据说这个库对一些C语言基础设施做了新的实现,代码结构更加紧凑 ...

  4. 批处理学习笔记6 - 重定向符>和>>

    重定向符大概有6,7种,和%符号差不多各有各的用途.这里学习>和>> >  是左边的值把右边的值覆盖 >> 是左边的值添加在右边的值上面 rem 是批处理的注释,类 ...

  5. STM32中printf重定向到串口

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

  6. stm32 printf重定向

    printf函数调用fputc int fputc(int ch, FILE *p) { USART_SendData(USART1, ch); //重定向到串口 while(USART_GetFla ...

  7. STM32F103学习进程

    软硬件下载程序和程序运行的相关问题和解决方案,以我自身买的STM32F103C8T6为例 (1) 硬件需要 1. 购买一个STM32F103XXX的板子.这是一个操作实践性非常强的一个学习过程,如果没 ...

  8. (stm32f103学习总结)—GPIO结构

    一.GPIO基本结构 二.GPIO工作模式 输入模式 输入浮空 输入上拉 输入下拉 模拟输入 输出模式 开漏输出 开漏复用功能 推挽式输出 推挽式复用功能 库函数中所对应的代码 1 typedef e ...

  9. (stm32f103学习总结)—输入捕获模式

    一.输入捕获介绍 在定时器中断实验章节中我们介绍了通用定时器具有多种功能,输入捕获就是其中一种.STM32F1 除了基本定时器 TIM6 和 TIM7,其他定时器都具有输入捕获功能.输入捕获可以对输入 ...

随机推荐

  1. spring 核心容器api

    spring api : https://docs.spring.io/spring-framework/docs/current/javadoc-api/ BeanFactory 才是 Spring ...

  2. QT:Qt Creator快捷键与使用技巧

    功能 快捷键 解释 Switch Header/Source F4 在同名.h与.cpp文件间切换 Follow Symbol Under Cursor F2 跟踪光标下的变量或函数 变量:跟踪到变量 ...

  3. JZ-017-树的子结构

    树的子结构 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目链接: 树的子结构 代码 /** * 标题:树的子结构 * 题目描述 * 输入两棵 ...

  4. ELKB-ElasticSearch-Logstash-Kibana-beats 个人理解

    先说一下ELK,E是ElasticSearch,L是Logstash,K是Kibana,还有一个Beats.按照从采集到展示的顺序介绍下各个组件的作用. 1.Beats Beats 是一个免费且开放的 ...

  5. 【爬虫】让我沉醉的python爬虫技术

    今天终于有机会好好学习我一直梦寐以求想掌握的爬虫技术,其实爬虫技术涉及的面不多,我力求做到精通写在简历上. 1.工程分析流程 (1)需求分析 ①目标网站:②抓取内容:③存储格式. (2)项目实施 分析 ...

  6. largebin attack

    largebin attack 由这个名字就可以看出是对 largebin 进行的操作,需要的条件是存在 UAF 或者可以构造出 UAF.实现的功能是: 1.任意地址写入一个大数字 2.实现任意地址分 ...

  7. 02 基础 卸载JDK 安装JDK Java程序运行机制

    基础 JDK:Java Development Kit(Java开发者工具 包含JRE和JVM) JRE:Java Runtime Environment(java运行时环境,包含JVM) JVM:J ...

  8. LGP4001题解

    题目大意 给定一张无向图,需要消耗代价才能使一条边被[数据删除],求使这张图不连通的最小代价. 一看就是最小割的应用啊... 从 \(u\) 到 \(v\),边权为 \(w\) 的边,建两条:一条从 ...

  9. LGP5071题解

    我给这道题提供了314次提交qwq 题目大意 给定一个长为 \(n\) 的序列,每次询问给定一个 \(L\) 和 \(R\),求 \([L,R]\) 中所有数乘起来的质因数个数,答案对 \(19260 ...

  10. 面试官:Redis集群有哪些方式,Leader选举又是什么原理呢?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 作为一名Java程序员,Redi ...