上一篇中介紹了UART的收發(fā)數(shù)據(jù)操作,那些操作都是基于外設(shè)庫(kù)的,而不是采用Harmony的動(dòng)態(tài)驅(qū)動(dòng),也沒有采用狀態(tài)機(jī)的機(jī)制。本篇就來(lái)介紹一下如何使用Harmony的動(dòng)態(tài)驅(qū)動(dòng)和狀態(tài)機(jī)來(lái)編寫程序。其實(shí)狀態(tài)機(jī)是挺簡(jiǎn)單的,就是事先定義好可能發(fā)生的哪些狀態(tài),然后主循環(huán)里根據(jù)不同的狀態(tài)進(jìn)行不同的處理,這個(gè)在項(xiàng)目中也是比較常用的方法。
注意Dynamic的驅(qū)動(dòng)對(duì)象都需要有一個(gè)Open動(dòng)作來(lái)創(chuàng)建一個(gè)Handle,后續(xù)所有操作都是用Handle來(lái)代表這個(gè)驅(qū)動(dòng)對(duì)象。所有動(dòng)態(tài)驅(qū)動(dòng)的中斷都是采用注冊(cè)回調(diào)函數(shù)的方式來(lái)使用,無(wú)需到system_init中添加,也無(wú)需自己清除中斷標(biāo)識(shí),驅(qū)動(dòng)已經(jīng)自己完成了。
另外要注意的一點(diǎn)是,串口接收一個(gè)字節(jié)后進(jìn)入了中斷,如果不使用Read接收一下,那么后續(xù)就再也無(wú)法進(jìn)入中斷,就會(huì)出現(xiàn)僅中斷一次的現(xiàn)象,因此,也不要在中斷中進(jìn)行耗時(shí)操作,避免沒有及時(shí)接收數(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一個(gè)客戶端),然后判斷創(chuàng)建的客戶端時(shí)候有效,有效的話,就創(chuàng)建中斷回調(diào)函數(shù),中斷程序的內(nèi)容直接在回調(diào)函數(shù)里編寫就可以了。
編寫中斷回調(diào)函數(shù)內(nèi)容程序,收到一個(gè)數(shù)據(jù)后存儲(chǔ)到數(shù)據(jù)緩沖區(qū),并置位接收完成標(biāo)志位
發(fā)送數(shù)據(jù)的函數(shù),發(fā)送采用查詢方式
編寫Uart_Task()函數(shù),狀態(tài)里就在這里處理,初始化狀態(tài)時(shí)進(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ā)板,打開串口軟件測(cè)試
OLED顯示效果
-
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
493瀏覽量
28109
發(fā)布評(píng)論請(qǐng)先 登錄
為什么PIC32的Harmony編寫沒有交互的狀態(tài)機(jī)?
什么是有限狀態(tài)機(jī)呢
狀態(tài)機(jī)原理在控制程序設(shè)計(jì)中的應(yīng)用
VFP9.0編寫程序
簡(jiǎn)述使用QII狀態(tài)機(jī)向?qū)绾蝿?chuàng)建一個(gè)狀態(tài)機(jī)

狀態(tài)機(jī)如何簡(jiǎn)化PLC程序的編寫
FPGA:狀態(tài)機(jī)簡(jiǎn)述

基于事件驅(qū)動(dòng)的有限狀態(tài)機(jī)介紹
狀態(tài)模式(狀態(tài)機(jī))

基于事件驅(qū)動(dòng)的有限狀態(tài)機(jī)介紹
自動(dòng)生成程序狀態(tài)機(jī)代碼狀態(tài)機(jī)建模方法

如何使用FSME來(lái)定制狀態(tài)機(jī)

評(píng)論