stm32之重写printf串口发送

操作步骤

1、在main中,加上以下函数即可(作用:重写fputc)

       库函数版

            int fputc( int ch, FILE *f ){
                  USART_SendData(USART1,(u8) ch );
                  while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
                  return ch;
           }

       寄存器版

          int fputc(int ch, FILE *f){ 
             while((USART2->SR&0X40)==0);//循环发送,直到发送完毕   
             USART2->DR = (u8)ch;      
             return ch;
         }

2、在使用printf函数的.C文件张工包含头文件stdio.h

  #include<stdio.h>

3、勾选Target中的use MicroLIB

在这里插入图片描述
附上代码
.c文件

#include "stm32f10x.h"                  // Device header
#include "usart.h"
#include "stdio.h"

void Usart_Init(void)
{
	
	GPIO_InitTypeDef GpioInitStructure; //初始化GPIO结构体命名
	USART_InitTypeDef UsartInitStructure;//初始化USART结构体命名
	NVIC_InitTypeDef	NvicInitStructure;
	
	
	//1.串口中断组的选择
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	
	//2. 配置时钟:GPIO口的时钟,引脚复用的时钟,串口的时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

	
	//3.先配置tx输出引脚io(pa9)
	GpioInitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;//复用推挽输出
	GpioInitStructure.GPIO_Pin   = GPIO_Pin_9;
	GpioInitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GpioInitStructure);
	
	//4.再配置rx输出引脚io(pa10)
	GpioInitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;//浮空输入
	GpioInitStructure.GPIO_Pin   = GPIO_Pin_10;
	GPIO_Init(GPIOA,&GpioInitStructure);
	
	//5.串口结构体的配置
	UsartInitStructure.USART_BaudRate =   115200;        //波特率
	UsartInitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //硬件流
	UsartInitStructure.USART_Mode = USART_Mode_Rx| USART_Mode_Tx;					//模式
	UsartInitStructure.USART_Parity = USART_Parity_No;						//校验位
	UsartInitStructure.USART_StopBits =	USART_StopBits_1;					//停止位
	UsartInitStructure.USART_WordLength =	USART_WordLength_8b;				//字节长度
	
	USART_Init(USART1, &UsartInitStructure);
	//6.串口和中断控制器联系配置
	USART_ITConfig( USART1,  USART_IT_RXNE, ENABLE );
	//7.打开串口1
	USART_Cmd(USART1, ENABLE);//打开串口 比配置GPIO多这一步
	//8.串口中断控制器结构体配置与初始化
	NvicInitStructure.NVIC_IRQChannel = USART1_IRQn;
	NvicInitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NvicInitStructure.NVIC_IRQChannelSubPriority = 1;
	NvicInitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NvicInitStructure);

	
}
//发送字符函数
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data)
{
		USART_SendData( USARTx,  Data);
		while( USART_GetFlagStatus( USARTx,  USART_FLAG_TXE) == RESET);//USART_GetFlagStatus是判断标志位 USART_FLAG_TXE 去usart.h  FLAG找
}
//发送字符串函数
void USARTSendString( USART_TypeDef* USARTx, char *str)
{
		uint16_t i = 0;
		do{
			USARTSendByte(USART1,*(str+i));
			i++;
		}while(*(str+i) != '\0');
		
		while( USART_GetFlagStatus( USARTx,  USART_FLAG_TC) == RESET);//USART_GetFlagStatus是判断标志位 USART_FLAG_TC(这是判断字符串) 去usart.h  FLAG找

}
//重写Printf函数
int fputc(int ch, FILE *f)
{
		USARTSendByte( USART1,  (uint8_t)ch);
		while( USART_GetFlagStatus( USART1,  USART_FLAG_TXE) == RESET);
		return (ch);
}
int fgetc(FILE *f)
{
		
		while( USART_GetFlagStatus( USART1,  USART_FLAG_RXNE) == RESET);
		
		return (int) USART_ReceiveData(USART1);
//接受用rxne,输入用txe
}











  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打酱油的;

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值