7 STM32 的串列埠程式設計(printf 重定向)

2021-07-24 22:37:35 字數 1776 閱讀 9128

在開發過程中,通常需要進行一些必要的 log 輸出,在**的關鍵地方輸出 log 便於我們 debug,也便於跟蹤程式的執行狀態, 最根本的方法就是通過串列埠輸出。stm32 的串列埠資源比較豐富, 使用流程如下 :

l  配置時鐘

ø  初始化系統時鐘 systeminit();

ø  使能串列埠對映到的gpio埠時鐘

rcc_apb2periphclockcmd(rcc_apb2periph_gpioa,  enable);

ø  使能串列埠時鐘

rcc_apb1periphclockcmd(rcc_apb1periph_usart2,enable);

ø  使能埠復用時鐘

rcc_apb2periphclockcmd(rcc_apb2periph_afio,   enable);

2  初始化 gpio 埠

ø  配置傳送端的 gpio 口為復用推挽式輸出模式

ø  配置接收為浮空輸入。

3  如果使用中斷方式, 配置中斷通道, 優先順序、使能中斷

4  串列埠配置

ø  定義配置結構體 usart_inittypedef;

ø  配置波特率、資料長度、奇偶校驗、停止位等。

ø  呼叫 usart_init 函式初始化串列埠。

ø  如果使用中斷方式、這裡還需要開啟串列埠中斷 usart_itconfig, 同時需要配置中斷優先順序。(與前面的外部

中斷配置方式類似)

ø  呼叫 usart_cmd 函式使能串列埠

ø  如果使用中斷、呼叫 usart_clearflag 清除傳送完成標誌位

5  中斷服務程式的編寫(一般接收使用中斷、傳送不使用中斷)

ø  首先判斷是否為接收中斷

usart_getitstatus(usart2,usart_it_rxne) != reset

ø  清除中斷標誌

usart_clearitpendingbit(usart2,usart_it_rxne);

ø  讀取接收到的資料

usart_receivedata(usart2)

6  資料的傳送

ø  呼叫函式 usart_senddata(usart2, data); 

ø  等待傳送完成

while(usart_getflagstatus(usart2, usart_flag_txe) == reset);

printf 和 scanf 的重定向

通過上述的一系列配置之後,就可以使用串列埠進行輸入輸出了。但是這樣的方式只能簡單的進行輸出,因為這裡涉及到的是最底層的串列埠傳送資料,不涉及任何的資料格式等轉換。因此用起來還是很不方便,keil 中可以對printf 進行重定向,這樣就可以使用 c 標準庫中的 printf 和 scanf 函式了。只需要過載乙個fputc函式即可呼叫 printf 函式方便的列印資訊了。如果需要使用 scanf 函式, 只需要實現乙個 fgetc 函式即可。

int fputc(int ch, file *f)

int fgetc(file *f)

最後需要設定一下, 在 keil 軟體中專案的 optionfor target 中的 target 選項頁面, 勾選右邊codegeneration 視窗中的 usemicro lib

當然在標頭檔案中需要包含 #include 「stdio.h」, 配置完畢之後就可以使用 printf 函式和 scanf 函式進行輸出了。

STM32 的串列埠

一 串列埠使用 原則 盡量中斷中不要有延時 比如自定義delay 和自定義printf串列埠列印,明顯找事啊這麼慢能不發生溢位error嘛 接收和傳送盡量分開處理 1.串列埠傳送資料丟失 1 通常是因為傳送之前未檢測tc狀態位之前是否處於傳送完成標誌導致,關於stm32之 的測試程式來講會導致第乙個...

stm32f7網口 STM32F7串列埠通訊問題

stm32f7串列埠通訊問題 所屬分類 stm32f系列 瀏覽數 4572 提問者 dlx6969 問 stm32f767用到2個串列埠 串列埠1,230400,dma傳送,中斷接收 串列埠5,460800,dma傳送,中斷接收。初始化程式如下 初始化函式 void mx uart5 init vo...

STM32實驗7 串列埠應用

接收紅外遙控器的按鍵訊號,把按鍵訊號發射到pc機上顯示 接收並解碼紅外按鍵訊號 串列埠printf顯示 可參考stm32例程 15 a d printf.h 總之,uart就是乙個可以接收 傳送位元組的功能模組。紅外遙控原理介紹 紅外遙控器採用載波的方式傳送二進位制編碼,常用的載波頻率為38khz....