This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/CC2650:当我使用调试器对其进行刷写时、传感器标签自定义映像正常工作、但在进行 OAD 操作时、它无法正常工作。

Guru**** 2473270 points
Other Parts Discussed in Thread: CC2650, CC2650STK, CC2640, CC1350, CC1350STK

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/604113/ccs-cc2650-sensor-tag-custom-image-is-working-when-i-am-flashing-it-with-the-debugger-but-while-doing-oad-it-is-not-working

器件型号:CC2650
主题中讨论的其他部件:CC2640CC1350SYSBIOSCC1350STK

工具/软件:Code Composer Studio

您好!

我已经修改了传感器标签示例代码以一直广播它、并构建了项目。它正在成功构建、我正在使用调试器器器件包来烧录传感器标签 CC2650中的程序、 到目前为止工作正常。但当我尝试执行 OAD 时、设备正在接受来自中央设备的整个文件、但它不会更新到我的映像版本、它仍保留在以前的工作版本中。

我有以下设置的一些信息:

BLE SDK: :BLE_SDK_2_02_01_18

编译器::TI v 5.2.9

创建 OAD 文件的步骤。

1.使用上面提到的编译器使用 CCS Studio 构建程序 并生成 hex 文件。

2.使用 merge.bat 实用程序生成其他两个十六进制文件。这将创建两个十六进制文件。 'sensortag_cc2650stk_all' 和'sensortag_cc2650stk_app_stack_oad'。

3.使用'HEX2BIN.py'脚本生成'sensortag_cc2650stk_app_stack_oad'的二进制文件。 它将根据需要生成二进制文件、我将使用该文件作为 OAD。

已删除的结果:传感器标签图像应将版本更改为我的自定义版本。

实际结果:传感器标签仍在文件的早期版本中。

这里的任何帮助都将非常方便。

提前感谢。

此致、

Deepak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    整个图像通过无线传输后、传感器标签就不会重新启动。这是否意味着传输的图像不正确?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Deepak Kumar25、您好!
    您需要3个文件才能在 CC2650上使用 OAD。
    + BIM 文件
    +应用程序文件
    +堆栈文件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Luu Vy:
    对于 OAD、我只需要从代码生成的 OAD 文件。之后、我将使用通用 hex2bin.py 实用程序将生成的 hex 文件转换为 bin 文件。但它不起作用。您能告诉我您在 OAD 过程中遵循的步骤。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Deepak Kumar25、您好!
    您可以在中看到更多详细信息

    processors.wiki.ti.com/.../CC2650_SensorTag_User's_Guide
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我对 TI 员工的行为感到失望、因为我在这么多天前就发布了我的担忧、但没有人来寻求帮助。我猜这是错误的。该论坛仅用于帮助人们。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Vy Luu:
    我遵循了相同的步骤、图像将通过 BLE 传输到传感器标签、但不会更新到新构建。 我认为图像检查失败了、但我不知道如何解决这个问题。 我在代码中所做的更改就在这里。 我将添加此项、以便您可以帮助我。这是我在 sensortag.c 文件中所做的唯一更改、以便我可以在定义的时间后重置我的系统。它也可以正常工作、但 OAD 映像不工作。

    /*********

    @文件 sensortag.c

    @简介此文件是 SensorTag 应用程序的主体。

    组:WCS、BTS
    目标器件:CC2650、CC2640、CC1350

    秘书长的报告

    版权所有(c) 2015-2016、德州仪器(TI)公司
    保留所有权利。

    以源代码和二进制形式重新分发和使用、有无
    允许进行修改、前提是满足以下条件
    符合:

    *源代码的重新分发必须保留上述版权
    声明、此条件列表和以下免责声明。

    *二进制形式的再发行必须复制上述版权
    注意、本条件列表和中的以下免责声明
    分发时提供的文档和/或其他材料。

    *德州仪器公司的名称和名称均不相同
    其贡献者可用于认可或推广衍生产品
    未经特定的事先书面许可。

    本软件由版权所有者和贡献者"按原样"提供
    以及任何明示或暗示的保证、包括但不限于
    对特定适销性和适用性的隐含保证
    不承认目的。 在任何情况下、版权所有者不得或
    任何直接、间接、偶然、特殊、
    惩罚性或后果性损害(包括但不限于
    采购替代货物或服务;丧失使用、数据或利润;
    或业务中断)、无论原因是什么以及任何责任理论、
    无论是合同、严格责任还是侵权行为(包括疏忽或)
    否则)因使用本软件而以任何方式产生、
    即使被告知可能会发生此类损坏。

    秘书长的报告
    版本名称:BLE_SDK_2_02_01_18
    发布日期:2016年10月26日15:20:04
    (小部分 /

    /*********
    *包括
    *
    #include
    #include

    #include
    #include
    #include
    #include
    #include
    #include
    编号
    #include

    #include "gatt.h"
    #include "hci.h"
    #include "gapgattserver.h"
    #include "gattservapp.h"
    #include "gapbondmgr.h"
    #include "osal_SNV.h"
    #include "util.h"
    #include "iCall_apimsg.h"

    #include "SensorI2C.h"
    #include "SensorTagTest.h"
    #include "sensortag_revision.h"
    #include "Board.h"
    #include "SensorUtil.h"
    #include "devinfoservice.h"
    #include "movementservice.h"
    #include "displayservice.h"
    #include "sensortag_register.h"
    #ifdef factory_image
    #include "sensortag_facoryreset.h"
    #endif

    // SensorTag 板载器件
    #include "st_util.h"

    #include "sensortag_tmp.h"
    #include "sensortag_hum.h"
    #include "sensortag_bar.h"
    #include "sensortag_mov.h"
    #include "sensortag_opt.h"
    #include "sensortag_keys.h"
    #include "sensortag_io.h"
    #include "sensortag_Batt。h"
    #include "sensortag_audio.h"
    #include "sensortag_oad.h"
    #include "sensortag_conn_ctrl.h"

    // DevPack 器件
    #include "sensortag_display.h"
    #include "sensortag_light.h"

    /*********
    *常量
    *
    #_ //
    #__
    // ()
    #__ _____

    //执行周期性事件的频率(以毫秒为单位)
    #define ST_PERIOD_EVT_PERIOD 1000

    //可发现设备时的广播间隔是多少
    //(625us 单位、160=100ms)
    #define DEFAULT_advertising_interval 160

    //常规可发现模式无限期广播
    #define DEFAULT_DISCOVERAING_MODE GAP_ADTYPE_FLAGS_GENERAL

    //如果是自动连接,则最小连接间隔(单位为1.25ms,80=100ms)
    //启用参数更新请求
    #define DEFAULT_MIVEed_MIN_CONN_INTERVAL 8.

    //最大连接间隔(单位为1.25ms、800=1000ms)(如果是自动)
    //启用参数更新请求
    #define DEFAULT_MODED_MAX_CONN_INTERVAL 800

    //启用自动参数更新请求时要使用的从器件延迟
    #define DEFAULT_REGLED_SLAVE_LON延 时 0

    //如果是自动参数,则监控超时值(10ms、1000=10s 的单位)
    //更新请求已启用
    #define DEFAULT_MODED_CONN_TIMEOUT 100

    //是否在启用自动参数更新请求时启用
    //建立连接
    #define DEFAULT_ENABLE_UPDATE_REQUEST GAPROLE_LINK_PARAM_UPDATE_WAIT_Bot_Params

    //连接暂停外围设备时间值(以秒为单位)
    #define DEFAULT_CONN_PAUSE_PERIFICD 1

    //公司标识符:Texas Instruments Inc.(13)
    #define TI_COMPANY_ID 0x000D
    #define TI_ST_DEVICE_ID 0x03
    #define TI_ST_KEY_DATA_ID 0x00

    //板地址的长度
    #define B_ADDR_STR_LEN 15.

    #if 已定义(PLUS_Broadcaster)
    #define ADV_IN_CONN_WAIT 500 //延迟500 ms
    #endif

    //任务配置
    #define ST_TASK_PRIORITY 1

    #ifndef ST_TASK_STACK_SIZE
    //堆栈大小可被项目设置覆盖
    #define ST_TASK_STACK_SIZE 700
    #endif

    // RTOS 应用程序的内部事件
    #define ST_State_change_EVT 0x0001
    #define ST_CHAR_CHANGE_EVT 0x0002
    #define ST_Period_EVT 0x0004
    #define SBP_OAD_WRITE_EVT 0x0008

    //其他
    #define INVALID_CONNNANDLE 0xFFFF
    #define TEST_ING_FINTSN 5 //闪烁次数
    #define OAD_PACKET_SIZE 18
    #define KEY_STATE_OFFSET 13 //广播数据中的偏移量

    /*********
    * typedef
    *

    //从配置文件传递的应用程序事件。
    typedef 结构

    uint8_t 事件;//哪个配置文件的事件
    uint8_t serviceID;//新状态
    uint8_t 参数 ID;
    } stEvt_t;

    /*********
    *全局变量
    *
    //配置文件状态和参数
    gaprole_states_t gapProfileState = GAPROLE_init;

    //全局信号量,用于将事件发布到应用程序线程
    ICall_Semaphore SEM;

    //全局实体 ID,用于检查消息的来源和/或目的地
    iCall_EntityID self EntityMain;

    //全局引脚资源
    PIN_STATE 引脚 GpioState;
    PIN_Handle hGpioPin;

    /*********
    *局部变量
    *

    //任务配置
    静态 Task_StructsensorTagTask;
    静态特性 sensorTagTaskStack[ST_TASK_STACK_SIZE];

    //全局实体 ID,用于检查消息的来源和/或目的地

    //内部周期事件的时钟实例。
    静态时钟结构周期时钟;
    _;
    //用于应用程序消息的队列对象
    静态队列结构附加消息;
    静态队列句柄 appMsgQueue;

    //内部应用程序事件的事件标志。
    静态 uint16_t 事件;
    =;
    //自检结果
    静态 uint8_t selfTestMap;

    // GAP -扫描 RSP 数据(最大大小= 31字节)
    静态 uint8_t scanRspData[]=

    编号
    //
    //
    _____,
    ''、''、''、''、''、''、 ''、''、''、''、''、''、''、 ''、''、''、''、''、''、 ''、
    编号
    // //
    _____,
    ''、''、''、''、''、''、 ''、''、''、''、''、''、 ''、
    编号

    //连接间隔范围
    0x05、//此数据的长度
    GAP_ADTYPE_SLAVE_CONN_INTERVE_RANGE、
    LO_UINT16 (DEFAULT_REGLED_MIN_CONN_INTERVAL)、
    HI_UINT16 (default_desired _min_CONN_interval)、
    LO_UINT16 (DEFAULT_REGLED_MAX_CONN_INTERVAL)、
    HI_UINT16 (DEFAULT_MRED_MAX_CONN_INTERVAL)、

    // Tx 功率级别
    0x02、//此数据的长度
    GAP_ADTYPE_POWER_LEVEL、
    0 // 0dBm
    };

    // GAP -广播数据(最大大小= 31字节、尽管如此
    //在广播时保持最佳短路以节省电量)
    静态 uint8_t advertData[]=

    //标志;这会将设备设置为使用有限的可发现设备
    //模式(一次广播30秒)而不是一般模式
    //可发现模式(无限期广播)
    0x02、//此数据的长度
    GAP_ADTYPE_FLAGS、
    DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED、

    //服务 UUID,通知中央设备包含哪些服务
    //中
    0x03、//此数据的长度
    GAP_ADTYPE_16BIT_more、 //一些 UUID,但不是全部
    #ifdef include_display
    LO_UINT16 (display_SERV_UUID)、
    hi_uint16 (display_SERV_UUID)、
    其他
    LO_UINT16 (MOVITY_SERV_UUID)、
    hi_uint16 (move_SERV_UUID)、
    #endif

    //制造商特定的广告数据
    0x06、
    GAP_ADTYPE_MANUFACTURER_SPECIFIC,
    LO_UINT16 (TI_COMPANY_ID)、
    hi_uint16 (TI_company_ID)、
    TI_ST_DEVICE_ID、
    TI_ST_KEY_DATA_ID、
    0x00 //关键状态
    };

    //设备信息参数
    #ifdef CC1350STK
    静态常量 uint8_t devInfoModelNumber[]="CC1350 SensorTag";
    其他
    静态常量 uint8_t devInfoModelNumber[]="PSSENSBANKB";
    #endif
    静态常量 uint8_t devInfona[]= "北美";
    静态常量 uint8_t devInfoFirmwareRev[]= FW_VERSION_STR;
    静态常量 uint8_t devInfoMfrName[]= "预防传感器";
    静态 const uint8_t * devInfoHardwareRev = devInfonA;

    // GAP GATT 属性
    静态常量 uint8_t * attDeviceName = devInfoModelNumber;

    //应用程序主动使用的引脚
    静态 PIN_Config SensorTagAppPinTable[]=

    Board_LED1 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、 /* LED 最初关闭 *
    Board_LED2 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、 /* LED 最初关闭 *
    BOARD_KEY_LEFT | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_迟滞、 /*按钮为低电平有效 *
    BOARD_KEY_RIGHT | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_迟滞、 /*按钮为低电平有效 *
    Board_relay | PIN_INPUT_EN | PIN_PULLDOWN | PIN_IRQ_BOTHEDGES | PIN_迟滞、 /*继电器高电平有效 *
    Board_蜂 鸣器 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、 /*蜂鸣器最初关闭 *

    PIN_TERMINATE
    };

    /*********
    *本地函数
    *

    静态空 SensorTag_init (空);
    静态空 SensorTag_taskFxn (UARg a0、UARg A1);
    静态空 SensorTag_processStackMsg (iCall_HDR *pMsg);
    静态空 SensorTag_processGATTMsg (gattMsgEvent_t *pMsg);
    静态空 SensorTag_processAppMsg (stEvt_t * pMsg);
    静态空 SensorTag_processStateChangeEvt (gaprole_states_t newState);
    静态空 SensorTag_processCharValueChangeEvt (uint8_t serviceID、uint8_t paramID);
    静态空 SensorTag_stateChangeCB (gaprole_states_t newState);
    静态空 SensorTag_resetAllModules (空);
    静态空 SensorTag_clockHandler (UARg 参数);
    静态空 SensorTag_enqueueMsg (uint8_t 事件、uint8_t 服务 ID、uint8_t 参数 ID);
    静态空 SensorTag_callback (PIN_Handle handle、PIN_ID pinId);
    静态空 SensorTag_setDeviceInfo (空);
    ();
    /*********
    *配置文件回调
    *

    // GAP 角色回调
    静态 gapRolesCBs_t sensorTag_gapRoleCBs =

    SensorTag_stateChangeCB //配置文件状态更改回调
    };

    // GAP 债券经理回调
    静态 gapBondCBs_t sensorTag_bondMgrCBs =

    空、//密码回调(不被应用程序使用)
    空//配对/绑定状态回调(不被应用使用)
    };

    /*********
    *公共函数
    *

    /*********
    *@fn SensorTag_createTask
    *
    *@SensorTag 的简短任务创建函数。
    *
    *@param none
    *
    *@返回无
    *
    void SensorTag_createTask (void)

    Task_Params taskParams;

    //配置任务
    Task_Params_init (&taskParams);
    taskParams.stack = sensorTagTaskStack;
    taskParams.STACKSIZE = ST_TASK_STACK_SIZE;
    taskParams.priority = ST_TASK_priority;

    Task_construction (&sensorTagTask、SensorTag_taskFxn、&taskParams、NULL);


    /*********
    *@fn SensorTag_testResult
    *
    *@简单获取自检结果
    *
    *@param none
    *
    *@返回具有自检结果的位图
    *
    uint8_t SensorTag_testResult (空)

    返回自测图;


    /*********
    *@fn SensorTag_init
    *
    *@在初始化期间调用的简短说明、其中包含应用程序
    * 特定初始化(即硬件初始化/设置、
    * 表初始化、加电通知等)和
    * 配置文件初始化/设置。
    *
    *@param none
    *
    *@返回无
    *
    静态空 SensorTag_init (空)

    //为传感器设置 I2C
    SensorI2C_open ();

    //处理按钮、LED、继电器
    hGpioPin = PIN_OPEN (&pinGpioState、SensorTagAppPinTable);
    PIN_registerIntCb (hGpioPin、SensorTag_callback);

    秘书长的报告
    //在调用 iCall_registerApp 之前可能会发生 N0栈 API 调用
    秘书长的报告
    //将当前线程注册为 iCall 调度应用程序
    //以便应用程序可以发送和接收消息。
    iCall_registerApp (self EntityMain、&sem);

    //为要发送到应用程序的配置文件中的消息创建 RTOS 队列。
    appMsgQueue = Util_constructQueue (&appMsg);

    //为内部周期事件创建一次性时钟。
    Util_constructClock (周期时钟、SensorTag_clockHandler、
    ST_PERIOD_EVT_PERIOD、0、false、ST_PERIOD_EVT);
    //- 。
    (&、、_、_、_、);

    //设置间隙
    GAP_SetParamValue (TGAP_CONN_PAUSE_PERUSTRUST、DEFAULT_CONN_PAUSE_PERUSTRUST);

    //设置 GAP 外围设备角色配置文件

    //对于所有硬件平台,设备在初始化时开始广播
    uint8_t 初始化地址使能= true;

    //通过将此值设置为零,器件将在之后进入等待状态
    //可发现30.72秒,并且不会再次进行广播
    //直到启用程序设置回 true
    uint16_t advertOffTime = 0;

    uint8_t enableUpdateRequest = default_enable_update_request;
    uint16_t desedMinInterval = default_desed_min_CONN_interval;
    uint16_t desedMaxInterval = default_desed_MAX_CONN_INTERVAL;
    uint16_t desedSlaveLatency = default_desed_slave_latency;
    uint16_t desedConnTimeout = default_desed_CONN_TIMEOUT;

    //设置 GAP 角色参数
    GAPRole_SetParameter (GAPROLE_Adverte_enabled、sizeof (uint8_t)、
    初始化启用(&A);
    GAPRole_SetParameter (GAPROLE_GOOD_OFF_TIME、sizeof (uint16_t)、
    advertOffTime (advertOffTime)(&D);

    GAPRole_SetParameter (GAPROLE_SCAN_RSP_DATA、sizeof (scanRspData)、
    scanRspData);
    GAPRole_SetParameter (GAPROLE_adverted_data、sizeof (advertData)、advertData);

    GAPRole_SetParameter (GAPROLE_PARAM_UPDATE_ENABLE、sizeof (uint8_t)、
    enableUpdateRequest (enableUpdateRequest)(enableUpdateRequest));
    GAPRole_SetParameter (GAPROLE_MIN_CONN_INTERVAL、sizeof (uint16_t)、
    需要最小间隔(&D);
    GAPRole_SetParameter (GAPROLE_MAX_CONN_INTERVAL、sizeof (uint16_t)、
    指定最大间隔(&D);
    GAPRole_SetParameter (GAPROLE_SLAVE_DELUMMER、sizeof (uint16_t)、
    希望从属延迟(&D);
    GAPRole_SetParameter (GAPROLE_TIMEOUT_MULTIER、sizeof (uint16_t)、
    希望连接超时(&N);


    //设置间隙特性
    GGS_SetParameter (GGS_DEVICE_NAME_ATT、GAP_DEVICE_NAME_LEN、
    (void*) attDeviceName);

    //设置广播间隔

    uint16_t advInt = default_advertising_interval;

    GAP_SetParamValue (TGAP_LIM_DISC_ADV_INT_MIN、advInt);
    GAP_SetParamValue (TGAP_LIM_DISC_ADV_INT_MAX、advInt);
    GAP_SetParamValue (TGAP_GEN_DISC_ADV_INT_MIN、advInt);
    GAP_SetParamValue (TGAP_GEN_DISC_ADV_INT_MAX、advInt);


    //设置 GAP 绑定管理器

    uint32_t 密钥= 0;//密钥"000000"
    uint8_t pairMode = GAPBOND_Pairing_mode_wait_for_Req;
    uint8_t MIPTM = false;
    uint8_t ioCap = GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT;
    uint8_t 绑定= true;

    GAPBondMgr_SetParameter (GAPBOND_DEFAULT_Passcode、sizeof (uint32_t)、
    密钥);
    GAPBondMgr_SetParameter (GAPBOND_Pairing_mode、sizeof (uint8_t)、&pairMode);
    GAPBondMgr_SetParameter (GAPBOND_MITM_protection、sizeof (uint8_t)、&MIPTM);
    GAPBondMgr_SetParameter (GAPBOND_IO_Capabilities、sizeof (uint8_t)、&ioCap);
    GAPBondMgr_SetParameter (GAPBOND_BUSIONIND_ENABLED、sizeof (uint8_t)、&bonding);


    //初始化 GATT 属性
    GGS_AddService (GATT_All_services); //间隙
    GATTServApp_AddService (GATT_All_services);// GATT 属性

    //添加设备信息服务。
    DevInfo_AddService();

    //添加特定于应用的设备信息
    SensorTag_setDeviceInfo();

    //添加电池监控器
    SensorTagBatt_init();

    //针对传感器、闪存和 DevPack 的加电自检
    selfTestMap = SensorTag_testExecute (ST_TEST_MAP);

    IF (自测图= ST_TEST_MAP)

    #ifdef IOID_GREEN LED
    //闪烁绿色 LED
    SensorTagIO_blinkLed (IOID_GREEN _LED、TEST_Inding_Blink_kind闪烁);
    其他
    //闪烁红色 LED
    SensorTagIO_blinkLed (IOID_RED_LED、TEST_Inding_Blink_kind闪烁);
    #endif

    其他

    //闪烁红色 LED
    SensorTagIO_blinkLed (IOID_RED_LED、TEST_Inding_Blink_kind闪烁);


    #ifdef factory_image
    //检查出厂映像是否存在,并在必要时应用当前映像
    如果(!SensorTagFactoryReset_hasImage())

    if (!SensorTagFactoryReset_storeCurrentImage())

    //存储出厂映像失败应报告为闪存故障
    selfTestMap &=~SENSOR_FLASH_TEST_BM;


    #endif

    //传感器模块
    SensorTagTmp_init(); //红外温度传感器
    SensorTagHum_init(); //湿度传感器
    SensorTagBar_init(); //压力传感器
    SensorTagita_itaginit(); //移动处理器
    SensorTagOpt_init(); //光学传感器

    //辅助模块
    SensorTagKeys_init(); //密钥和中继处理
    SensorTagIO_init(); // IO (LED+蜂鸣器+自检)
    SensorTagRegister_init (); //注册服务
    SensorTagAudio_init (); //语音控制
    SensorTagOad_init(); //无线下载

    // DevPack 器件
    SensorTagDisplay_init(); // Display DevPack
    SensorTagLight_init(); // LED 灯 DevPack

    //启动设备
    GAPRole_StartDevice (&sensorTag_gapRoleCBs);

    //启动 Bond Manager
    void GAPBondMgr_Register (&sensorTag_bondMgrCBs);

    //启用密钥和中继的中断处理
    PIN_registerIntCb (hGpioPin、SensorTag_callback);


    /*********
    *@fn SensorTag_taskFxn
    *
    *@SensorTag 的简要应用任务入口点
    *
    *@param a0、A1 (未使用)
    *
    *@返回无
    *
    静态空 SensorTag_taskFxn (UARg a0、UARg A1)

    静态 uint16_t 计数器=0;
    //初始化应用程序
    SensorTag_init();

    //应用程序主循环
    对于(;)

    //
    (=)

    =;
    ++;
    (>=_)

    ()// 。 。

    ();




    _(&);


    //等待与调用线程关联的信号量。
    //请注意、当发出信号时、与线程关联的信号量会发出信号
    //消息在线程的消息接收队列中排队,或在何时排队
    // iCall_signal ()函数被调用到信号量上。
    iCall_errno errno = iCall_Wait (ICALL_TIMEOUT_FOREVAL);

    if (errno =ICALL_errno_Success)

    iCall_EntityID dest;
    iCall_ServiceEnum src;
    iCall_HciExtEvt *pMsg =空;

    if (iCall_fetchServiceMsg (&src、&dest、
    (void **)&pMsg)=ICALL_errno_Success)

    IF (((src=ICALL_SERVICE_CLASS_BLE)&&(dest =self EntityMain))

    //处理任务间消息
    SensorTag_processStackMsg ((iCall_HDR *) pMsg);


    if (pMsg)

    iCall_freeMsg (pMsg);



    //如果 RTOS 队列不为空,则处理应用程序消息。
    while (!Queue_empty (appMsgQueue))

    stEvt_t *pMsg =(stEvt_t *) Util_dequeueMsg (appMsgQueue);
    if (pMsg)

    //处理消息。
    SensorTag_processAppMsg (pMsg);

    //从消息中释放空间。
    iCall_free (pMsg);



    //处理新数据(如果可用)
    SensorTagKeys_processEvent();
    #ifndef exclude_audio
    if (gapProfileState = GAPROLE_Connected)

    SensorTagAudio_processEvent();

    #endif
    SensorTagOpt_processSensorEvent();
    SensorTagait_processSensorEvent();
    SensorTagBatt_processSensorEvent();


    if (!!(事件和 ST_Period_EVT))

    事件&=~ST_Period_EVT;

    if (gapProfileState = GAPROLE_advertising)

    Util_startClock (周期时钟);


    //通告时闪烁绿色 LED
    if (gapProfileState = GAPROLE_advertising)

    #ifdef IOID_GREEN LED
    SensorTagIO_BLinkLed (IOID_GREEN LED、1);
    其他
    SensorTagIO_BLinkLed (IOID_RED_LED、1);
    #endif
    #ifdef include_display
    SensorTagDisplay_showBatteryLevel();
    #endif



    // OAD 事件队列
    SensorTagOad_processEvent();
    }//任务循环



    /*********
    *@fn SensorTag_setDeviceInfo
    *
    *@简要设置特定于应用的器件信息
    *
    *@param none
    *
    *@返回无
    *
    静态空 SensorTag_setDeviceInfo (空)

    DevInfo_SetParameter (DevInfo_model_number、sizeof (devInfoModelNumber)、
    (void*)devInfoModelNumber);
    DevInfo_SetParameter (DevInfo_serial_number、sizeof (devInfoNA)、
    (void*)devInfona);
    DevInfo_SetParameter (DevInfo_software_REV、sizeof (devInfoNA)、
    (void*)devInfona);
    DevInfo_SetParameter (DevInfo_firmware_REV、sizeof (devInfoFirmwareRev)、
    (void*)devInfoFirmwareRev);
    DevInfo_SetParameter (DevInfo_hardware_REV、sizeof (devInfoHardwareRev)、
    (void*)devInfoHardwareRev);
    DevInfo_SetParameter (DevInfo_manufacturer_name、sizeof (devInfoMfrName)、
    (void*)devInfoMfrName);


    /*********
    *@fn SensorTag_processAppMsg
    *
    *@简要处理来自配置文件的传入回调。
    *
    *@param pMsg -要处理的消息
    *
    *@返回无
    *
    静态空 SensorTag_processAppMsg (stEvt_t * pMsg)

    switch (pMsg->EVENT)

    案例 ST_State_change_EVT:
    SensorTag_processStateChangeEvt ((gaprole_states_t) pMsg->serviceID);
    中断;

    案例 ST_CHAR_CHANGE_EVT:
    SensorTag_processCharValueChangeEvt (pMsg->serviceID、pMsg->paramID);
    中断;

    默认值:
    //不执行任何操作。
    中断;



    /*********
    *@fn SensorTag_stateChangeCB
    *
    *@GAP 角色的简短回叫、指示角色状态更改。
    *
    *@param newState - new state
    *
    *@返回无
    *
    静态空 SensorTag_stateChangeCB (gaprole_states_t newState)

    SensorTag_enqueueMsg (ST_State_change_EVT、newState、NULL);


    /*********
    *@fn SensorTag_processStateChangeEvt
    *
    *@简要处理待处理的 GAP 角色状态更改事件。
    *
    *@param newState - new state
    *
    *@返回无
    *
    静态空 SensorTag_processStateChangeEvt (gaprole_states_t newState)

    #ifdef PLUS_Broadcaster
    静态 bool ConnfirstFlag = false;
    #endif // plus_broadcaster

    开关(新状态)

    案例 GAPROLE_Started:

    uint8_t ownAddress[B_ADDR_LEN];
    uint8_t systemId[DevInfo_system_ID_LEN];
    #ifdef IOID_GREEN LED
    SensorTagIO_BLinkLed (IOID_GREEND_LED、5);
    #endif
    GAPRole_GetParameter (GAPROLE_BD_ADDR、ownAddress);

    //将6个字节的设备地址用于8个字节的系统 ID 值
    SystemID[0]= ownAddress[0];
    SystemID[1]= ownAddress[1];
    SystemID[2]= ownAddress[2];

    //将中间字节设置为零
    SystemID[4]= 0x00;
    SystemID[3]= 0x00;

    //向上移动三个字节
    SystemID[7]= ownAddress[5];
    SystemID[6]= ownAddress[4];
    SystemID[5]= ownAddress[3];

    DevInfo_SetParameter (DevInfo_system_ID、DevInfo_system_ID_LEN、systemId);

    中断;

    案例 GAPROLE_advertising:
    //启动时钟
    if (!Util_isActive (周期时钟))

    Util_startClock (周期时钟);


    //确保按键没有卡住
    SensorTag_updateAddisingData (0);
    中断;

    案例 GAPROLE_Connected:

    //启动时钟
    if (!Util_isActive (周期时钟))

    Util_startClock (周期时钟);


    // LED 和蜂鸣器的转动
    PIN_setOutputValue (hGpioPin、Board_LED1、Board_LED_OFF);
    PIN_setOutputValue (hGpioPin、Board_LED2、Board_LED_OFF);
    PIN_setOutputValue (hGpioPin、Board_蜂 鸣器、Board_蜂 鸣器_off);

    //更新连接参数
    SensorTagConnectionControl_update();

    #ifdef PLUS_Broadcaster
    //仅在我们首次连接时打开此状态的广播
    //否则、当我们从 connected 广播返回到该状态时
    //我们将重新打开广播。
    if (ConnfirstFlag = false)

    uint8_t advertEnabled = true;//打开广播

    GAPRole_SetParameter (GAPROLE_Adverte_enabled、sizeof (uint8_t)、
    advertEnabled (advertEnabled)(&D);
    firstConnFlag =真;

    #endif // plus_broadcaster

    中断;

    案例 GAPROLE_Connected ADV:
    中断;

    案例 GAPROLE_等待:
    案例 GAPROLE_WAITING_FACT_TIMEOUT:
    SensorTag_resetAllModules ();
    中断;

    案例 GAPROLE_ERROR:
    SensorTag_resetAllModules ();
    PIN_setOutputValue (hGpioPin、Board_LED1、Board_LED_ON);
    中断;

    默认值:
    中断;


    gapProfileState = newState;

    #ifdef include_display
    SensorTagDisplay_showstatus();
    #endif // include_display


    /*********
    *@fn SensorTag_charValueChangeCB
    *
    *@传感器配置文件中的简短回调表示特征
    * 值变化。
    *
    *@param paramID -已更改值的参数 ID。
    *
    *@返回无
    *
    void SensorTag_charValueChangeCB (uint8_t serviceID、uint8_t paramID)

    SensorTag_enqueueMsg (ST_char_change_evt、serviceID、paramID);


    /*********
    *@fn SensorTag_processCharValueChangeEvt
    *
    *@暂挂配置文件特性值更改的简短流程
    * 事件。 事件由网络任务(BLE)生成
    *
    *@param serviceID -受影响服务的 ID
    *@param paramID -受影响参数的 ID
    *
    *@返回无
    *
    静态空 SensorTag_processCharValueChangeEvt (uint8_t serviceID、
    uint8_t 参数 ID)

    交换机(服务 ID)

    案例 SERVICE_ID_TMP:
    SensorTagTmp_processCharChangeEvt (paramID);
    中断;

    案例 service_ID_hum:
    SensorTagHum_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_BAR:
    SensorTagBar_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_MOV:
    SensorTag_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_OPT:
    SensorTagOpt_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_IO:
    SensorTagIO_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_BATT:
    SensorTagBatt_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_REGISTER:
    SensorTagRegister_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_CC:
    SensorConnTagControl_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_DISPLAY:
    SensorTagDisplay_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_LIGHT:
    SensorTagLight_processCharChangeEvt (paramID);
    中断;
    默认值:
    中断;



    /*********
    *@fn SensorTag_processStackMsg
    *
    *@简短处理传入的堆栈消息。
    *
    *@param pMsg -要处理的消息
    *
    *@返回无
    *
    静态空 SensorTag_processStackMsg (iCall_HDR *pMsg)

    switch (pMsg->EVENT)

    案例 GATT_MSG_EVENT:
    //处理 GATT 消息
    SensorTag_processGATTMsg ((gattMsgEvent_t *) pMsg);
    中断;

    默认值:
    //不执行任何操作
    中断;



    /*********
    *@fn SensorTag_processGATTMsg
    *
    *@简短处理 GATT 消息
    *
    *@返回无
    *
    静态空 SensorTag_processGATTMsg (gattMsgEvent_t *pMsg)

    GATT_BM_FREE (&pMsg->msg、pMsg->method);


    /*********
    *@fn SensorTag_clockHandler
    *
    *@用于时钟超时的简短处理函数。
    *
    *@param arg -事件类型
    *
    *@返回无
    *
    静态空 SensorTag_clockHandler (UARG 参数)

    //存储事件。
    事件|= arg;

    //唤醒应用程序。
    Semaphore_post (SEM);


    /*********
    *@ _
    *
    *@ 。
    *
    *@-
    *
    *@.
    *
    ()

    =;
    //。
    _();


    /*********
    *@fn SensorTag_enqueueMsg
    *
    *@brief 会创建一条消息并将该消息放入 RTOS 队列中。
    *
    *@参数事件-消息事件。
    *@param serviceID -服务标识符
    *@param paramID -参数标识符
    *
    *@返回无
    *
    静态空 SensorTag_enqueueMsg (uint8_t 事件、uint8_t 服务 ID、uint8_t 参数 ID)

    stEvt_t *pMsg;

    //创建消息的动态指针。
    if (((pMsg = iCall_malloc (sizeof (stEvt_t)))))

    pMsg->EVENT = EVENT;
    pMsg->serviceID = serviceID;
    pMsg->paramID = paramID;

    //将消息排队。
    Util_enqueueMsg (appMsgQueue、sem、(uint8_t*) pMsg);




    /*********
    *@fn SensorTag_resetAllModules
    *
    *@简短复位所有模块、通常在连接终止时。
    *
    *@param none
    *
    *@返回无
    *
    静态空 SensorTag_resetAllModules (空)

    SensorTagTmp_reset ();
    SensorTagHum_reset ();
    SensorTagBar_reset ();
    SensorTagait_reset ();
    SensorTagOpt_reset ();
    SensorTagBatt_reset ();
    SensorTagIO_reset ();
    SensorTagRegister_reset ();
    SensorTagKeys_reset ();
    SensorTagLight_reset ();


    /*
    *@fn SensorTag_callback
    *
    *按钮、继电器和 MPU 的中断服务例程
    *
    *@param 处理连接到回调的 PIN_Handle
    *
    *@param 触发回调的 DIO 的 pinId PIN_ID
    *
    *@返回 无
    秘书长的报告 /
    静态空 SensorTag_callback (PIN_Handle handle、PIN_ID pinId)

    开关(pinId)

    案例 Board_key_left:
    SensorTagKeys_processKeyLeft ();
    中断;

    案例 Board_key_right:
    SensorTagKeys_processKeyRight();
    中断;

    外壳板继电器:
    SensorTagKeys_processRelay();
    中断;

    默认值:
    /*不执行任何操作*/
    中断;




    /*********
    *@fn SensorTag_updateAddisingData
    *
    *@简要使用最新的按键按压状态更新广播数据
    *
    *@返回无
    *
    void SensorTag_updateAddisingData (uint8_t keyStatus)

    //在广播数据中记录密钥状态
    advertData[key_state_offset]= keyStatus;
    GAPRole_SetParameter (GAPROLE_adverted_data、sizeof (advertData)、advertData);


    /*********
    秘书长的报告 /
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因为编译器、图像变得不正确。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、最后一个代码中的文本未正确显示:
    /*********

    @文件 sensortag.c

    @简介此文件是 SensorTag 应用程序的主体。

    组:WCS、BTS
    目标器件:CC2650、CC2640、CC1350

    秘书长的报告

    版权所有(c) 2015-2016、德州仪器(TI)公司
    保留所有权利。

    以源代码和二进制形式重新分发和使用、有无
    允许进行修改、前提是满足以下条件
    符合:

    *源代码的重新分发必须保留上述版权
    声明、此条件列表和以下免责声明。

    *二进制形式的再发行必须复制上述版权
    注意、本条件列表和中的以下免责声明
    分发时提供的文档和/或其他材料。

    *德州仪器公司的名称和名称均不相同
    其贡献者可用于认可或推广衍生产品
    未经特定的事先书面许可。

    本软件由版权所有者和贡献者"按原样"提供
    以及任何明示或暗示的保证、包括但不限于
    对特定适销性和适用性的隐含保证
    不承认目的。 在任何情况下、版权所有者不得或
    任何直接、间接、偶然、特殊、
    惩罚性或后果性损害(包括但不限于
    采购替代货物或服务;丧失使用、数据或利润;
    或业务中断)、无论原因是什么以及任何责任理论、
    无论是合同、严格责任还是侵权行为(包括疏忽或)
    否则)因使用本软件而以任何方式产生、
    即使被告知可能会发生此类损坏。

    秘书长的报告
    版本名称:BLE_SDK_2_02_01_18
    发布日期:2016年10月26日15:20:04
    (小部分 /

    /*********
    *包括
    *
    #include
    #include

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #include "gatt.h"
    #include "hci.h"
    #include "gapgattserver.h"
    #include "gattservapp.h"
    #include "gapbondmgr.h"
    #include "osal_SNV.h"
    #include "util.h"
    #include "iCall_apimsg.h"

    #include "SensorI2C.h"
    #include "SensorTagTest.h"
    #include "sensortag_revision.h"
    #include "Board.h"
    #include "SensorUtil.h"
    #include "devinfoservice.h"
    #include "movementservice.h"
    #include "displayservice.h"
    #include "sensortag_register.h"
    #ifdef factory_image
    #include "sensortag_facoryreset.h"
    #endif

    // SensorTag 板载器件
    #include "st_util.h"

    #include "sensortag_tmp.h"
    #include "sensortag_hum.h"
    #include "sensortag_bar.h"
    #include "sensortag_mov.h"
    #include "sensortag_opt.h"
    #include "sensortag_keys.h"
    #include "sensortag_io.h"
    #include "sensortag_Batt。h"
    #include "sensortag_audio.h"
    #include "sensortag_oad.h"
    #include "sensortag_conn_ctrl.h"

    // DevPack 器件
    #include "sensortag_display.h"
    #include "sensortag_light.h"

    /*********
    *常量
    *
    #define RESET_RECEIVE_COUNTER 36. //基本值为10分钟
    #define RESET_RECEIVE_TED_MINUTE 600000
    //执行周期性事件的频率(以毫秒为单位)
    #define RESET_PERIOD_EVT_PERIOD RESET_Period_ten_minute

    //执行周期性事件的频率(以毫秒为单位)
    #define ST_PERIOD_EVT_PERIOD 1000

    //可发现设备时的广播间隔是多少
    //(625us 单位、160=100ms)
    #define DEFAULT_advertising_interval 160

    //常规可发现模式无限期广播
    #define DEFAULT_DISCOVERAING_MODE GAP_ADTYPE_FLAGS_GENERAL

    //如果是自动连接,则最小连接间隔(单位为1.25ms,80=100ms)
    //启用参数更新请求
    #define DEFAULT_MIVEed_MIN_CONN_INTERVAL 8.

    //最大连接间隔(单位为1.25ms、800=1000ms)(如果是自动)
    //启用参数更新请求
    #define DEFAULT_MODED_MAX_CONN_INTERVAL 800

    //启用自动参数更新请求时要使用的从器件延迟
    #define DEFAULT_REGLED_SLAVE_LON延 时 0

    //如果是自动参数,则监控超时值(10ms、1000=10s 的单位)
    //更新请求已启用
    #define DEFAULT_MODED_CONN_TIMEOUT 100

    //是否在启用自动参数更新请求时启用
    //建立连接
    #define DEFAULT_ENABLE_UPDATE_REQUEST GAPROLE_LINK_PARAM_UPDATE_WAIT_Bot_Params

    //连接暂停外围设备时间值(以秒为单位)
    #define DEFAULT_CONN_PAUSE_PERIFICD 1

    //公司标识符:Texas Instruments Inc.(13)
    #define TI_COMPANY_ID 0x000D
    #define TI_ST_DEVICE_ID 0x03
    #define TI_ST_KEY_DATA_ID 0x00

    //板地址的长度
    #define B_ADDR_STR_LEN 15.

    #if 已定义(PLUS_Broadcaster)
    #define ADV_IN_CONN_WAIT 500 //延迟500 ms
    #endif

    //任务配置
    #define ST_TASK_PRIORITY 1

    #ifndef ST_TASK_STACK_SIZE
    //堆栈大小可被项目设置覆盖
    #define ST_TASK_STACK_SIZE 700
    #endif

    // RTOS 应用程序的内部事件
    #define ST_State_change_EVT 0x0001
    #define ST_CHAR_CHANGE_EVT 0x0002
    #define ST_Period_EVT 0x0004
    #define SBP_OAD_WRITE_EVT 0x0008

    //其他
    #define INVALID_CONNNANDLE 0xFFFF
    #define TEST_ING_FINTSN 5 //闪烁次数
    #define OAD_PACKET_SIZE 18
    #define KEY_STATE_OFFSET 13 //广播数据中的偏移量

    /*********
    * typedef
    *

    //从配置文件传递的应用程序事件。
    typedef 结构

    uint8_t 事件;//哪个配置文件的事件
    uint8_t serviceID;//新状态
    uint8_t 参数 ID;
    } stEvt_t;

    /*********
    *全局变量
    *
    //配置文件状态和参数
    gaprole_states_t gapProfileState = GAPROLE_init;

    //全局信号量,用于将事件发布到应用程序线程
    ICall_Semaphore SEM;

    //全局实体 ID,用于检查消息的来源和/或目的地
    iCall_EntityID self EntityMain;

    //全局引脚资源
    PIN_STATE 引脚 GpioState;
    PIN_Handle hGpioPin;

    /*********
    *局部变量
    *

    //任务配置
    静态 Task_StructsensorTagTask;
    静态特性 sensorTagTaskStack[ST_TASK_STACK_SIZE];

    //全局实体 ID,用于检查消息的来源和/或目的地

    //内部周期事件的时钟实例。
    静态时钟结构周期时钟;
    静态时钟结构可复位时钟;
    //用于应用程序消息的队列对象
    静态队列结构附加消息;
    静态队列句柄 appMsgQueue;

    //内部应用程序事件的事件标志。
    静态 uint16_t 事件;
    静态 bool resetEvent=false;
    //自检结果
    静态 uint8_t selfTestMap;

    // GAP -扫描 RSP 数据(最大大小= 31字节)
    静态 uint8_t scanRspData[]=

    #ifdef CC1350STK
    //完整名称
    0x11、//此数据的长度
    GAP_ADTYPE_LOCAL_NAME_COMPLETE、
    'C'、'C'、'1'、'3'、'5'、 "0"、"、"S"、"e"、"e"、"n"、"n"、 "S"、"o"、"r"、"T"、"A"、 "G"、
    其他
    0x0C、//此数据的长度 //0x0C
    GAP_ADTYPE_LOCAL_NAME_COMPLETE、
    "P"、"S"、"S"、"E"、"N"、 "S"、"B"、"A"、"N"、"K"、 'b'、
    #endif

    //连接间隔范围
    0x05、//此数据的长度
    GAP_ADTYPE_SLAVE_CONN_INTERVE_RANGE、
    LO_UINT16 (DEFAULT_REGLED_MIN_CONN_INTERVAL)、
    HI_UINT16 (default_desired _min_CONN_interval)、
    LO_UINT16 (DEFAULT_REGLED_MAX_CONN_INTERVAL)、
    HI_UINT16 (DEFAULT_MRED_MAX_CONN_INTERVAL)、

    // Tx 功率级别
    0x02、//此数据的长度
    GAP_ADTYPE_POWER_LEVEL、
    0 // 0dBm
    };

    // GAP -广播数据(最大大小= 31字节、尽管如此
    //在广播时保持最佳短路以节省电量)
    静态 uint8_t advertData[]=

    //标志;这会将设备设置为使用有限的可发现设备
    //模式(一次广播30秒)而不是一般模式
    //可发现模式(无限期广播)
    0x02、//此数据的长度
    GAP_ADTYPE_FLAGS、
    DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED、

    //服务 UUID,通知中央设备包含哪些服务
    //中
    0x03、//此数据的长度
    GAP_ADTYPE_16BIT_more、 //一些 UUID,但不是全部
    #ifdef include_display
    LO_UINT16 (display_SERV_UUID)、
    hi_uint16 (display_SERV_UUID)、
    其他
    LO_UINT16 (MOVITY_SERV_UUID)、
    hi_uint16 (move_SERV_UUID)、
    #endif

    //制造商特定的广告数据
    0x06、
    GAP_ADTYPE_MANUFACTURER_SPECIFIC,
    LO_UINT16 (TI_COMPANY_ID)、
    hi_uint16 (TI_company_ID)、
    TI_ST_DEVICE_ID、
    TI_ST_KEY_DATA_ID、
    0x00 //关键状态
    };

    //设备信息参数
    #ifdef CC1350STK
    静态常量 uint8_t devInfoModelNumber[]="CC1350 SensorTag";
    其他
    静态常量 uint8_t devInfoModelNumber[]="PSSENSBANKB";
    #endif
    静态常量 uint8_t devInfona[]= "北美";
    静态常量 uint8_t devInfoFirmwareRev[]= FW_VERSION_STR;
    静态常量 uint8_t devInfoMfrName[]= "预防传感器";
    静态 const uint8_t * devInfoHardwareRev = devInfonA;

    // GAP GATT 属性
    静态常量 uint8_t * attDeviceName = devInfoModelNumber;

    //应用程序主动使用的引脚
    静态 PIN_Config SensorTagAppPinTable[]=

    Board_LED1 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、 /* LED 最初关闭 *
    Board_LED2 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、 /* LED 最初关闭 *
    BOARD_KEY_LEFT | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_迟滞、 /*按钮为低电平有效 *
    BOARD_KEY_RIGHT | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_迟滞、 /*按钮为低电平有效 *
    Board_relay | PIN_INPUT_EN | PIN_PULLDOWN | PIN_IRQ_BOTHEDGES | PIN_迟滞、 /*继电器高电平有效 *
    Board_蜂 鸣器 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、 /*蜂鸣器最初关闭 *

    PIN_TERMINATE
    };

    /*********
    *本地函数
    *

    静态空 SensorTag_init (空);
    静态空 SensorTag_taskFxn (UARg a0、UARg A1);
    静态空 SensorTag_processStackMsg (iCall_HDR *pMsg);
    静态空 SensorTag_processGATTMsg (gattMsgEvent_t *pMsg);
    静态空 SensorTag_processAppMsg (stEvt_t * pMsg);
    静态空 SensorTag_processStateChangeEvt (gaprole_states_t newState);
    静态空 SensorTag_processCharValueChangeEvt (uint8_t serviceID、uint8_t paramID);
    静态空 SensorTag_stateChangeCB (gaprole_states_t newState);
    静态空 SensorTag_resetAllModules (空);
    静态空 SensorTag_clockHandler (UARg 参数);
    静态空 SensorTag_enqueueMsg (uint8_t 事件、uint8_t 服务 ID、uint8_t 参数 ID);
    静态空 SensorTag_callback (PIN_Handle handle、PIN_ID pinId);
    静态空 SensorTag_setDeviceInfo (空);
    静态空 ResetHandler (UARg arg);
    /*********
    *配置文件回调
    *

    // GAP 角色回调
    静态 gapRolesCBs_t sensorTag_gapRoleCBs =

    SensorTag_stateChangeCB //配置文件状态更改回调
    };

    // GAP 债券经理回调
    静态 gapBondCBs_t sensorTag_bondMgrCBs =

    空、//密码回调(不被应用程序使用)
    空//配对/绑定状态回调(不被应用使用)
    };

    /*********
    *公共函数
    *

    /*********
    *@fn SensorTag_createTask
    *
    *@SensorTag 的简短任务创建函数。
    *
    *@param none
    *
    *@返回无
    *
    void SensorTag_createTask (void)

    Task_Params taskParams;

    //配置任务
    Task_Params_init (&taskParams);
    taskParams.stack = sensorTagTaskStack;
    taskParams.STACKSIZE = ST_TASK_STACK_SIZE;
    taskParams.priority = ST_TASK_priority;

    Task_construction (&sensorTagTask、SensorTag_taskFxn、&taskParams、NULL);


    /*********
    *@fn SensorTag_testResult
    *
    *@简单获取自检结果
    *
    *@param none
    *
    *@返回具有自检结果的位图
    *
    uint8_t SensorTag_testResult (空)

    返回自测图;


    /*********
    *@fn SensorTag_init
    *
    *@在初始化期间调用的简短说明、其中包含应用程序
    * 特定初始化(即硬件初始化/设置、
    * 表初始化、加电通知等)和
    * 配置文件初始化/设置。
    *
    *@param none
    *
    *@返回无
    *
    静态空 SensorTag_init (空)

    //为传感器设置 I2C
    SensorI2C_open ();

    //处理按钮、LED、继电器
    hGpioPin = PIN_OPEN (&pinGpioState、SensorTagAppPinTable);
    PIN_registerIntCb (hGpioPin、SensorTag_callback);

    秘书长的报告
    //在调用 iCall_registerApp 之前可能会发生 N0栈 API 调用
    秘书长的报告
    //将当前线程注册为 iCall 调度应用程序
    //以便应用程序可以发送和接收消息。
    iCall_registerApp (self EntityMain、&sem);

    //为要发送到应用程序的配置文件中的消息创建 RTOS 队列。
    appMsgQueue = Util_constructQueue (&appMsg);

    //为内部周期事件创建一次性时钟。
    Util_constructClock (周期时钟、SensorTag_clockHandler、
    ST_PERIOD_EVT_PERIOD、0、false、ST_PERIOD_EVT);
    //为内部复位周期性事件创建单次触发时钟。
    Util_constructClock (&resetClock、ResetHandler、RESET_PERIOD_EVT_PERIOD、RESET_PERIOD_EVT_PERIOD、TRUE、0);

    //设置间隙
    GAP_SetParamValue (TGAP_CONN_PAUSE_PERUSTRUST、DEFAULT_CONN_PAUSE_PERUSTRUST);

    //设置 GAP 外围设备角色配置文件

    //对于所有硬件平台,设备在初始化时开始广播
    uint8_t 初始化地址使能= true;

    //通过将此值设置为零,器件将在之后进入等待状态
    //可发现30.72秒,并且不会再次进行广播
    //直到启用程序设置回 true
    uint16_t advertOffTime = 0;

    uint8_t enableUpdateRequest = default_enable_update_request;
    uint16_t desedMinInterval = default_desed_min_CONN_interval;
    uint16_t desedMaxInterval = default_desed_MAX_CONN_INTERVAL;
    uint16_t desedSlaveLatency = default_desed_slave_latency;
    uint16_t desedConnTimeout = default_desed_CONN_TIMEOUT;

    //设置 GAP 角色参数
    GAPRole_SetParameter (GAPROLE_Adverte_enabled、sizeof (uint8_t)、
    初始化启用(&A);
    GAPRole_SetParameter (GAPROLE_GOOD_OFF_TIME、sizeof (uint16_t)、
    advertOffTime (advertOffTime)(&D);

    GAPRole_SetParameter (GAPROLE_SCAN_RSP_DATA、sizeof (scanRspData)、
    scanRspData);
    GAPRole_SetParameter (GAPROLE_adverted_data、sizeof (advertData)、advertData);

    GAPRole_SetParameter (GAPROLE_PARAM_UPDATE_ENABLE、sizeof (uint8_t)、
    enableUpdateRequest (enableUpdateRequest)(enableUpdateRequest));
    GAPRole_SetParameter (GAPROLE_MIN_CONN_INTERVAL、sizeof (uint16_t)、
    需要最小间隔(&D);
    GAPRole_SetParameter (GAPROLE_MAX_CONN_INTERVAL、sizeof (uint16_t)、
    指定最大间隔(&D);
    GAPRole_SetParameter (GAPROLE_SLAVE_DELUMMER、sizeof (uint16_t)、
    希望从属延迟(&D);
    GAPRole_SetParameter (GAPROLE_TIMEOUT_MULTIER、sizeof (uint16_t)、
    希望连接超时(&N);


    //设置间隙特性
    GGS_SetParameter (GGS_DEVICE_NAME_ATT、GAP_DEVICE_NAME_LEN、
    (void*) attDeviceName);

    //设置广播间隔

    uint16_t advInt = default_advertising_interval;

    GAP_SetParamValue (TGAP_LIM_DISC_ADV_INT_MIN、advInt);
    GAP_SetParamValue (TGAP_LIM_DISC_ADV_INT_MAX、advInt);
    GAP_SetParamValue (TGAP_GEN_DISC_ADV_INT_MIN、advInt);
    GAP_SetParamValue (TGAP_GEN_DISC_ADV_INT_MAX、advInt);


    //设置 GAP 绑定管理器

    uint32_t 密钥= 0;//密钥"000000"
    uint8_t pairMode = GAPBOND_Pairing_mode_wait_for_Req;
    uint8_t MIPTM = false;
    uint8_t ioCap = GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT;
    uint8_t 绑定= true;

    GAPBondMgr_SetParameter (GAPBOND_DEFAULT_Passcode、sizeof (uint32_t)、
    密钥);
    GAPBondMgr_SetParameter (GAPBOND_Pairing_mode、sizeof (uint8_t)、&pairMode);
    GAPBondMgr_SetParameter (GAPBOND_MITM_protection、sizeof (uint8_t)、&MIPTM);
    GAPBondMgr_SetParameter (GAPBOND_IO_Capabilities、sizeof (uint8_t)、&ioCap);
    GAPBondMgr_SetParameter (GAPBOND_BUSIONIND_ENABLED、sizeof (uint8_t)、&bonding);


    //初始化 GATT 属性
    GGS_AddService (GATT_All_services); //间隙
    GATTServApp_AddService (GATT_All_services);// GATT 属性

    //添加设备信息服务。
    DevInfo_AddService();

    //添加特定于应用的设备信息
    SensorTag_setDeviceInfo();

    //添加电池监控器
    SensorTagBatt_init();

    //针对传感器、闪存和 DevPack 的加电自检
    selfTestMap = SensorTag_testExecute (ST_TEST_MAP);

    IF (自测图= ST_TEST_MAP)

    #ifdef IOID_GREEN LED
    //闪烁绿色 LED
    SensorTagIO_blinkLed (IOID_GREEN _LED、TEST_Inding_Blink_kind闪烁);
    其他
    //闪烁红色 LED
    SensorTagIO_blinkLed (IOID_RED_LED、TEST_Inding_Blink_kind闪烁);
    #endif

    其他

    //闪烁红色 LED
    SensorTagIO_blinkLed (IOID_RED_LED、TEST_Inding_Blink_kind闪烁);


    #ifdef factory_image
    //检查出厂映像是否存在,并在必要时应用当前映像
    如果(!SensorTagFactoryReset_hasImage())

    if (!SensorTagFactoryReset_storeCurrentImage())

    //存储出厂映像失败应报告为闪存故障
    selfTestMap &=~SENSOR_FLASH_TEST_BM;


    #endif

    //传感器模块
    SensorTagTmp_init(); //红外温度传感器
    SensorTagHum_init(); //湿度传感器
    SensorTagBar_init(); //压力传感器
    SensorTagita_itaginit(); //移动处理器
    SensorTagOpt_init(); //光学传感器

    //辅助模块
    SensorTagKeys_init(); //密钥和中继处理
    SensorTagIO_init(); // IO (LED+蜂鸣器+自检)
    SensorTagRegister_init (); //注册服务
    SensorTagAudio_init (); //语音控制
    SensorTagOad_init(); //无线下载

    // DevPack 器件
    SensorTagDisplay_init(); // Display DevPack
    SensorTagLight_init(); // LED 灯 DevPack

    //启动设备
    GAPRole_StartDevice (&sensorTag_gapRoleCBs);

    //启动 Bond Manager
    void GAPBondMgr_Register (&sensorTag_bondMgrCBs);

    //启用密钥和中继的中断处理
    PIN_registerIntCb (hGpioPin、SensorTag_callback);


    /*********
    *@fn SensorTag_taskFxn
    *
    *@SensorTag 的简要应用任务入口点
    *
    *@param a0、A1 (未使用)
    *
    *@返回无
    *
    静态空 SensorTag_taskFxn (UARg a0、UARg A1)

    静态 uint16_t 计数器=0;
    //初始化应用程序
    SensorTag_init();

    //应用程序主循环
    对于(;)

    //重新启动传感器标签应用程序
    if (resetEvent =true)

    resetEvent =false;
    COUNTER++;
    if (counter>=reset_periode_counter)

    while (1)//计数器值将取决于时钟周期。此处为10分钟。

    SysCtrlSystemReset();


    其他

    Util_startClock (&resetClock);


    //等待与调用线程关联的信号量。
    //请注意、当发出信号时、与线程关联的信号量会发出信号
    //消息在线程的消息接收队列中排队,或在何时排队
    // iCall_signal ()函数被调用到信号量上。
    iCall_errno errno = iCall_Wait (ICALL_TIMEOUT_FOREVAL);

    if (errno =ICALL_errno_Success)

    iCall_EntityID dest;
    iCall_ServiceEnum src;
    iCall_HciExtEvt *pMsg =空;

    if (iCall_fetchServiceMsg (&src、&dest、
    (void **)&pMsg)=ICALL_errno_Success)

    IF (((src=ICALL_SERVICE_CLASS_BLE)&&(dest =self EntityMain))

    //处理任务间消息
    SensorTag_processStackMsg ((iCall_HDR *) pMsg);


    if (pMsg)

    iCall_freeMsg (pMsg);



    //如果 RTOS 队列不为空,则处理应用程序消息。
    while (!Queue_empty (appMsgQueue))

    stEvt_t *pMsg =(stEvt_t *) Util_dequeueMsg (appMsgQueue);
    if (pMsg)

    //处理消息。
    SensorTag_processAppMsg (pMsg);

    //从消息中释放空间。
    iCall_free (pMsg);



    //处理新数据(如果可用)
    SensorTagKeys_processEvent();
    #ifndef exclude_audio
    if (gapProfileState = GAPROLE_Connected)

    SensorTagAudio_processEvent();

    #endif
    SensorTagOpt_processSensorEvent();
    SensorTagait_processSensorEvent();
    SensorTagBatt_processSensorEvent();


    if (!!(事件和 ST_Period_EVT))

    事件&=~ST_Period_EVT;

    if (gapProfileState = GAPROLE_advertising)

    Util_startClock (周期时钟);


    //通告时闪烁绿色 LED
    if (gapProfileState = GAPROLE_advertising)

    #ifdef IOID_GREEN LED
    SensorTagIO_BLinkLed (IOID_GREEN LED、1);
    其他
    SensorTagIO_BLinkLed (IOID_RED_LED、1);
    #endif
    #ifdef include_display
    SensorTagDisplay_showBatteryLevel();
    #endif



    // OAD 事件队列
    SensorTagOad_processEvent();
    }//任务循环



    /*********
    *@fn SensorTag_setDeviceInfo
    *
    *@简要设置特定于应用的器件信息
    *
    *@param none
    *
    *@返回无
    *
    静态空 SensorTag_setDeviceInfo (空)

    DevInfo_SetParameter (DevInfo_model_number、sizeof (devInfoModelNumber)、
    (void*)devInfoModelNumber);
    DevInfo_SetParameter (DevInfo_serial_number、sizeof (devInfoNA)、
    (void*)devInfona);
    DevInfo_SetParameter (DevInfo_software_REV、sizeof (devInfoNA)、
    (void*)devInfona);
    DevInfo_SetParameter (DevInfo_firmware_REV、sizeof (devInfoFirmwareRev)、
    (void*)devInfoFirmwareRev);
    DevInfo_SetParameter (DevInfo_hardware_REV、sizeof (devInfoHardwareRev)、
    (void*)devInfoHardwareRev);
    DevInfo_SetParameter (DevInfo_manufacturer_name、sizeof (devInfoMfrName)、
    (void*)devInfoMfrName);


    /*********
    *@fn SensorTag_processAppMsg
    *
    *@简要处理来自配置文件的传入回调。
    *
    *@param pMsg -要处理的消息
    *
    *@返回无
    *
    静态空 SensorTag_processAppMsg (stEvt_t * pMsg)

    switch (pMsg->EVENT)

    案例 ST_State_change_EVT:
    SensorTag_processStateChangeEvt ((gaprole_states_t) pMsg->serviceID);
    中断;

    案例 ST_CHAR_CHANGE_EVT:
    SensorTag_processCharValueChangeEvt (pMsg->serviceID、pMsg->paramID);
    中断;

    默认值:
    //不执行任何操作。
    中断;



    /*********
    *@fn SensorTag_stateChangeCB
    *
    *@GAP 角色的简短回叫、指示角色状态更改。
    *
    *@param newState - new state
    *
    *@返回无
    *
    静态空 SensorTag_stateChangeCB (gaprole_states_t newState)

    SensorTag_enqueueMsg (ST_State_change_EVT、newState、NULL);


    /*********
    *@fn SensorTag_processStateChangeEvt
    *
    *@简要处理待处理的 GAP 角色状态更改事件。
    *
    *@param newState - new state
    *
    *@返回无
    *
    静态空 SensorTag_processStateChangeEvt (gaprole_states_t newState)

    #ifdef PLUS_Broadcaster
    静态 bool ConnfirstFlag = false;
    #endif // plus_broadcaster

    开关(新状态)

    案例 GAPROLE_Started:

    uint8_t ownAddress[B_ADDR_LEN];
    uint8_t systemId[DevInfo_system_ID_LEN];
    #ifdef IOID_GREEN LED
    SensorTagIO_BLinkLed (IOID_GREEND_LED、5);
    #endif
    GAPRole_GetParameter (GAPROLE_BD_ADDR、ownAddress);

    //将6个字节的设备地址用于8个字节的系统 ID 值
    SystemID[0]= ownAddress[0];
    SystemID[1]= ownAddress[1];
    SystemID[2]= ownAddress[2];

    //将中间字节设置为零
    SystemID[4]= 0x00;
    SystemID[3]= 0x00;

    //向上移动三个字节
    SystemID[7]= ownAddress[5];
    SystemID[6]= ownAddress[4];
    SystemID[5]= ownAddress[3];

    DevInfo_SetParameter (DevInfo_system_ID、DevInfo_system_ID_LEN、systemId);

    中断;

    案例 GAPROLE_advertising:
    //启动时钟
    if (!Util_isActive (周期时钟))

    Util_startClock (周期时钟);


    //确保按键没有卡住
    SensorTag_updateAddisingData (0);
    中断;

    案例 GAPROLE_Connected:

    //启动时钟
    if (!Util_isActive (周期时钟))

    Util_startClock (周期时钟);


    // LED 和蜂鸣器的转动
    PIN_setOutputValue (hGpioPin、Board_LED1、Board_LED_OFF);
    PIN_setOutputValue (hGpioPin、Board_LED2、Board_LED_OFF);
    PIN_setOutputValue (hGpioPin、Board_蜂 鸣器、Board_蜂 鸣器_off);

    //更新连接参数
    SensorTagConnectionControl_update();

    #ifdef PLUS_Broadcaster
    //仅在我们首次连接时打开此状态的广播
    //否则、当我们从 connected 广播返回到该状态时
    //我们将重新打开广播。
    if (ConnfirstFlag = false)

    uint8_t advertEnabled = true;//打开广播

    GAPRole_SetParameter (GAPROLE_Adverte_enabled、sizeof (uint8_t)、
    advertEnabled (advertEnabled)(&D);
    firstConnFlag =真;

    #endif // plus_broadcaster

    中断;

    案例 GAPROLE_Connected ADV:
    中断;

    案例 GAPROLE_等待:
    案例 GAPROLE_WAITING_FACT_TIMEOUT:
    SensorTag_resetAllModules ();
    中断;

    案例 GAPROLE_ERROR:
    SensorTag_resetAllModules ();
    PIN_setOutputValue (hGpioPin、Board_LED1、Board_LED_ON);
    中断;

    默认值:
    中断;


    gapProfileState = newState;

    #ifdef include_display
    SensorTagDisplay_showstatus();
    #endif // include_display


    /*********
    *@fn SensorTag_charValueChangeCB
    *
    *@传感器配置文件中的简短回调表示特征
    * 值变化。
    *
    *@param paramID -已更改值的参数 ID。
    *
    *@返回无
    *
    void SensorTag_charValueChangeCB (uint8_t serviceID、uint8_t paramID)

    SensorTag_enqueueMsg (ST_char_change_evt、serviceID、paramID);


    /*********
    *@fn SensorTag_processCharValueChangeEvt
    *
    *@暂挂配置文件特性值更改的简短流程
    * 事件。 事件由网络任务(BLE)生成
    *
    *@param serviceID -受影响服务的 ID
    *@param paramID -受影响参数的 ID
    *
    *@返回无
    *
    静态空 SensorTag_processCharValueChangeEvt (uint8_t serviceID、
    uint8_t 参数 ID)

    交换机(服务 ID)

    案例 SERVICE_ID_TMP:
    SensorTagTmp_processCharChangeEvt (paramID);
    中断;

    案例 service_ID_hum:
    SensorTagHum_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_BAR:
    SensorTagBar_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_MOV:
    SensorTag_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_OPT:
    SensorTagOpt_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_IO:
    SensorTagIO_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_BATT:
    SensorTagBatt_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_REGISTER:
    SensorTagRegister_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_CC:
    SensorConnTagControl_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_DISPLAY:
    SensorTagDisplay_processCharChangeEvt (paramID);
    中断;

    案例 SERVICE_ID_LIGHT:
    SensorTagLight_processCharChangeEvt (paramID);
    中断;
    默认值:
    中断;



    /*********
    *@fn SensorTag_processStackMsg
    *
    *@简短处理传入的堆栈消息。
    *
    *@param pMsg -要处理的消息
    *
    *@返回无
    *
    静态空 SensorTag_processStackMsg (iCall_HDR *pMsg)

    switch (pMsg->EVENT)

    案例 GATT_MSG_EVENT:
    //处理 GATT 消息
    SensorTag_processGATTMsg ((gattMsgEvent_t *) pMsg);
    中断;

    默认值:
    //不执行任何操作
    中断;



    /*********
    *@fn SensorTag_processGATTMsg
    *
    *@简短处理 GATT 消息
    *
    *@返回无
    *
    静态空 SensorTag_processGATTMsg (gattMsgEvent_t *pMsg)

    GATT_BM_FREE (&pMsg->msg、pMsg->method);


    /*********
    *@fn SensorTag_clockHandler
    *
    *@用于时钟超时的简短处理函数。
    *
    *@param arg -事件类型
    *
    *@返回无
    *
    静态空 SensorTag_clockHandler (UARG 参数)

    //存储事件。
    事件|= arg;

    //唤醒应用程序。
    Semaphore_post (SEM);


    /*********
    *@fn RESET_clockHandler
    *
    *@用于时钟超时的简短处理函数。
    *
    *@param arg -事件类型
    *
    *@返回无。
    *
    静态空 ResetHandler (UARg 参数)

    resetEvent =true;
    //唤醒应用程序。
    Semaphore_post (SEM);


    /*********
    *@fn SensorTag_enqueueMsg
    *
    *@brief 会创建一条消息并将该消息放入 RTOS 队列中。
    *
    *@参数事件-消息事件。
    *@param serviceID -服务标识符
    *@param paramID -参数标识符
    *
    *@返回无
    *
    静态空 SensorTag_enqueueMsg (uint8_t 事件、uint8_t 服务 ID、uint8_t 参数 ID)

    stEvt_t *pMsg;

    //创建消息的动态指针。
    if (((pMsg = iCall_malloc (sizeof (stEvt_t)))))

    pMsg->EVENT = EVENT;
    pMsg->serviceID = serviceID;
    pMsg->paramID = paramID;

    //将消息排队。
    Util_enqueueMsg (appMsgQueue、sem、(uint8_t*) pMsg);




    /*********
    *@fn SensorTag_resetAllModules
    *
    *@简短复位所有模块、通常在连接终止时。
    *
    *@param none
    *
    *@返回无
    *
    静态空 SensorTag_resetAllModules (空)

    SensorTagTmp_reset ();
    SensorTagHum_reset ();
    SensorTagBar_reset ();
    SensorTagait_reset ();
    SensorTagOpt_reset ();
    SensorTagBatt_reset ();
    SensorTagIO_reset ();
    SensorTagRegister_reset ();
    SensorTagKeys_reset ();
    SensorTagLight_reset ();


    /*
    *@fn SensorTag_callback
    *
    *按钮、继电器和 MPU 的中断服务例程
    *
    *@param 处理连接到回调的 PIN_Handle
    *
    *@param 触发回调的 DIO 的 pinId PIN_ID
    *
    *@返回 无
    秘书长的报告 /
    静态空 SensorTag_callback (PIN_Handle handle、PIN_ID pinId)

    开关(pinId)

    案例 Board_key_left:
    SensorTagKeys_processKeyLeft ();
    中断;

    案例 Board_key_right:
    SensorTagKeys_processKeyRight();
    中断;

    外壳板继电器:
    SensorTagKeys_processRelay();
    中断;

    默认值:
    /*不执行任何操作*/
    中断;




    /*********
    *@fn SensorTag_updateAddisingData
    *
    *@简要使用最新的按键按压状态更新广播数据
    *
    *@返回无
    *
    void SensorTag_updateAddisingData (uint8_t keyStatus)

    //在广播数据中记录密钥状态
    advertData[key_state_offset]= keyStatus;
    GAPRole_SetParameter (GAPROLE_adverted_data、sizeof (advertData)、advertData);


    /*********
    秘书长的报告 /
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Luu Vy:

    我认为需要更改配置文件、才能将生成的二进制文件成功传输到传感器标签、然后加载到传感器标签中。您能向我简要介绍一下您为项目设置的配置。

    此致、

    Deepak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Deepak、您好!

    根据我所知、将十六进制文件转换为二进制文件不足以使其成为 OAD 映像文件。 OAD 映像需要在映像开头包含元数据。 需要使用此元数据来执行 OAD 过程。

    如需更多信息、请参阅"CC2640 OAD BLE 用户指南"、该指南位于"C:\ti\simplelink\ble_sdk_2_02_01_18\docs"。

    -克尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Markel、
    我将按照该指南进行更新。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Deepak Kumar25、您好!
    您需要合并三个文件以生成 OAD 文件。
    + BIM 文件。 这是引导加载程序文件。 如果您使用 sensortag 板、请选择 Sensortag 的 BIM。
    +应用程序文件。 这是项目的应用固件
    +堆栈文件。 这是堆栈固件。
    注意:当您合并三个文件时、您需要注意 BIM、App、STACK 的地址。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    这确实是元数据问题。感谢你们的帮助,特别是 Markel 和 Luu Vy。