在異構(gòu)系統(tǒng)并存的今天,IO序列化操作成為實現(xiàn)系統(tǒng)間互操作性的核心技術。通過標準化的數(shù)據(jù)格式(如JSON、Protobuf、Hessian等),不同語言、平臺的系統(tǒng)得以無縫交換信息。合理設計序列化策略,可大幅提升系統(tǒng)的集成能力與擴展性。
一、概述
ioqueue 模塊提供了 IO 序列操作的功能,可以通過硬件定時器精確控制 GPIO 的操作時序。
注意事項:
對于 Air700EXX 系列、Air780EXX 系列、Air8000 系列模組,硬件定時器有如下要求:
硬件定時器 id:0-5,六個硬件定時器,
定時器精度:20 微秒,為硬件支持的最小時間單位。
3 和 5 固定被底層占用不可使用
pwm 功能依賴硬件定時器,ioqueue 不可與 pwm 功能同時使用
pwm0 對應 0
pwm4 對應 4
以此類推
注意:Air6101/Air8101 不支持此功能
1.1 使用場景
ioqueue 主要是輸出一些特殊的電平序列,捕獲自定義協(xié)議。
如果有以下需要就可以使用該庫:
精確控制多個 GPIO 的開關時序
循環(huán)執(zhí)行固定的 GPIO 操作序列
捕獲 GPIO 邊沿變化的精確時間戳
1.1.1 輸入捕獲場景(以 DHT11 數(shù)據(jù)讀取為例)
單總線協(xié)議要求嚴格的時序控制、主機需要先發(fā)送特定啟動信號、傳感器響應時間精確到微秒級、數(shù)據(jù)通過脈沖寬度編碼
使用流程:

下面演示使用硬件定時器精確控制 DHT11 通信時序,通過捕獲下降沿時間戳解碼溫濕度數(shù)據(jù),實現(xiàn)微秒級精確通信:
dht11 通訊協(xié)議介紹:
數(shù)據(jù)分為小數(shù)部分和整數(shù)部分,一次完整的數(shù)據(jù)傳輸為 40bit,高位先出
數(shù)據(jù)格式:8bit 濕度整數(shù)數(shù)據(jù) +8bit 濕度小數(shù)數(shù)據(jù) +8bit 溫度整數(shù)數(shù)據(jù) +8bit 溫度小數(shù)數(shù)據(jù) +8bit 校驗
8bit 校驗 = 8bit 濕度整數(shù)數(shù)據(jù) +8bit 濕度小數(shù)數(shù)據(jù) +8bit 溫度整數(shù)數(shù)據(jù) +8bit 溫度小數(shù)數(shù)據(jù)
校驗可以判斷數(shù)據(jù)是否正確發(fā)送
DHT11 工作時序:
主機發(fā)送起始信號以后,DHT11 發(fā)送響應信號,然后發(fā)送 40bit 的數(shù)據(jù),高位在前
總時序圖如下:

起始信號:總線空閑狀態(tài)由 DHT11 內(nèi)置上拉電阻拉高,主機拉低總線至少 18ms 后釋放總線 20-40us
DHT11 響應:存在的 DHT11 會及時響應主機,同時拉低總線 80us 后,釋放總線 80us,然后拉低總線,表示開始傳送數(shù)據(jù)

發(fā)送數(shù)據(jù):當總線是低電平是表示開始發(fā)送數(shù)據(jù),同時存在 50us 低電平時隙,之后拉高總線,高電平的持續(xù)時間表示發(fā)送 0 或者 1,當高電平持續(xù)時間為 26us-28us 表示發(fā)送 0,高電平持續(xù)時間為 70us 時,表示發(fā)送 1
數(shù)據(jù)發(fā)送完畢,由上拉電阻拉高,置回空閑高電平狀態(tài)


具體波形如下:




1.1.2 輸出精確脈沖場景
需要不同的脈沖寬度、軟件循環(huán)無法滿足精度要求、需要連續(xù)輸出大量脈沖
使用流程:

下面演示利用硬件定時器生成固定頻率或可變寬度的精確脈沖序列,支持連續(xù)和單次延時模式,實現(xiàn)微秒級脈沖控制:
固定間隔脈沖


可變寬度脈沖序列


二、核心示例
示例可參考 1.1.1 章節(jié)具體使用分析。
三、常量詳解
核心庫常量,顧名思義是由 LuatOS 內(nèi)核固件中定義的、不可重新賦值或修改的固定值,在腳本代碼中不需要聲明,可直接調(diào)用;
ioqueue 模塊沒有常量。
四、函數(shù)詳解
ioqueue.init(hwtimer_id, cmd_cnt, repeat_cnt)
功能
初始化一個 io 操作隊列。
參數(shù)
hwtimer_id

cmd_cnt

repeat_cnt

返回值
無返回值。
示例

ioqueue.setdelay(hwtimer_id, time_us, time_tick, continue)
功能
對 io 操作隊列增加延時命令。
參數(shù)
hwtimer_id

time_us

time_tick

continue

返回值
無返回值。
示例

ioqueue.delay(hwtimer_id)
功能
對 io 操作隊列增加一次重復延時,在前面必須有 setdelay 并且是連續(xù)延時。
注意事項
必須在前面的 ioqueue.setdelay 設置 continue=true
參數(shù)
hwtimer_id

返回值
無返回值。
示例

ioqueue.setgpio(hwtimer_id, pin, is_input, pull_mode, init_level)
功能
對 io 操作隊列增加設置 gpio 命令。
參數(shù)
hwtimer_id

pin

is_input

pull_mode

init_level

返回值
無返回值。
示例

ioqueue.input(hwtimer_id, pin)
功能
對 io 操作隊列增加讀取 gpio 命令。
應用場景:在精確時序點讀取 GPIO 電平狀態(tài)
使用時必須先調(diào)用 ioqueue.setgpio 設置輸入模式,然后通過 ioqueue.get()讀取輸入數(shù)據(jù)
參數(shù)
hwtimer_id

pin

返回值
無返回值。讀取的數(shù)據(jù)需要通過 ioqueue.get 獲取。
示例

ioqueue.output(hwtimer_id, pin, level)
功能
對 io 操作隊列增加輸出 GPIO 命令。
參數(shù)
hwtimer_id

pin

level

返回值
無返回值。
示例

ioqueue.set_cap(hwtimer_id, pin, pull_mode, irq_mode, max_tick)
功能
對 io 操作隊列增加設置捕獲某個 IO 命令。
捕獲的配置命令
參數(shù)
hwtimer_id

pin

pull_mode

irq_mode

max_tick

返回值
無返回值。
示例

ioqueue.capture(hwtimer_id)
功能
對 io 操作隊列增加捕獲一次 IO 狀態(tài)命令。
捕獲的執(zhí)行命令,必須先經(jīng)過 ioqueue.set_cap 配置后才能使用 ioqueue.capture 來捕獲,一個 set_cap 配置可以被多個 capture 命令復用
參數(shù)
hwtimer_id

返回值
無返回值。捕獲的數(shù)據(jù)需要通過 ioqueue.get 獲取。
示例

ioqueue.cap_done(hwtimer_id, pin)
功能
對 io 操作隊列結(jié)束捕獲某個 IO 命令。
使用場景:
1.捕獲任務完成時 :主動結(jié)束,告訴系統(tǒng)數(shù)據(jù)讀取完成,停止 gpio 捕獲
2.切換捕獲目標時:比如從捕獲 gpio1 切換到捕獲 gpio2,需要先結(jié)束捕獲 gpio1。
3.錯誤處理或者提前退出時調(diào)用。
參數(shù)
hwtimer_id

pin

返回值
無返回值。
示例

ioqueue.get(hwtimer_id, input_buff, capture_buff)
功能
獲取 io 操作隊列中輸入和捕獲的數(shù)據(jù)。
注意事項
input,set_cap,capture 這三個配置接口配置的功能,緩存到的輸入數(shù)據(jù)和捕獲數(shù)據(jù),都是通過 get 接口來讀取出來
input_buff ← 存儲 ioqueue.input() 的即時電平采樣結(jié)果
capture_buff ← 存儲 ioqueue.capture() 的邊沿事件 + 時間戳
input_cnt = 成功的 ioqueue.input() 操作數(shù)量
capture_cnt = 成功的 ioqueue.icapture() 操作數(shù)量(可能因超時而小于計劃數(shù))
參數(shù)
hwtimer_id

input_buff

capture_buff

返回值
local input_cnt, capture_cnt = ioqueue.get(hwtimer_id, input_buff, capture_buff)
input_cnt

capture_cnt

示例

ioqueue.start(hwtimer_id)
功能
啟動 io 操作隊列。
參數(shù)
hwtimer_id

返回值
無返回值。
示例

ioqueue.stop(hwtimer_id)
功能
停止 io 操作隊列,可以通過 start 從頭開始。
參數(shù)
hwtimer_id

返回值
local loop_cnt, cmd_cnt = ioqueue.stop(hwtimer_id)
loop_cnt

cmd_cnt

示例

ioqueue.release(hwtimer_id)
功能
釋放 io 操作隊列的資源,下次使用必須重新 init。
參數(shù)
hwtimer_id

返回值
無返回值。
示例

ioqueue.clear(hwtimer_id)
功能
清空 io 操作隊列。
此接口重置了命令隊列但保留了硬件定時器資源,可以直接添加新的命令。前提是你確信之前隊列的狀態(tài)完全被清空,且新的命令序列與之前的結(jié)構(gòu)兼容。
參數(shù)
hwtimer_id

返回值
無返回值。
示例

ioqueue.done(hwtimer_id)
功能
檢測 io 操作隊列是否已經(jīng)執(zhí)行完成。
參數(shù)
hwtimer_id

返回值
local is_done = ioqueue.done(hwtimer_id)
is_done

示例

ioqueue.exti(pin, pull_mode, irq_mode, onoff)
功能
啟動/停止一個帶系統(tǒng) tick 返回的外部中斷。
ioqueue.exti 是一個獨立的外部中斷接口,與 ioqueue 隊列系統(tǒng)完全分離,提供簡單的 GPIO 邊沿事件捕獲功能。
使用場景:簡單的按鍵檢測、傳感器狀態(tài)監(jiān)控、旋轉(zhuǎn)編碼器計數(shù)
參數(shù)
pin

pull_mode

irq_mode

onoff

返回值
無返回值。
示例

五、模組支持說明
僅支持 Air700EXX 系列、Air780EXX 系列、Air8000 系列模組,Air6101/Air8101 不支持此功能。
今天的內(nèi)容就分享到這里了~
審核編輯 黃宇
-
IO
+關注
關注
0文章
510瀏覽量
42850 -
硬件
+關注
關注
12文章
3623瀏覽量
69151 -
定時器
+關注
關注
23文章
3370瀏覽量
124410
發(fā)布評論請先 登錄
吉事勵引領電動汽車充電互操作性與兼容性測試新風向
是德科技攜手愛立信賦能Pre-6G互操作性驗證
通過恩智浦RW612三頻無線MCU提升多協(xié)議互操作性
JSON:簡潔代碼高效搞定序列化與反序列化
【ioqueue】 IO序列化操作全解析
極簡代碼,搞定JSON序列化與反序列化
IO序列化操作:提升系統(tǒng)互操作性的關鍵技術
評論