在STM32中使用printf函数

这篇具有很好参考价值的文章主要介绍了在STM32中使用printf函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、目的

    利用printf函数使得输出打印到串口中。

二、工作原理

    我们在C语言中为什么能够调用printf函数打印数据到控制台中,那是因为printf函数又调用了fputc()函数。那么我们我们可不可以说printf函数之所以能够打印数据到控制台中几乎都是fput()函数的功劳呢?答案是显而易见的。因此,在这我们只需要重写fput函数即可。

三、代码展示

1、重写fput()函数

    在这里我们需要注意的是,在实际的代码运行过程中该函数是自调用的,不需要我们刻意调用它。

/******************************************************************************
*	函数功能 相当于串口发送数据
*	参数 
*	返回值
*	注意 该函数是stdio.h文件中默认函数 当我们使用printf函数时会自调用
*		 这里的printf函数跟C语言的printf用法一样
******************************************************************************/
int fputc(int ch,FILE *p)
{
	USART_SendData(USART1,(u8)ch);	
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
	return ch;
}

2、GPIO初始化

/****************************************************************
*	函数功能	printf的初始化
*	参数	无
*	返回值	无
****************************************************************/
void printf_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef  USART_InitStructure;
	
	/*  打开端口时钟  */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	/*  配置GPIO的模式和IO口 */
	//选择TX		 串口输出PA9
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;	
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	 //复用推挽输出
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;	   
	GPIO_Init(GPIOA,&GPIO_InitStructure);  
	/* 初始化串口输入IO */
	//选择RX	串口输入PA10
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
	  //模拟输入
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;		
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	/*  USART串口初始化  */
	//波特率设置为9600	
	USART_InitStructure.USART_BaudRate=9600;   
	//数据长8位
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;	
	//1位停止位	
	USART_InitStructure.USART_StopBits=USART_StopBits_1;		
	//无效验	
	USART_InitStructure.USART_Parity=USART_Parity_No;				
	//失能硬件流
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; 
	//开启发送和接受模式
	USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;	 
	USART_Init(USART1,&USART_InitStructure);	
	
	/* 使能USART1 */
	USART_Cmd(USART1, ENABLE);		   
	//使能或者失能指定的USART中断 接收中断
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	//清除USARTx的待处理标志位	
	USART_ClearFlag(USART1,USART_FLAG_TC);
}

3、一个简单的hello输出

int main()
{
	printf_init();
	while(1)
	{		
		printf("hello!");
	}
}

四、keil中的配置

    实际上直接使用上述代码是不能够完成我们最初的设计目的的,单单这样它不会输出任何东西到串口中,我们还需要在keil中小小的配置一下。样例如下图:
stm32 printf,# STM32,单片机,stm32,单片机,c语言

五、总结

    小编个人认为,在这个项目中,实际上的printf函数就是一个串口输出函数,只不过它相比之前我们直接调用串口发送函数更加方便、更加实用,无非是在GPIO的定义与初始化上有点儿区别。因此,我们完全可以将printf函数看成一个串口发送函数。文章来源地址https://www.toymoban.com/news/detail-595397.html

到了这里,关于在STM32中使用printf函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用vscode + gcc进行 STM32 单片机开发(一)编译及调试

    众所周知,单片机MCU的开发通常是使用keil来进行的,但是keil作为一款有几十年历史的IDE,bug层出不穷,界面也越来越丑,加上使用盗版jlink,导致keil各种崩溃卡死。 故越来越多的单片机IDE也如雨后春笋般冒出,例如 st官方出版的st studio、rt-thread出版的rt-studio,至于好不好用

    2023年04月08日
    浏览(47)
  • 使用DMA传输实现单片机高效串口转发——以STM32系列为例

    Date Author Version Note 2023.08.06 Dog Tao V1.0 1. 完成了文档的撰写。 2023.08.23 Dog Tao V1.1 1. 增加了STM32F103-USART2的DMA传输配置示例。 2. 增加了STM32F103与F407单片机的DMA控制器介绍并更改了第一章节的结构。 应用场景 在许多现实应用场景中,例如工业自动化控制、嵌入式通信设备等领域,

    2024年02月14日
    浏览(46)
  • STM32单片机(一)STM32简介

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月10日
    浏览(57)
  • STM32单片机(二)STM32环境搭建

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月10日
    浏览(59)
  • STM32单片机开发-01 STM32介绍

    通过野火开发板学习单片机 从内核上分有Cortex-M0、M3、M4 和M7 F1 代表了基础型,基于Cortex-M3 内核,主频为72MHZ F4 代表了高性能,基于Cortex-M4 内核,主频180M。 数据手册:用于芯片选型和设计原理图 参考手册:用于编程时查阅 Icode总线 – 该总线讲M3内核的指令总线与闪存指令

    2024年01月21日
    浏览(57)
  • STM32单片机学习3--STM32控制键盘

    单片机型号:STM32F103C8T6 开发环境:Keil5 4种输入模式 上拉输入模式:在默认状态下(GPIO引脚无输入),读取得的GPIO引脚数据为1,高电平(与Vdd相连的为上拉电阻); 下拉输入模式:在默认状态下(GPIO引脚无输入),读取得的GPIO引脚数据为0,低电平(与Vss相连的为下拉电

    2024年02月10日
    浏览(55)
  • 【STM32】STM32单片机结构及部件原理

    STM32是目前比较常见并且多功能的单片机,要想学习STM32,首先要去了解它的基本构成部分以及各部分的原理。 单片机型号:正点原子STM32F103ZET6 目录 STM32内部结构总览图: 2.内部结构解析         1.内核 :STM32F103ZET6采用的是 ARM Cortex-M3 处理器,内核可以理解为单片机 处

    2023年04月08日
    浏览(46)
  • GD32单片机和STM32单片机的对比分析

    GD32单片机和STM32单片机都是基于Arm Cortex-M3/M4内核的32位通用微控制器,广泛应用于各种嵌入式系统和物联网领域。两者之间有很多相似之处,但也有一些不同之处,本文将从以下几个方面对比分析两者的特点、优势和开发成本。 GD32单片机采用的是二代的M3/M4内核,而STM32单片

    2024年02月16日
    浏览(57)
  • STM32单片机学习4--STM32控制八段码

    数码管:实际上是多个LED按照一定顺序排列,并加上遮罩所构成的元件。 八段码一般会引出9个引脚,其中7个引脚显示数字(或某些字母),1个显示小数点,1个作为片选端。 根据连接方式的不同,数码管分为 共阳 和 共阴 。 共阳在这端输出低电平时点亮,高电平时会熄灭

    2024年01月23日
    浏览(46)
  • 【单片机】STM32单片机的各个定时器的定时中断程序,标准库,STM32F103

    高级定时器和普通定时器的区别(https://zhuanlan.zhihu.com/p/557896041): TIM1是高级定时器,使用的时钟总线是RCC_APB2Periph_TIM1,和普通定时器不一样。 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用

    2024年02月07日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包