STM32学习笔记-printf函数和scanf函数
STM32学习笔记-printf函数和scanf函数
STM32重定向printf和scanf函数
1. USART寄存器相关基础
USART包括状态寄存器(USART_SR)、数据寄存器(USART_DR)、**波特比率寄存器(USART_BRR) 、三个控制寄存器 x(USART_CRx) **。
这里主要用到状态寄存器和数据寄存器
状态寄存器:
只有0到9位使用,每一位都是一个状态标记,常用的主要是TC和RXNE。
TC:发送数据。 0表示发送未完成,1表示发送完成
RXNE:接收数据。0表示还未收到数据,1表示收到数据。这时候读取USART_DR,从而将该位清零,也可以向该位写0,直接清除
数据寄存器:
数据寄存器有两个寄存器构成,TDR和RDR,分别用来处理发送和接收的数据。对数据寄存器DR进行读操作时候,相当于对接收数据寄存器RDR进行读操作。对数据寄存器DR进行写操作时候,相当于对发送数据寄存器TDR进行写操作
2. 重定向printf和scanf函数
//重定向 c 库函数 printf 到串口,重定向后可使用 printf 函数
int fputc(int ch, FILE *stream)
{
//检测串口是否发送完成
while((USART2->SR & 0X40) == 0);
//串口发送完成,将该字符发送
USART2->DR = (uint8_t) ch;
}
//重定向 c 库函数 scanf 到串口,重写向后可使用 scanf、getchar 等函数(此方法存在错误)
int fgetc(FILE *stream)
{
/* 等待串口输入数据 */
while ((USART2->SR & 0X40) == 0) ;//根据手册定,检测RXNE位为1
uint8_t ch;
ch = USART2->DR
return ch;
}
//HAL库写法
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1, 0xFFFF);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch;
HAL_UART_Receive(&huart1,(uint8_t *)&ch, 1, 0xFFFF);
return ch;
}