今天說一下stm32微控制器的接收不定長度位元組資料的方法。由於stm32微控制器帶idle中斷,所以利用這個中斷,可以接收不定長位元組的資料,由於stm32屬於arm微控制器,所以這篇文章的方法也適合其他的arm微控制器。
idle中斷什麼時候發生?
idle就是串列埠收到一幀資料後,發生的中斷。什麼是一幀資料呢?比如說給微控制器一次發來1個位元組,或者一次發來8個位元組,這些一次發來的資料,就稱為一幀資料,也可以叫做一包資料。
如何判斷一幀資料結束,就是我們今天討論的問題。因為很多專案中都要用到這個,因為只有接收到一幀資料以後,你才可以判斷這次收了幾個位元組和每個位元組的內容是否符合協議要求。
看了前面idle中斷的定義,你就會明白了,一幀資料結束後,就會產生idle中斷。這個中斷真是太***有用了。省去了好多判斷的麻煩。
如何配置好idle中斷?
下面我們就配置好串列埠idle中斷吧。
stm32微控制器接收不定長度位元組資料的方法解析
這是串列埠cr1暫存器,其中,對bit4寫1開啟idle中斷,對bit5寫1開啟接收資料中斷。(注意:不同系列的stm32,對應的暫存器位可能不同)
(rxne中斷和idle中斷的區別?
當接收到1個位元組,就會產生rxne中斷,當接收到一幀資料,就會產生idle中斷。比如給微控制器一次性傳送了8個位元組,就會產生8次rxne中斷,1次idle中斷。)
stm32微控制器接收不定長度位元組資料的方法解析
這是狀態暫存器,當串列埠接收到資料時,bit5就會自動變成1,當接收完一幀資料後,bit4就會變成1.
需要注意的是,在中斷函式裡面,需要把對應的位清0,否則會影響下一次資料的接收。比如rxne接收資料中斷,只要把接收到的乙個位元組讀出來,就會清除這個中斷。idle中斷,如何是f0系列的微控制器,需要用icr暫存器來清除,如果是f1系列的微控制器,清除方法是「先讀sr暫存器,再讀dr暫存器」。(我怎麼知道?手冊上寫的)
下面以stm32f103為例給出源程式。
我們先來看程式中的主要部分。
串列埠初始化函式片段
如果你原來的串列埠初始化函式具有開啟串列埠接收中斷的話,實際上就是在初始化函式中多了一條開啟空閒中斷的語句。
串列埠中斷函式
串列埠中斷函式裡面,最重要的兩條語句,就是上圖中圈出來的兩條語句。第一條語句用來判斷是否接收到1個位元組,第二條語句用來判斷是否接收到1幀資料。(是不是感覺超級方便?媽媽再也不用擔心我如何判斷是否接收完1幀資料了。)
主函式我寫的這個主函式,是用來驗證接收的正確性的。rxcounter表示的是這一幀資料有幾個位元組,接收完一幀資料,會在中斷函式裡面把receivestate置1,然後,通過串列埠把接收到的資料傳送回串列埠。這樣,既驗證了接收了多少位元組的正確性,又驗證了接收到的資料是否正確。
上圖是結果驗證。
STM32 HAL DMA串列埠接收不定長度實現
1.使用stm32cube 直接先配置串列埠1的基礎資訊。2.然後配置dma傳輸 3.就是啟動了,在串列埠初始化之後預設是沒有開啟串列埠dma接收的。所以增加幾行 如下圖所示 4.寫串列埠1中斷函式 這個函式就是實現不等長的精髓所在了。這裡用到了類似環形佇列的方法,至於什麼是環形佇列這個不知道童鞋自...
微控制器學習(一) 微控制器基礎 STM32
io四種輸入工作模式 io四種輸出工作模 stm32有8個16位定時器 stm32具有強大的異常響應系統,它把能夠打斷當前 執行流程的事件分為異常 exception 和中斷 interrupt 並把它們用乙個表管理起來,編號為 3 6的中斷向量定義為系統異常,編號從7到19的為外部中斷。中斷向量控...
微控制器 STM32庫開發
1.stm32庫開發是什麼?st公司推出的基於cortex m3核心的mcu 微控制器,也就是通常所說的微控制器 倡導使用韌體庫開發,僅通過呼叫庫裡面的api 應用程式介面 就可以迅速搭建乙個程式,寫出各種使用者需要的應用。庫開發方式自頂向下,可以避免對底層暫存器的繁瑣操作,能大大降低學習門檻和開發...