跳轉到

範例:GPIO 脈衝寬度觸發

Protocol Exerciser 可在支援的接腳上武裝 GPIO 脈衝寬度觸發,並在量測到的脈衝符合設定規則時送出全域事件。使用 AqProtocolExerciser.set_gpio_trigger 武裝硬體,並為 PxGpioTriggerEvent 註冊處理函式。處理函式收到 PxGpioTriggerEvent(來自 aqpxlib.event)。

限制

  • 接腳: 脈衝寬度觸發與脈衝產生僅支援 GPIO 索引 8 與 9(與 send_gpio_pulse 相同)。
  • 持續時間: min_duration_ns 與 max_duration_ns 都必須大於 5 ns 且小於 1 s。
  • 事件: 在 exerciser session 上為 PxGpioTriggerEvent 註冊處理函式。這是全域事件,不是裝置層級事件。

設定觸發

呼叫 set_gpio_trigger,參數如下: | 引數 | 意義 | | -------- | ------- | | gpio_idx | 接腳索引(8 或 9)。 | | min_duration_ns / max_duration_ns | 脈衝寬度視窗,單位奈秒。 | | low_pulse | 為 True 時考慮低準位脈衝。 | | high_pulse | 為 True 時考慮高準位脈衝。 | | mode | PxGpioWidthTriggerMode.TRIGGER_PULSE_WIDTH_IN_RANGE(預設)或 TRIGGER_PULSE_WIDTH_OUT_OF_RANGE。 |

mode 決定寬度落在 [min, max] 之內或之外時是否觸發。

處理 gpio_trigger

處理函式收到 PxGpioTriggerEvent(aqpxlib.event),欄位如下:

欄位 型別 意義
pin_idx int 造成觸發的接腳索引。
pulse_duration int 量測到的寬度(奈秒)。
pulse_polarity bool 偵測到的脈衝極性。

範例

下列腳本在接腳 8 武裝範圍內觸發、註冊處理函式,再用 send_gpio_pulse 發出短脈衝讓處理函式執行。若由外部設備驅動該接腳,請自行替換脈衝呼叫。

run_gpio_trigger_example.py
import logging
import threading

from aqpxlib import AqProtocolExerciser
from aqpxlib.event import PxGpioTriggerEvent
from aqpxlib.gpio import PxGpioWidthTriggerMode, PxIoState

logger = logging.getLogger(__name__)


def run_gpio_trigger_example() -> None:
    with AqProtocolExerciser.connect(port=60600) as px:
        done = threading.Event()

        def on_gpio_trigger(g: PxGpioTriggerEvent) -> None:
            logger.info(
                "GPIO trigger: pin=%d duration_ns=%d polarity=%s",
                g.pin_idx,
                g.pulse_duration,
                g.pulse_polarity,
            )
            done.set()

        px.add_event_handler(PxGpioTriggerEvent, on_gpio_trigger)

        pin = 8
        px.set_gpio_trigger(
            gpio_idx=pin,
            min_duration_ns=500,
            max_duration_ns=50_000,
            low_pulse=True,
            high_pulse=True,
            mode=PxGpioWidthTriggerMode.TRIGGER_PULSE_WIDTH_IN_RANGE,
        )

        px.send_gpio_pulse(
            gpio_idx=pin,
            active_state=PxIoState.HIGH,
            idle_state=PxIoState.LOW,
            active_time_ns=5000,
        )

        assert done.wait(timeout=3), "GPIO trigger event not received"


if __name__ == "__main__":
    logging.basicConfig(format="[%(levelname)s] %(message)s")
    logger.setLevel(logging.INFO)
    run_gpio_trigger_example()

執行:

python run_gpio_trigger_example.py

另見