在開發過程中,通常需要進行一些必要的 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....