STM32 的串列埠

2021-10-05 11:54:20 字數 3180 閱讀 7224

一、串列埠使用:

原則:盡量中斷中不要有延時(比如自定義delay 和自定義printf串列埠列印,明顯找事啊這麼慢能不發生溢位error嘛),接收和傳送盡量分開處理

1.串列埠傳送資料丟失:

1)通常是因為傳送之前未檢測tc狀態位之前是否處於傳送完成標誌導致,關於stm32之·的測試程式來講會導致第乙個字元丟失,之後都完全正常。

因此傳送一串資料的邏輯必須按照先檢測tc再傳送字元的順序進行.即:

void usart1_send_data(u8 buf,u32 len)

while(usart_getflagstatus(usart1,usart_flag_tc) == reset) ; //提公升**健壯性

}//綠色部分提高了**的健壯性,雖說可有可無,但是避免其他部分**出現類似不檢測傳送的問題。

2)監測傳送狀態位用tc而盡量不要使用txe,畢竟前者是監測的是否資料傳送完而後者只是監測快取區是否移位到移位暫存器而已。(在485這種半雙工的模式下就有差別,後者會導致自己傳送後自己又接收到資料)

2.接收資料丟失:

何時串列埠需要使用流控(即串列埠硬體流控制):硬體流控制是用在微控制器與另一台裝置串列埠通訊時,微控制器處理速度相對比如pc機慢,微控制器接收資料處理速度低於pc機傳送速度,這樣會造成資料丟失,這樣就需要加入硬體流控了。流控制能解決這個問題,當接收端資料處理不過來時,就發出「不再接收」的訊號,傳送端就停止傳送,直到收到「可以繼續傳送」的訊號再傳送資料。因此流控制可以控制資料傳輸的程序,防止資料的丟失。我們通常在串列埠助手這種速率情況下微控制器處理速度是完全ok的,不需流控。只是應用在兩者處理速度確實差異較大情況下;另外置收資料丟失就是自己在中斷中新增了延遲操作比如delay 或者printf這種超消耗時間並伴隨著資料溢位error出現這種低階錯誤!!

3.關於串列埠資料的接收與傳送處理的幾種模式:(以只以接收中斷為例)

1)(一般用於測試)接收乙個字元就傳送乙個字元:

這種模式多用在串列埠測試收發的資料,即用在測試中較多,可以在串列埠接收中斷將收到的資料直接傳送即可:邏輯即以下**:(像這種中斷中接收中斷中傳送的模式通常只在我們測試環境中使用,而實際通訊中接收和傳送一般都是分開的,接收我們設立專門的快取區,

void usart1_irqhandler(void)

}2)(用於實際應用)建立接收快取區,串列埠驅動層訪問資料和進行資料快取大小的簡單、幀是否結束 判斷,而受到資料根據具體協議由協議層對接收到的資料進行校驗;接收與傳送是不同的程序,通過乙個自定義狀態暫存器實現資料的檢測。

void usart1_irqhandler(void)}}

總結來說上面即兩種方式

法1 uart 的傳送暫存器空的位測試

命令法2 完整的接收到來自傳送裝置的數

據, 來確認傳送資料完成, 以便及時地關閉

傳送(即接收到完整幀)

畢竟軟體是活的,方法思路不是死的,下面這兩種思路用於測試也不錯的:

1.通過串列埠接收中斷乙個位元組乙個位元組接收資料,同時用定時器來計算接收到資料的時間間隔,如果超過一定時間沒有接收到資料則判斷為一幀資料接受完,然後再對資料進行解析

2,通過dma接收,加串列埠空閒中斷方式,只在接收完一幀資料後才會產生中斷,然後對資料進行解析。

二、關於串列埠助手:(由於我們串列埠一般按位元組接收)

注意:有的串列埠助手比如正點原子提供的atkxcom串列埠助手本身其實就是有很大問題的。

串列埠助手傳送有兩種模式,普通字串和十六進製制形式。

若傳送選字串形式,那麼傳送的每個都是字元而不是"十進位制數",比如空格也是字元,並不是沒有發資料!!

而選擇十六進製制數形式,則意味著每兩個十六進製制數構成乙個位元組傳送(由於我們串列埠正常都是按照8bit即單位元組接收)。既然是十六進製制,那麼你傳送的數值形式至少滿足是0-f之間啊。像sscom這種串列埠助手上如果非正常輸入就會有警告提示,這是相對好的一點。

[size=0.83em]

而我們說像atkxcom這種串列埠助手的更大的問題是如果非十六進製制下是否做了處理,像sscom在十六進製制下空格是忽視的,也就是無效,這是很容易接受的,畢竟不是十六進製制,並且十六進製制下傳送新行按鈕即回車和換行這種非十六進製制是遮蔽的,也是無效,這是應該的。而atkxcom1.4版本本身竟然在十六進製制下將空格和新行也發了出去,這本身就是錯誤的,而2.0版本依然沒有改新行這個功能在十六進製制下遮蔽這個問題。這個最簡單的方法就是可檢視助手下面傳送資料計數即可看出,所以atkxcom串列埠助手這種帶問題的串列埠不要使用…

總結串列埠助手:

1:勾選傳送換行只有在是字串格式下才有效,空格有效;十六進製制模式只能傳送十六進製制數,空格無效,新行無效。

2:下面記錄的傳送資料個數可記錄我們實際傳送的資料個數

三、串列埠使用不要時不要新增多餘操作:

1)比如在初始化串列埠中無故新增 usart_clearflag(usart3,usart_flag_tc)某個串列埠狀態,如果程式中有重新初始化串列埠也就是重複無條件執行usart_clearflag(usart3,usart_flag_tc)會導致某串列埠掛掉或者整個板子掛掉

2)爭強**健壯性可在串列埠初始化開始先進行串列埠復位操作

四、串列埠部分暫存器位說明

sr狀態暫存器先讀狀態再讀資料(呼叫對應介面)實現的是清除sr狀態位,但並不會使接收快取器(dr)內資料丟失,仍是當前資料

五、關於stm32帶奇偶校驗接收傳送的串列埠配置問題

stm32如果串列埠含有就校驗那麼32自身的串列埠的資料位應配置為9位模式,其最高位硬體給為校驗位(實際資料位仍是8位),而如果我們配置資料位為8位,則最高位會配置為奇偶校驗位,那麼實際資料位只有7位,這時與串列埠通訊的pc為7位資料位才資料可能正確。具體參見stm32手冊p519下圖[size=0.83em]

換句話說就是stm32的「資料位」長度不同於我們實際串列埠專指的「資料部分」的長度。當無奇偶校驗時,則32的資料位就是實際的資料部分長度,與串列埠助手上資料位一樣;而當有就校驗時,由奇偶校驗位會占用32所謂「資料位」最高位,因此當32串列埠配置9位時實際資料位為8位,配置為8位時實際資料位為7位。

即:如果pc端設定為: 資料位=8,停止位=1,奇偶檢驗=偶/奇

則stm32的設定為:資料位=9,停止位=1,奇偶檢驗=偶/奇

請記住,在stm32上,奇偶檢驗位要計算在資料位中。

2.串列埠助手有的不支援奇偶校驗功能,比如丁丁(sscomm)的3.3版本不支援,而4.2版本則支援這個功能,而正點原子串列埠助手本身bug太多就不推薦使用了

四、網路助手無非基於本地ip的乙個應用程序,因此其處於本地ip的應用層,這點要注意。也就意味著應用層以下的協議你是不能用網路助手作為乙個程序進行通訊使用的

STM32之串列埠

名稱 stm32之串列埠 說明 對於stm32的串列埠通訊來說,從外部看,和c51差不多。從內部看,啊。我還不了解。從使用上說,也是需要先配置usart,然後通過終端或者輪詢的方式接受或者輸出資料。由於有了韌體庫函式的幫助,stm32的串列埠配置起來比c51還要方便不少。本實驗完成的是輸入輸出重定向...

STM32多個串列埠printf

網上講的新增printf 到程式中一般都是這樣的 簡要提一下 1.配置gpio usart,rcc 的configuration 2.勾選usb micro lib 3.在程式中新增 標頭檔案需要新增 include ifdef gnuc define putchar prototype int i...

STM32之串列埠原理

串列埠通訊定義 串列埠是計算機上一種非常通用裝置通訊的協議。大多數計算機包含兩個基於rs232的串列埠。串列埠同時也是儀器儀表裝置通用的通訊協議 很多gpib相容的裝置也帶有rs 232口。同時,串列埠通訊協議也可以用於獲取遠端採集裝置的資料。串列埠通訊原理 串列埠通訊的概念非常簡單,串列埠按位 b...