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

下面演示使用硬件定時(shí)器精確控制 DHT11 通信時(shí)序,通過捕獲下降沿時(shí)間戳解碼溫濕度數(shù)據(jù),實(shí)現(xiàn)微秒級(jí)精確通信:
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 校驗(yàn)
8bit 校驗(yàn) = 8bit 濕度整數(shù)數(shù)據(jù) +8bit 濕度小數(shù)數(shù)據(jù) +8bit 溫度整數(shù)數(shù)據(jù) +8bit 溫度小數(shù)數(shù)據(jù)
校驗(yàn)可以判斷數(shù)據(jù)是否正確發(fā)送
DHT11 工作時(shí)序:
主機(jī)發(fā)送起始信號(hào)以后,DHT11 發(fā)送響應(yīng)信號(hào),然后發(fā)送 40bit 的數(shù)據(jù),高位在前
總時(shí)序圖如下:

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

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


具體波形如下:




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

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


可變寬度脈沖序列


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

cmd_cnt

repeat_cnt

返回值
無返回值。
示例

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

time_us

time_tick

continue

返回值
無返回值。
示例

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

返回值
無返回值。
示例

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

pin

is_input

pull_mode

init_level

返回值
無返回值。
示例

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

pin

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

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

pin

level

返回值
無返回值。
示例

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

pin

pull_mode

irq_mode

max_tick

返回值
無返回值。
示例

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

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

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

pin

返回值
無返回值。
示例

ioqueue.get(hwtimer_id, input_buff, capture_buff)
功能
獲取 io 操作隊(duì)列中輸入和捕獲的數(shù)據(jù)。
注意事項(xiàng)
input,set_cap,capture 這三個(gè)配置接口配置的功能,緩存到的輸入數(shù)據(jù)和捕獲數(shù)據(jù),都是通過 get 接口來讀取出來
input_buff ← 存儲(chǔ) ioqueue.input() 的即時(shí)電平采樣結(jié)果
capture_buff ← 存儲(chǔ) ioqueue.capture() 的邊沿事件 + 時(shí)間戳
input_cnt = 成功的 ioqueue.input() 操作數(shù)量
capture_cnt = 成功的 ioqueue.icapture() 操作數(shù)量(可能因超時(shí)而小于計(jì)劃數(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)
功能
啟動(dòng) io 操作隊(duì)列。
參數(shù)
hwtimer_id

返回值
無返回值。
示例

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

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

cmd_cnt

示例

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

返回值
無返回值。
示例

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

返回值
無返回值。
示例

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

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

示例

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

pull_mode

irq_mode

onoff

返回值
無返回值。
示例

五、模組支持說明
僅支持 Air700EXX 系列、Air780EXX 系列、Air8000 系列模組,Air6101/Air8101 不支持此功能。
今天的內(nèi)容就分享到這里了~
審核編輯 黃宇
-
IO
+關(guān)注
關(guān)注
0文章
510瀏覽量
42501 -
硬件
+關(guān)注
關(guān)注
11文章
3594瀏覽量
69005 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3368瀏覽量
123566
發(fā)布評(píng)論請(qǐng)先 登錄
是德科技攜手愛立信賦能Pre-6G互操作性驗(yàn)證
通過恩智浦RW612三頻無線MCU提升多協(xié)議互操作性
JSON:簡(jiǎn)潔代碼高效搞定序列化與反序列化
【ioqueue】 IO序列化操作全解析
極簡(jiǎn)代碼,搞定JSON序列化與反序列化
IO序列化操作:提升系統(tǒng)互操作性的關(guān)鍵技術(shù)
評(píng)論