串列埠接收標誌位語句 stm32串列埠 標誌位學習

2021-10-13 09:04:14 字數 2250 閱讀 2299

/*在usart的傳送端有2個暫存器,乙個是程式可以看到的usart_dr暫存器,另乙個是程式看不到的移位暫存器,對應usart資料傳送有兩個標誌,乙個是txe=傳送資料暫存器空,另乙個是tc=傳送結束。

當usart_dr中的資料傳送到移位暫存器後,txe被設定,此時移位暫存器開始向tx訊號線按位傳輸資料,但因為tdr已經變空,程式可以把下乙個要傳送的位元組(操作usart_dr)寫入tdr中,而不必等到移位暫存器中所有位傳送結束,所有位傳送結束時(送出停止位後)硬體會設定tc標誌。

另一方面,在剛剛初始化好usart還沒有傳送任何資料時,也會有txe標誌,因為這時傳送資料暫存器是空的。txeie和tcie的意義很簡單,txeie允許在txe標誌為'1'時產生中斷,而tcie允許在tc標誌為'1'時產生中斷。

至於什麼時候使用哪個標誌,需要根據你的需要自己決定。但我認為txe允許程式有更充裕的時間填寫tdr暫存器,保證傳送的資料流不間斷。tc可以讓程式知道傳送結束的確切時間,有利於程式控制外部資料流的時序。

txe--寫暫存器dr清零

rxne--讀暫存器dr清零,也可軟體手動清零

tc--  讀/寫暫存器dr清零,也可軟體手動清零

先說tc。即transmission complete。傳送乙個位元組後才進入中斷,這裡稱為「傳送後中斷」。和原來8051的ti方式一樣,都是傳送後才進中斷,需要在傳送函式中先傳送乙個位元組觸發中斷。傳送函式如下*/

/*******功能:中斷方式傳送字串.採用判斷tc的方式.即 判斷 傳送後中斷 位.

輸入:字串的首位址輸出:無

void usart_senddatastring( u8 *pdata )

pdatabyte=pdata;

usart_clearflag(usart1, usart_flag_tc);//清除傳輸完成標誌位,否則可能會丟失第1個位元組的資料.網友提供.

usart_senddata(usart1,*(pdatabyte++) ); //必須要++,不然會把第乙個字元t傳送兩次

}//中斷處理函式如下/********

* function name  : usart1_irqhandler

* description    : this function handles usart1 global interrupt request.

* input          : none

* output         : none

* return         : none

void usart1_irqhandler(void)

/*其中u8 *pdatabyte;是乙個外部指標變數

在中斷處理程式中,傳送完該字串後,不用關閉tc的中斷使能tcie,只需要清掉標誌位tc;這樣就能避免tc == set 導致反覆進入中斷了。*/

voidusart_config()

usart_itconfig(usart1, usart_it_tc, enable);//tramsimssion complete後,才產生中斷. 開tc中斷必須放在這裡,否則還是會丟失第一位元組

usart_cmd(usart1, enable); //使能usart1

再說判斷txe。即tx dr empty,傳送暫存器空。當使能txeie後,只要tx dr空了,就會產生中斷。所以,傳送完字串後必須關掉,否則會導致重複進入中斷。這也是和tc不同之處。

傳送函式如下:*/

功能:中斷方式傳送字串.採用判斷tc的方式.即 判斷 傳送後中斷 位.

輸入:字串的首位址

輸出:無

void usart_senddatastring( u8 *pdata )

pdatabyte=pdata;

usart_itconfig(usart1, usart_it_txe, enable);//只要傳送暫存器為空,就會一直有中斷,因此,要是不傳送資料時,把傳送中斷關閉,只在開始傳送時,才開啟。

}//中斷處理函式如下:/********

* function name  : usart1_irqhandler

* description    : this function handles usart1 global interrupt request.

* input          : none

* output         : none

* return         : none

void usart1_irqhandler(void)

/*在串列埠初始化函式中就不用開啟txe的中斷了(是在傳送函式中開啟的)

STM32串列埠接收策略

如果我們需要接收乙個序列協議,怎麼做呢?先放到緩衝區然後再檢查標誌位是一種思路。道理簡單,關鍵要看怎麼設計。這裡介紹的方法是巧妙利用定時器,與串列埠中斷進行耦合,得到一種魯棒的接收方法。具體 開啟定時器與串列埠中斷 首先用示波器檢視完整幀所需要的時間,並且設定為timmax。定時器以適當的中斷頻率開...

STM32串列埠中斷方式接收

經過除錯在stm32f101cbt6中實現通訊。注意還要配乙個ttl轉usb介面,才能進行通訊。實現字串回發 include stm32f10x it.h include stm32f10x conf.h void rcc configuration void 時鐘配置 void usart con...

STM32串列埠接收中斷BUG

除錯串列埠時,發現串列埠會出現頻繁跳中斷,導致無法執行主迴圈的問題!除錯發現是串列埠中斷硬體bug 1.usart itconfig usart 1,usart it rxne,enable 使能了接收中斷,那麼ore中斷也同時被開啟了。2.ore中斷只能使用usart getflagstatus ...