Fork me on GitHub

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;
}
posted @ 2021-06-22 22:40  一地鸡毛-  阅读(1269)  评论(0编辑  收藏  举报