上一篇中介紹了UART的收發(fā)數(shù)據(jù)操作,那些操作都是基于外設(shè)庫的,而不是采用Harmony的動態(tài)驅(qū)動,也沒有采用狀態(tài)機(jī)的機(jī)制。本篇就來介紹一下如何使用Harmony的動態(tài)驅(qū)動和狀態(tài)機(jī)來編寫程序。其實狀態(tài)機(jī)是挺簡單的,就是事先定義好可能發(fā)生的哪些狀態(tài),然后主循環(huán)里根據(jù)不同的狀態(tài)進(jìn)行不同的處理,這個在項目中也是比較常用的方法。
注意Dynamic的驅(qū)動對象都需要有一個Open動作來創(chuàng)建一個Handle,后續(xù)所有操作都是用Handle來代表這個驅(qū)動對象。所有動態(tài)驅(qū)動的中斷都是采用注冊回調(diào)函數(shù)的方式來使用,無需到system_init中添加,也無需自己清除中斷標(biāo)識,驅(qū)動已經(jīng)自己完成了。
另外要注意的一點(diǎn)是,串口接收一個字節(jié)后進(jìn)入了中斷,如果不使用Read接收一下,那么后續(xù)就再也無法進(jìn)入中斷,就會出現(xiàn)僅中斷一次的現(xiàn)象,因此,也不要在中斷中進(jìn)行耗時操作,避免沒有及時接收數(shù)據(jù),導(dǎo)致數(shù)據(jù)殘缺不全。
先在app.h文件中定義狀態(tài)機(jī)和UART要使用的相關(guān)變量結(jié)構(gòu)體,使用結(jié)構(gòu)體也是滿方便的。
在app.c中編寫應(yīng)用程序,包含頭文件之后,初始化函數(shù)編寫,這里的初始化不是底層的初始化,而是初始化UART的相關(guān)變量,并創(chuàng)建句柄。第一步要initial(open一個客戶端),然后判斷創(chuàng)建的客戶端時候有效,有效的話,就創(chuàng)建中斷回調(diào)函數(shù),中斷程序的內(nèi)容直接在回調(diào)函數(shù)里編寫就可以了。
編寫中斷回調(diào)函數(shù)內(nèi)容程序,收到一個數(shù)據(jù)后存儲到數(shù)據(jù)緩沖區(qū),并置位接收完成標(biāo)志位
發(fā)送數(shù)據(jù)的函數(shù),發(fā)送采用查詢方式
編寫Uart_Task()函數(shù),狀態(tài)里就在這里處理,初始化狀態(tài)時進(jìn)行初始化,然后進(jìn)入接收數(shù)據(jù)狀態(tài),接收到數(shù)據(jù)后回發(fā),并在OLED上顯示接收到的字節(jié)數(shù)。
在APP_Tasks()中循環(huán)調(diào)用Uart_Task(),以處理接收到的數(shù)據(jù)。
編譯,下載程序到開發(fā)板,打開串口軟件測試
OLED顯示效果
-
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
491瀏覽量
27456
發(fā)布評論請先 登錄
相關(guān)推薦
評論