STM32學習筆記-printf函式和scanf函式
阿新 • • 發佈:2021-06-23
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; }