跳转至

25 exairlinkwdt-AirLink看门狗

作者:马梦阳 | 最后修改:2026-07-23

一、概述

该扩展库基于合宙 LuatOS 和 AirLink 通信协议设计,用于实现主机与从机之间互看门狗功能。

库代码中默认空闲电平为 低电平,用于带 三极管 设计的双向互看门狗电路,电路设计可以参考:Air1601 开发板设计文件

如果采用直连方式,只需将空闲电平配置为对应电平即可。

二、硬件接线框图及核心业务逻辑说明

hardware_logic_block

三、喂狗数据格式

使用固定字符串命令格式:

3.1 用户命令

通过 feed() 接口发送的命令:

操作类型 命令格式 说明
正常喂狗 "WDT:FEED" 发送喂狗信号,重置对端的等待喂狗超时定时器
强制复位 "WDT:RESET" 发送强制复位命令,触发对端设备复位

3.2 内部命令

扩展库内部自动发送的命令,不支持用户直接使用:

操作类型 命令格式 说明
开启看门狗 "WDT:OPEN" open() 接口内部发送,对端收到后配置 TO_RESET 管脚并启动等待喂狗超时定时器
关闭看门狗 "WDT:CLOSE" close() 接口内部发送,对端收到后停止等待喂狗超时定时器并恢复 TO_RESET 管脚
参数更新 "WDT:UPDATE:timeout=300,feed_interval=200" update() 接口内部发送,对端收到后更新本端参数

四、核心示例

4.1 完整核心示例

-- 引入看门狗扩展库
local exairlinkwdt = require("exairlinkwdt")

-- 完整核心示例任务
local function wdt_demo_task()
    -- 初始化看门狗,TO_RESET 使用 GPIO27,常态电平为低电平
    local success = exairlinkwdt.open({ 
        reset_pin = 27, 
        reset_idle_level = 0 
    })

    if success then
        log.info("main", "看门狗初始化成功")
    else
        log.error("main", "看门狗初始化失败")
        return
    end

    -- 示例1:手动喂狗(正常喂狗)
    sys.wait(10000)  -- 等待10秒
    local result = exairlinkwdt.feed(0)
    if result then
        log.info("main", "手动喂狗成功")
    end

    -- 示例2:更新参数
    sys.wait(20000)  -- 等待20秒

    -- 只更新超时时长
    result = exairlinkwdt.update({ timeout = 300 })
    if result then
        log.info("main", "超时时长更新成功")
    end

    sys.wait(10000)  -- 等待10秒

    -- 只更新喂狗周期
    result = exairlinkwdt.update({ feed_interval = 200 })
    if result then
        log.info("main", "喂狗周期更新成功")
    end

    sys.wait(10000)  -- 等待10秒

    -- 同时更新两个参数
    result = exairlinkwdt.update({ timeout = 350, feed_interval = 250 })
    if result then
        log.info("main", "参数更新成功")
    end

    sys.wait(10000)  -- 等待10秒

    -- 更新对端参数
    result = exairlinkwdt.update({ timeout = 400, target = 0 })
    if result then
        log.info("main", "对端参数更新成功")
    end

    -- 示例3:强制复位
    sys.wait(30000)  -- 等待30秒
    result = exairlinkwdt.feed(1)
    if result then
        log.info("main", "强制复位命令发送成功")
    end

    -- 示例4:关闭看门狗
    sys.wait(60000)  -- 等待60秒
    result = exairlinkwdt.close()
    if result then
        log.info("main", "看门狗已关闭")
    end
end

-- 启动示例任务
sys.taskInit(wdt_demo_task)

4.2 FOTA 升级示例

4.2.1 使用 libfota 库(libfota/libfota2/libfota3)

使用 libfota 库(libfota/libfota2/libfota3)进行 FOTA 升级时,差分包下载成功后,库会自动调用 feed(0) 喂狗并延长看门狗超时时长,无需用户手动操作。

-- 引入看门狗扩展库
local exairlinkwdt = require("exairlinkwdt")
-- local libfota = require("libfota")
-- local libfota2 = require("libfota2")
-- local libfota3 = require("libbfota3") -- 仅限合宙内部项目使用

local function wdt_task()
    -- 初始化看门狗,TO_RESET 使用 GPIO27,常态电平为低电平
    local success = exairlinkwdt.open({ 
        reset_pin = 27, 
        reset_idle_level = 0 
    })

    if success then
        log.info("main", "看门狗初始化成功")
    else
        log.error("main", "看门狗初始化失败")
        return
    end

end

local function fota_upgrade_task()
    -- 根据实际情况配置 FOTA 升级参数
    -- 差分包下载成功后,libfota 库(libfota/libfota2/libfota3)会自动调用 exairlinkwdt.feed(0) 喂狗
    -- 同时会自动调用 exairlinkwdt.update() 延长看门狗超时时长(如:timeout = 600 秒)
end

-- 启动看门狗任务
sys.taskInit(wdt_task)
-- 启动 FOTA 升级任务
sys.taskInit(fota_upgrade_task)

4.2.2 使用 fota 核心库

使用 fota 核心库进行 FOTA 升级时,用户需要在下载差分包后手动调用 feed(0) 喂狗并延长对端的等待喂狗超时时长。

-- 引入看门狗扩展库
local exairlinkwdt = require("exairlinkwdt")

local function wdt_task()
    -- 初始化看门狗,TO_RESET 使用 GPIO27,常态电平为低电平
    local success = exairlinkwdt.open({ 
        reset_pin = 27, 
        reset_idle_level = 0 
    })

    if success then
        log.info("main", "看门狗初始化成功")
    else
        log.error("main", "看门狗初始化失败")
        return
    end

end

-- FOTA 升级任务
local function fota_upgrade_task() 
    -- 下载差分包(示例)
    -- ... 下载逻辑 ...

    -- 差分包下载成功后,手动喂狗并延长对端的等待喂狗超时时长
    log.info("main", "差分包下载成功,喂狗并延长对端的等待喂狗超时时长")

    -- 喂狗
    exairlinkwdt.feed(0)

    -- 延长对端的等待喂狗超时时长到 600 秒
    exairlinkwdt.update({ timeout = 600, target = 0 })

    -- 执行升级
    -- ... 升级逻辑 ...

    -- 升级完成后重启
    sys.wait(1000)
    pm.reboot()
end

-- 启动看门狗任务
sys.taskInit(wdt_task)
-- 启动 FOTA 升级任务
sys.taskInit(fota_upgrade_task)

五、常量详解

exairlinkwdt 扩展库无常量。

六、函数详解

6.1 exairlinkwdt.open(options)

功能:

以 Air1601 主控 + Air780ER2 为例。

当 Air1601 调用 open() 接口后,Air1601 端的 exairlinkwdt 库内部执行如下操作:

  1. 记录用户配置的 TO_RESET 管脚号和常态电平;

  2. 通过 airlink.sdata() 接口给 Air780ER2 发送开启喂狗的命令;

  3. 开启喂狗定时器;

Air780ER2 在收到 Air1601 发来的开启喂狗命令后,Air780ER2 端的 exairlinkwdt 库内部执行如下操作:

  1. 将 Air780ER2 端调用 open() 接口时记录的用户配置的 TO_RESET 管脚配置为输出模式;

  2. 将 Air780ER2 端调用 open() 接口时记录的用户配置的常态电平设置为对应电平状态(不传时默认为低电平);

  3. 开启等待喂狗超时定时器;

同理,Air780ER2 调用 open() 接口时也是相同的操作。

注意事项:

  • 重复调用时,如果已初始化且未 close,直接返回 false

  • 初始化成功后喂狗定时器立即开始工作

  • 初始化成功后立即执行一次喂狗

参数

options

参数含义:配置参数,参数为table类型,table内容格式说明如下:
        {
                -- 参数含义:TO_RESET 管脚号,用于输出高电平复位对端设备;
                -- 数据类型:number;
                -- 取值范围:有效的 GPIO 号,具体取值取决于硬件平台;
                -- 是否必选:必须传入此参数;
                -- 注意事项:该管脚会被配置为输出模式,常态电平状态取决于 reset_idle_level;
                -- 参数示例:reset_pin = 27
                reset_pin = ,

                -- 参数含义:TO_RESET 管脚常态电平,此时指的是正常状态下的输出电平;
                -- 数据类型:boolean;
                -- 取值范围:0 或 1;
                -- 是否必选:可选传入此参数,默认为低电平;
                -- 注意事项:不填此参数时默认为低电平,复位时输出高电平;
                -- 参数示例:reset_idle_level = 0
                reset_idle_level = ,
        }
数据类型:table;
取值范围:见下方子参数说明;
是否必选:必须传入此参数;
注意事项:必须传入有效的 table 类型参数,否则会返回 false;
参数示例:exairlinkwdt.open({ reset_pin = 10 ,reset_idle_level = 0 })

返回值

local success = exairlinkwdt.open(options)

有一个返回值 success

success

含义说明:初始化操作是否成功;
数据类型:boolean;
取值范围:true 或 false;
注意事项:参数无效或 GPIO 初始化失败时返回 false;
返回示例:true

示例

local exairlinkwdt = require("exairlinkwdt")

-- 初始化看门狗,TO_RESET 使用 GPIO27
local success = exairlinkwdt.open({ reset_pin = 27 })
if success then
    print("看门狗初始化成功")
else
    print("看门狗初始化失败")
end

6.2 exairlinkwdt.feed(mode)

功能: 喂狗操作,发送喂狗或强制复位命令到对端设备。

注意事项:

  • 正常喂狗会重置对端的等待喂狗超时定时器

  • 强制复位会发送 "WDT:RESET" 命令,对端收到后自行复位

  • 命令通过 airlink.sdata(data) 接口发送

参数

mode

参数含义:喂狗模式;
数据类型:number;
取值范围:0 或 1;
是否必选:必须传入此参数;
注意事项:0 表示正常喂狗,发送 "WDT:FEED" 命令;1 表示强制复位,发送 "WDT:RESET" 命令;
参数示例:exairlinkwdt.feed(0)

返回值

local success = exairlinkwdt.feed(mode)

有一个返回值 success

success

含义说明:喂狗操作是否成功;
数据类型:boolean;
取值范围:true 或 false;
注意事项:airlink 发送失败时返回 false;
返回示例:true

示例

-- 正常喂狗
local success = exairlinkwdt.feed(0)
if success then
    print("喂狗成功")
else
    print("喂狗失败")
end

-- 强制复位
success = exairlinkwdt.feed(1)

6.3 exairlinkwdt.close()

功能:

以 Air1601 主控 + Air780ER2 为例。

当 Air1601 调用 close() 接口后,Air1601 端的 exairlinkwdt 库内部执行如下操作:

  1. 关闭喂狗定时器;

  2. 通过 airlink.sdata() 接口给 Air780ER2 发送关闭喂狗的命令;

Air780ER2 在收到 Air1601 发来的关闭喂狗命令后,Air780ER2 端的 exairlinkwdt 库内部执行如下操作:

  1. 关闭等待喂狗超时定时器;

  2. 将 Air780ER2 端调用 open() 接口时记录的用户配置的 TO_RESET 管脚配置由原来的输出模式配置为输入模式;

同理,Air780ER2 调用 close() 接口时也是相同的操作。

注意事项:

  • 未初始化时调用,直接返回 false

参数

返回值

local success = exairlinkwdt.close()

有一个返回值 success

success

含义说明:关闭操作是否成功;
数据类型:boolean;
取值范围:true 或 false;
注意事项:未初始化时调用,直接返回 false;
返回示例:true

示例

local success = exairlinkwdt.close()
if success then
    print("看门狗已关闭")
else
    print("看门狗关闭失败")
end

6.4 exairlinkwdt.update(params)

功能: 更新看门狗参数,支持更新单个或多个参数。

注意事项:

  • 支持更新单个参数

  • 只更新喂狗周期时,要求小于当前超时时间

  • 只更新超时时间时,要求大于当前喂狗周期

  • 两个都更新时,先更新喂狗周期

  • 更新喂狗周期时,如果喂狗定时器正在运行,立即重置喂狗定时器

  • 只更新超时时长时,不重启等待喂狗超时定时器,等下次收到喂狗命令时自然重置

参数

params

参数含义:参数配置,参数为table类型,table内容格式说明如下:
         {
            -- 参数含义:超时时长,超过此时长未收到喂狗信号则触发复位;
            -- 数据类型:number;
            -- 取值范围:正整数,单位为秒;
            -- 是否必选:可选传入此参数,默认值为 240 秒;
            -- 注意事项:必须大于当前喂狗周期 feed_interval;
            -- 参数示例:timeout = 300
            timeout = ,

            -- 参数含义:喂狗周期,喂狗定时器按此周期自动发送喂狗命令;
            -- 数据类型:number;
            -- 取值范围:正整数,单位为秒;
            -- 是否必选:可选传入此参数,默认值为 150 秒;
            -- 注意事项:必须小于当前超时时间 timeout;
            -- 参数示例:feed_interval = 200
            feed_interval = ,

            -- 参数含义:更新目标;
            -- 数据类型:number;
            -- 取值范围:0 或 1;0 表示更新本端参数(默认),1 表示更新对端参数;
            -- 是否必选:可选传入此参数,默认为 0;
            -- 注意事项:更新对端参数时,会发送 "WDT:UPDATE:" 命令给对端;
            -- 参数示例:target = 1
            target = ,
         }
数据类型:table;
取值范围:见下方子参数说明;
是否必选:必须传入此参数;
注意事项:至少需要传入 timeout 或 feed_interval 中的一个参数;
参数示例:exairlinkwdt.update({ timeout = 300 })

返回值

local success = exairlinkwdt.update(params)

有一个返回值 success

success

含义说明:更新操作是否成功;
数据类型:boolean;
取值范围:true 或 false;
注意事项:参数校验失败时返回 false,如 feed_interval 大于 timeout;
返回示例:true

示例

-- 只更新超时时长
local success = exairlinkwdt.update({ timeout = 300 })
if success then
    print("超时时长更新成功")
end

-- 只更新喂狗周期
success = exairlinkwdt.update({ feed_interval = 200 })

-- 同时更新两个参数
success = exairlinkwdt.update({ timeout = 300, feed_interval = 200 })

-- 更新对端参数
success = exairlinkwdt.update({ timeout = 300, target = 0 })

七、版本更新说明

版本号:202607190000

1、更新时间:2026-07-19 00:00

2、更新内容

  • 新增电平极性说明,说明 NPN 三极管的电平极性关系
  • 修改默认空闲电平为低电平(reset_idle_level = 0)

版本号:202607161200

1、更新时间:2026-07-16 12:00

2、更新内容

  • 新增 exairlinkwdt.open() 接口,初始化看门狗并启动喂狗定时器
  • 新增 exairlinkwdt.feed() 接口,支持正常喂狗和强制复位功能
  • 新增 exairlinkwdt.close() 接口,关闭看门狗并发送关闭命令到对端
  • 新增 exairlinkwdt.update() 接口,支持更新本端或对端的喂狗周期和超时时长
  • 新增 exairlinkwdt.version() 接口,获取库版本信息
  • 新增喂狗定时器功能,按周期自动发送喂狗命令
  • 新增等待喂狗超时定时器功能,监控对端设备喂狗状态
  • 新增懒加载机制,收到喂狗命令时自动配置 GPIO
  • 新增参数校验机制,确保参数有效性和合法性

八、产品支持说明

支持 LuatOS 开发的产品都支持 exairlinkwdt 扩展库。

不过需要主机/从机模组都支持AirLink 核心库。

AI问答