1. 程式人生 > 其它 >STM32學習筆記-printf函式和scanf函式

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;
}