操作步骤
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
}