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.

[参考译文] RTOS/CC2640:SPI_TRANSFERT 锁定、具有简单的读取事务

Guru**** 2595800 points
Other Parts Discussed in Thread: CC2640, ADS1293, CC2650, CC1350

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/601307/rtos-cc2640-spi_transfer-locking-up-with-simple-read-transaction

器件型号:CC2640
Thread 中讨论的其他器件: ADS1293CC2650SYSBIOSCC1350

工具/软件:TI-RTOS

您好!

我在具有 CC2640F128RHB 处理器和 TI ADS1293芯片的定制电路板上使用 simple_peripheral 示例的修改版本。  CC2640和 ADS1293通过 SPI 进行连接。

在使用我们的定制板执行任何操作之前、我加载了未修改的 LaunchPad 版本的 simple_peripheral、并能够让该板通过 BLE 进行广播并获取其 MAC 地址。  之后、我添加了一个 RTOS 任务、该任务将使几个 LED 以大约半赫兹的频率闪烁。  这主要是为了进行彻底检查、以便查看电路板并知道它仍然有效。

此时、我有定制电路板闪烁灯、同时通过 BLE 进行广播。  接下来、我添加了用于设置 SPI、读取一个16位字、然后关闭 SPI 的代码。  这就是我现在陷入困境的地方。  我可以成功打开和关闭 SPI、但如果我尝试仅传输一个16位字、则传输会挂起。  我是在阻塞模式还是回调模式下进行传输、这无关紧要。  在阻塞模式下、处理器挂起、在回调模式下、回调函数永远不会执行。  还有人遇到过这样的情况吗?

TI-RTOS 版本为2.20.1.8、CC26xx BLE 堆栈版本为2.2.1.18

下面是相关的代码片段、显示了我为回调模式编写的内容。

(1)以下是 GPIO 位定义:
#define Board_RLED                 IOID_13
#define Board_GLED                 IOID_14
#define Board_LED_ON               0
#define Board_LED_OFF              1.
#define Board_SPI0_MISO            IOID_4
#define Board_SPI0_MOSI            IOID_3
#define Board_SPI0_CLK             IOID_2
#define Board_SPI0_CSn             IOID_6
#define Board_SPI_ADS1293_CSB      IOID_6
#define Board_SPI_ADS1293_DRDYB      IOID_11
#define Board_RST_ADS1293         IOID_0

(2)位的定义方式如下:
const PIN_Config BoardGpioInitTable[]={
   Board_RLED  | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、        /* LED 最初位于             */上
   Board_GLED  | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX,        /* LED 最初关闭            */
   BOARD_SPI_ADS1293_DRDYB | PIN_INPUT_EN | PIN_PULLUP、                                      /* ADS1293数据就绪中断引脚*
   BOARD_SPI_ADS1293_CSB | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、/* ADS1293芯片选择   *
   BOARD_SPI0_MOSI | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、     /* SPI 主器件输出-从器件输入*/
   Board_SPI0_MISO | PIN_INPUT_EN | PIN_PULLUP、                                              /* SPI 主器件输入-从器件输出*
   BOARD_SPI0_CLK | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、      /* SPI 时钟*
   BOARD_RST_ADS1293 | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、   /* ADS1293芯片复位   *
   PIN_TERMINATE
};

(3)这是代码。  对 SPI_init()的调用未显示、但在 ADS1293_init()之前调用
SPI_Params 参数;
SPI_Handle handle ={0};
SPI_Transaction 事务={0};
uint16_t txBuf[2]={0x8000、0};
uint16_t rxBuf[2]={0};
uint16_t Rx = 0xAAAA;
uint16_t TX = 0x5555;
SPI_Status stat;

void ADS1293TransferCallback (SPI_Handle cbHandle、SPI_Transaction * cbTransaction){
   Tx =*((uint16_t *)(cbTransaction ->txBuf));
   Rx =*((uint16_t *)(cbTransaction->rxBuf));
   STAT = cbTransaction->status;


void ADS1293_init(){
   SPI_PARAMS_INIT (params);
   params.transferMode = SPI_MODE_CALLACK;
   params.transferCallbackFxn = ADS1293TransferCallback;
   params.bitrate = 1000000;
   params.frameFormat = SPI_POL1_PHA0;
   params.dataSize = 16;
   params.mode = SPI_MASTER;

   transaction.count = 1;
   transaction.txBuf = txBuf;
   transaction.rxBuf = rxBuf;

   句柄= SPI_OPEN (0、params);
   if (handle!= NULL){
      SPI_TRANSFCTION (句柄、事务);
      SPI_Close (handle);
   }


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Michael McCully、
    为什么在 SPI_transfer 之后使用 SPI_Close (handle)? 在 SPI 传输中使用回叫模式。 如果在 SPI_transfer 后调用 SPI_close、则意味着您可以在 SPI 上的数据成功传输之前停止 SPI。 您可以尝试使用轮询模式
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Vy Luu:

    感谢您指出我的错误。 当然,在我的回调例程执行之前,我不能调用 SPI_CLOSE (),在删除 SPI_CLOSE ()调用之后,回调例程现在每次都成功执行。

    但是、阻塞模式仍然不起作用。 如果我尝试在阻塞模式(params.transferMode = SPI_MODE_BLOCKING)下仅执行一个16位 SPI_transfer ()调用、则永远不会返回对 SPI_transfer ()的调用。 我甚至用示波器探测 SPI I/O 线路、所有这些线路看起来都正常-在 SCLK 上针对16位传输的16个时钟等 但即使示波器跟踪看起来正常,SPI_TRANSF()也不会返回。 下面是我用于阻塞模式的 ADS1293_init()代码。

    void ADS1293_init(){
    SPI_PARAMS_INIT (params);
    params.transferMode = SPI_MODE_BLOCKING;
    params.bitrate = 1000000;
    params.frameFormat = SPI_POL1_PHA0;
    params.dataSize = 16;
    params.mode = SPI_MASTER;

    transaction.count = 1;
    transaction.txBuf = txBuf;
    transaction.rxBuf = rxBuf;

    句柄= SPI_OPEN (0、params);
    if (handle!= NULL){
    SPI_TRANSFCTION (句柄、事务);



    谢谢、
    Mike
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Michael McCully、
    我在您的代码中找不到任何问题。
    1/您可以尝试删除编译器中的优化选项并重新检查
    2您可以在 TI Lib 的 SPICC26XXDMA.c 中进行调试以检查问题。 应检查 SPICC26XXDMA_transfer 中的对象参数、例如:
    帧大小= SPICC26XXDMA_16位
    datasize = 16
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Vy Luu:

    我检查了您建议的所有内容。  删除所有编译器优化不会更改代码的行为、并且在 SPICC26XXDMA.C 中没有发现任何问题  我还尝试增加链接器中的堆栈大小、以防出现未报告的堆栈溢出、但这也没有改变任何东西。  接下来、我可以尝试对 SPI 引脚进行位拆裂、以确保从器件 SPI 芯片正常。

    但是、即使从器件芯片无法正常工作、CC2640 SPI 也不应锁定。

    感谢您的建议。

    此致、

    Mike

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Michael McCully、
    您是否要检查 SPICC26XXDMA_transfer 中的分步操作以确定 SPI 被阻止的位置? 并尝试通过 halGPIO 控制 CS。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Vy Luu:

    在我首次开机自检之前、我尝试使用 GPIO 调用控制 CS、而使用 GPIO 调用无法阻止锁定。

    下面是 CCS 调试器的部分屏幕截图、其中显示了程序锁定的位置。  当调用 semaphore_pend()时,它在第864行上。  您将注意到 Semaphore_pend()的参数列表中有一个对 Semaphore_handle ()的调用。  在 Semaphore_handle()中不会发生锁定,因为我能够使用调试器单步执行该调用。  然后、在 Semaphore_handle ()返回后、我尝试进入 Semaphore_pend ()、当我这么做时、调试器没有将我带入 Semaphore_pend ()。  我必须按下"Terminate"或"Pause"才能将控制权返回到调试器、因此锁定在 Semaphore_pend()中的某个位置发生。

    这是屏幕截图。

    谢谢、

    Mike

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Michael McCully、
    您可以在 SPI 设置中设置 transferTimeout 的超时。 但是、这不是最好的方法。
    您是否尝试将 Board_SPI1_CSn 设置为 PIN_Unassigned 并通过 PIN.h 控制 CS?
    是否确定 txBuf 和 rxBuf 的大小? 是否 uint16_t?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Vy Luu:

    我尝试了所有你要求的东西、但没有成功。 上述代码中未显示这些内容、但在发布第一篇文章之前、我已尝试了所有这些内容。

    详细信息如下:

    (1)当我调用 SPI_open()时,我将 SPI_Params:::transferTimeout 设置为1000,并且从未发生超时。 当系统节拍值为10us 时、超时本应在10ms 内发生、但从未发生过。 SPI_TRANSF()从未返回。

    (2)我还尝试将超时值设置为1、以查看会发生什么情况。 在这种情况下,也不会返回 SPI_TRANSF()。

    (3)我使用 SPI0外设进行 SPI 传输、当我在软件中控制 CS 时、是的、我确实将 SPI0_CSn 设置为 PIN_Unassigned。

    (4)您可以查看我的第一个帖子、并查看我在回调模式下所做的操作。 我对阻塞模式执行了同样的操作。 以下是我的第一篇文章中的数据声明和代码:

    --------------------------
    uint16_t txBuf[2]={0x8000、0};
    uint16_t rxBuf[2]={0};



    transaction.count = 1;
    transaction.txBuf = txBuf;
    transaction.rxBuf = rxBuf;
    --------------------------

    由于缓冲区是两个 uint16_t 元素的数组、事务数据大小为16位、事务计数为1、因此不应有存储器访问违规。

    再次感谢您花时间了解这一点。

    此致、
    Mike
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Michael McCully、
    您是否在逻辑分析仪上捕获 SPI 信号波形?
    然后发送您的代码文件?
    + board.c/h
    + simple_peripheral.c
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Vy Luu:

    我没有在逻辑分析仪上捕获 SPI 信号。 我有一个双通道示波器、虽然我无法同时查看所有四个通道、但我可以告诉您、当我查看一个信号相对于其他信号之一时、SCK、SDO、SDI 和 CS 信号是正确的。

    以下是您请求的*board*.h/c 和 simple_peripheral.c 文件:

    (1) board.h
    /*
    *版权所有(c) 2015-2016、德州仪器(TI)公司
    *保留所有权利。
    *
    *以源代码和二进制形式重新分发和使用、有无
    *如果满足以下条件、则允许进行修改
    符合*:
    *
    **源代码的重新分发必须保留上述版权
    *注意、此条件列表和以下免责声明。
    *
    **二进制形式的再发行必须复制上述版权
    *请注意、中的此条件列表和以下免责声明
    *随分发提供的文档和/或其他材料。
    *
    **德州仪器公司的名称和名称均不相同
    *其贡献者可用于认可或推广衍生产品
    *未经特定的事先书面许可。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *以及任何明示或暗示的保证、包括但不限于:
    *特定适销性和适用性的隐含保证
    *不承认目的。 在任何情况下、版权所有者不得或
    *派遣国应对任何直接、间接、偶然、特殊、
    *典型或必然的损害(包括但不限于
    *采购替代货物或服务;丧失使用、数据或利润;
    *或业务中断)、无论原因是什么以及任何责任理论、
    *无论是合同、严格责任还是侵权行为(包括疏忽或)
    *否则)因使用本软件而以任何方式产生、
    *即使被告知可能会发生此类损坏。
    *

    #ifndef __Board_H
    #define __Board_H

    #ifdef __cplusplus
    extern "C"{
    #endif

    #include

    #include "CC2650_LAUNCHXL.h"

    /*这些#defines 允许我们在其他器件系列中重复使用 TI-RTOS *
    #define Board_LED0 Board_RLED
    #define Board_LED1 Board_GLED
    #define Board_LED2 Board_LED0

    #define BOARD_BUTTON0 Board_BTN1
    #define Board_Button1 Board_BTN2

    #define Board_UART0 Board_UART
    #define Board_AES0 Board_AES
    #define Board_WATCHDOG0 Board_watchdog

    #define Board_ADC0 CC2650_LAUNCHXL_ADCVSS
    #define Board_ADC1 CC2650_LAUNCHXL_ADCVDDS

    #define Board_ADCBuf0 CC2650_LAUNCHXL_ADCBuf0
    #define Board_ADCBufChannel0 (0)
    #define Board_ADCBufChannel1 (1)

    #define Board_initGeneral(){\
    power_init();\
    if (PIN_init (BoardGpioInitTable)!= PIN_SUCCESS)\
    {System_abort (" PIN_INIT\n"\n 错误);\
    }\


    #define Board_initGPIO()
    #define Board_initPWM () PWM_INIT()
    #define Board_initSPI () SPI_INIT()
    #define Board_initUART() UART_INIT()
    #define Board_initWatchdog() Watchdog_init()
    #define Board_initADCBuf () ADCBuf_init ()
    #define Board_initADC() adc_init()
    #define GPIO_TOGGLE (n)
    #define GPIO_WRITE (n、m)

    #ifdef __cplusplus

    #endif

    #endif /*__Board_H */
    (二

    (2) CC2650_LAUNCHXL.h
    /*
    *版权所有(c) 2015-2016、德州仪器(TI)公司
    *保留所有权利。
    *
    *以源代码和二进制形式重新分发和使用、有无
    *如果满足以下条件、则允许进行修改
    符合*:
    *
    **源代码的重新分发必须保留上述版权
    *注意、此条件列表和以下免责声明。
    *
    **二进制形式的再发行必须复制上述版权
    *请注意、中的此条件列表和以下免责声明
    *随分发提供的文档和/或其他材料。
    *
    **德州仪器公司的名称和名称均不相同
    *其贡献者可用于认可或推广衍生产品
    *未经特定的事先书面许可。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *以及任何明示或暗示的保证、包括但不限于:
    *特定适销性和适用性的隐含保证
    *不承认目的。 在任何情况下、版权所有者不得或
    *派遣国应对任何直接、间接、偶然、特殊、
    *典型或必然的损害(包括但不限于
    *采购替代货物或服务;丧失使用、数据或利润;
    *或业务中断)、无论原因是什么以及任何责任理论、
    *无论是合同、严格责任还是侵权行为(包括疏忽或)
    *否则)因使用本软件而以任何方式产生、
    *即使被告知可能会发生此类损坏。
    *
    /**========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *@文件 CC2650_LAUNCHXL.h
    *
    *@简介 CC2650 LaunchPad 特定于电路板的头文件。
    *
    *注意! 这是 CC2650 LaunchPad PCB 版本1.1的板级配置文件
    *
    *====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *
    #ifndef __CC2650_LAUNCHXL_Board_H__
    #define __CC2650_LAUNCHXL_Board_H__

    #ifdef __cplusplus
    extern "C"{
    #endif

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

    /**========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    * extern
    *==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== *
    extern const PIN_Config BoardGpioInitTable[];

    /**========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *定义
    *==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== *

    /*与7x7 EM 相同的射频配置*/
    #define CC2650EM_7ID

    /*使用通用电路板别名将引脚映射到电路板信号
    *
    *

    /*分立式输出*/
    #define Board_RLED ioID_13.
    #define Board_GLED ioID_14
    #define Board_LED_ON 0
    #define Board_LED_OFF 1

    /*离散输入*/
    #define Board_BTN1 ioID_1.
    #define Board_BTN2 未分配的 PIN_REGLED

    /* UART 板*/
    #define Board_UART_RX 未分配的 PIN_REGLED
    #define Board_UART_TX 未分配的 PIN_REGLED
    #define Board_UART_CTS 未分配的 PIN_REGLED
    #define Board_UART_RTS 未分配的 PIN_REGLED

    /* SPI 板*/
    #define Board_SPI0_MISO ioID_4.
    #define Board_SPI0_MOSI ioID_3.
    #define Board_SPI0_CLK ioID_2
    #define Board_SPI0_CSn ioID_6.
    #define Board_SPI_ADS1293_CSB ioID_6.
    #define Board_SPI_ADS1293_DRDYBIOID_11
    #define Board_RST_ADS1293IOID_0
    #define Board_SPI1_MISO 未分配的 PIN_REGLED
    #define Board_SPI1_MOSI 未分配的 PIN_REGLED
    #define Board_SPI1_CLK 未分配的 PIN_REGLED
    #define Board_SPI1_CSn 未分配的 PIN_REGLED

    /* I2C */
    #define Board_I2C0_SCL0 ioID_7
    #define Board_I2C0_SDA0 ioID_8.

    /* SPI */
    #define Board_SPI_FLASH_CSPIN_Unassigned
    #define Board_FLASH_CS_ON 0
    #define Board_FLASH_OFF 1

    /*通用 Booster Pack */
    #define Board_DIO0 未分配的 PIN_REGLED
    #define Board_DIO1_RFSW 未分配的 PIN_REGLED
    #define Board_DIO12 未分配的 PIN_REGLED
    #define Board_DIO15 未分配的 PIN_REGLED
    #define Board_DIO16_TDO 未分配的 PIN_REGLED
    #define Board_DIO17_TDI 未分配的 PIN_REGLED
    #define Board_DIO21 未分配的 PIN_REGLED
    #define Board_DIO22 未分配的 PIN_REGLED

    #define Board_DIO23_ANALOG 未分配的 PIN_REGLED
    #define Board_DIO24_ANALOG 未分配的 PIN_REGLED
    #define Board_DIO25_ANALOG 未分配的 PIN_REGLED
    #define Board_DIO26_ANALOG 未分配的 PIN_REGLED
    #define Board_DIO27_ANALOG 未分配的 PIN_REGLED
    #define Board_DIO28_ANALOG 未分配的 PIN_REGLED
    #define Board_DIO29_ANALOG 未分配的 PIN_REGLED
    #define Board_DIO30_ANALOG 未分配的 PIN_REGLED

    /* Booster Pack LCD (430BOOST - Sharp96修订版1.1)*/
    #define Board_LCD_CS 未分配的 PIN_REGLED
    #define Board_LCD_EXTCOMIN 未分配的 PIN_REGLED
    #define Board_LCD_ENABLE 未分配的 PIN_REGLED
    #define Board_LCD_POWER 未分配的 PIN_REGLED
    #define Board_LCD_CS_ON 1
    #define Board_LCD_CS_OFF 0

    /* PWM 输出*/
    #define Board_PWMPIN0 未分配的 PIN_REGLED
    #define Board_PWMPIN1 未分配的 PIN_REGLED
    #define Board_PWMPIN2 未分配的 PIN_REGLED
    #define Board_PWMPIN3 未分配的 PIN_REGLED
    #define Board_PWMPIN4 未分配的 PIN_REGLED
    #define Board_PWMPIN5 未分配的 PIN_REGLED
    #define Board_PWMPIN6 未分配的 PIN_REGLED
    #define Board_PWMPIN7 未分配的 PIN_REGLED

    /**========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *实例标识符
    *==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== *
    /*通用 I2C 实例标识符*/
    #define Board_I2C CC2650_LAUNCHXL_I2C0
    /*通用 SPI 实例标识符*/
    #define Board_SPI0 CC2650_LAUNCHXL_SPI0
    #define Board_SPI1 CC2650_LAUNCHXL_SPI1
    /*通用 UART 实例标识符*/
    #define Board_UART CC2650_LAUNCHXL_UART0
    /*通用加密实例标识符*/
    #define Board_crypto CC2650_LAUNCHXL_CRYPTO0
    /*通用 GPTimer 实例标识符*/
    #define Board_GPTIMER0A CC2650_LAUNCHXL_GPTIMER0A
    #define Board_GPTIMER0B CC2650_LAUNCHXL_GPTIMER0B
    #define Board_GPTIMER1A CC2650_LAUNCHXL_GPTIMER1A
    #define Board_GPTIMER1B CC2650_LAUNCHXL_GPTIMER1B
    #define Board_GPTIMER2A CC2650_LAUNCHXL_GPTIMER2A
    #define Board_GPTIMER2B CC2650_LAUNCHXL_GPTIMER2B
    #define Board_GPTIMER3A CC2650_LAUNCHXL_GPTIMER3A
    #define Board_GPTIMER3B CC2650_LAUNCHXL_GPTIMER3B
    /*通用 PWM 实例标识符*/
    #define Board_PWM0 CC2650_LAUNCHXL_PWM0
    #define Board_PWM1 CC2650_LAUNCHXL_PWM1
    #define Board_PWM2 CC2650_LAUNCHXL_PWM2
    #define Board_PWM3 CC2650_LAUNCHXL_PWM3
    #define Board_PWM4 CC2650_LAUNCHXL_PWM4
    #define Board_PWM5 CC2650_LAUNCHXL_PWM5
    #define Board_PWM6 CC2650_LAUNCHXL_PWM6
    #define Board_PWM7 CC2650_LAUNCHXL_PWM7

    /**========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *外设数量及其名称
    *==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== *

    /*!
    *@def CC2650_LAUNCHXL_I2CName
    *@CC2650开发板上 I2C 名称的简要枚举
    *
    typedef 枚举 CC2650_LAUNCHXL_I2CName{
    CC2650_LAUNCHXL_I2C0 = 0、

    CC2650_LAUNCHXL_I2CCOUNT
    }CC2650_LAUNCHXL_I2CName;

    /*!
    *@def CC2650_LAUNCHXL_CryptoName
    *@CC2650开发板上加密名称的简要枚举
    *
    typedef 枚举 CC2650_LAUNCHXL_CryptoName{
    CC2650_LAUNCHXL_CRYPTO0 = 0、

    CC2650_LAUNCHXL_CRYPTOCOUNT
    }CC2650_LAUNCHXL_CryptoName;


    /*!
    *@def CC2650_LAUNCHXL_SPIName
    *@CC2650开发板上 SPI 名称的简要枚举
    *
    typedef 枚举 CC2650_LAUNCHXL_SPIName{
    CC2650_LAUNCHXL_SPI0 = 0、
    CC2650_LAUNCHXL_SPI1、

    CC2650_LAUNCHXL_SPICOUNT
    }CC2650_LAUNCHXL_SPIName;

    /*!
    *@def CC2650_LAUNCHXL_TRNGName
    *@板上 TRNG 名称的简要枚举
    *
    typedef enum CC2650_LAUNCHXL_TRNGName{
    CC2650_LAUNCHXL_TRNG0 = 0、
    CC2650_LAUNCHXL_TRNGCOUNT
    }CC2650_LAUNCHXL_TRNGName;

    /*!
    *@def CC2650_LAUNCHXL_UARTName
    *@CC2650开发板上 UART 的简要枚举
    *
    typedef 枚举 CC2650_LAUNCHXL_UARTName{
    CC2650_LAUNCHXL_UART0 = 0、

    CC2650_LAUNCHXL_UARTCOUNT
    }CC2650_LAUNCHXL_UARTName;

    /*!
    *@def CC2650_LAUNCHXL_UdmaName
    *@DMA 缓冲器的简要枚举
    *
    typedef enum CC2650_LAUNCHXL_UdmaName{
    CC2650_LAUNCHXL_UDMA0 = 0、

    CC2650_LAUNCHXL_UDMACOUNT
    }CC2650_LAUNCHXL_UdmaName;

    /*!
    *@def CC2650_LAUNCHXL_GPTimerName
    *@GPTimer 器件的简要枚举
    *
    typedef 枚举 CC2650_LAUNCHXL_GPTimerName

    CC2650_LAUNCHXL_GPTIMER0A = 0、
    CC2650_LAUNCHXL_GPTIMER0B、
    CC2650_LAUNCHXL_GPTIMER1A、
    CC2650_LAUNCHXL_GPTIMER1B、
    CC2650_LAUNCHXL_GPTIMER2A、
    CC2650_LAUNCHXL_GPTIMER2B、
    CC2650_LAUNCHXL_GPTIMER3A、
    CC2650_LAUNCHXL_GPTIMER3B、
    CC2650_LAUNCHXL_GPTIMERPARTSCOUNT
    }CC2650_LAUNCHXL_GPTimerName;

    /*!
    *@def CC2650_LAUNCHXL_GPTimers
    *@GPTimers 的简要枚举
    *
    typedef 枚举 CC2650_LAUNCHXL_GPTimers

    CC2650_LAUNCHXL_GPTIMER0 = 0、
    CC2650_LAUNCHXL_GPTIMER1、
    CC2650_LAUNCHXL_GPTIMER2、
    CC2650_LAUNCHXL_GPTIMER3、
    CC2650_LAUNCHXL_GPTIMERCOUNT
    }CC2650_LAUNCHXL_GPTimers;

    /*!
    *@def CC2650_LAUNCHXL_PWM
    *@板上 PWM 输出的简要枚举
    *
    typedef 枚举 CC2650_LAUNCHXL_PWM

    CC2650_LAUNCHXL_PWM0 = 0、
    CC2650_LAUNCHXL_PWM1、
    CC2650_LAUNCHXL_PWM2、
    CC2650_LAUNCHXL_PWM3、
    CC2650_LAUNCHXL_PWM4、
    CC2650_LAUNCHXL_PWM5、
    CC2650_LAUNCHXL_PWM6、
    CC2650_LAUNCHXL_PWM7、
    CC2650_LAUNCHXL_PWMCOUNT
    }CC2650_LAUNCHXL_PWM;

    /*!
    *@def CC2650_LAUNCHXL_ADCBufName
    *@ADC 的简要枚举
    *
    typedef 枚举 CC2650_LAUNCHXL_ADCBufName{
    CC2650_LAUNCHXL_ADCBuf0 = 0、
    CC2650_LAUNCHXL_ADCBufCOUNT
    }CC2650_LAUNCHXL_ADCBufName;


    /*!
    *@def CC2650_LAUNCHXL_ADCName
    *@ADC 的简要枚举
    *
    typedef 枚举 CC2650_LAUNCHXL_ADCName{
    CC2650_LAUNCHXL_ADC0 = 0、
    CC2650_LAUNCHXL_ADC1、
    CC2650_LAUNCHXL_ADC2、
    CC2650_LAUNCHXL_ADC3、
    CC2650_LAUNCHXL_ADC4、
    CC2650_LAUNCHXL_ADC5、
    CC2650_LAUNCHXL_ADC6、
    CC2650_LAUNCHXL_ADC7、
    CC2650_LAUNCHXL_ADCDCOUPL、
    CC2650_LAUNCHXL_ADCVSS、
    CC2650_LAUNCHXL_ADCVDDS、
    CC2650_LAUNCHXL_ADCCOUNT
    }CC2650_LAUNCHXL_ADCName;


    #ifdef __cplusplus

    #endif

    #endif /*__CC2650_LAUNCHXL_Board_H_*
    (二

    (3) CC2650_LAUNCHXL.c
    /*
    *版权所有(c) 2016、德州仪器(TI)公司
    *保留所有权利。
    *
    *以源代码和二进制形式重新分发和使用、有无
    *如果满足以下条件、则允许进行修改
    符合*:
    *
    **源代码的重新分发必须保留上述版权
    *注意、此条件列表和以下免责声明。
    *
    **二进制形式的再发行必须复制上述版权
    *请注意、中的此条件列表和以下免责声明
    *随分发提供的文档和/或其他材料。
    *
    **德州仪器公司的名称和名称均不相同
    *其贡献者可用于认可或推广衍生产品
    *未经特定的事先书面许可。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *以及任何明示或暗示的保证、包括但不限于:
    *特定适销性和适用性的隐含保证
    *不承认目的。 在任何情况下、版权所有者不得或
    *派遣国应对任何直接、间接、偶然、特殊、
    *典型或必然的损害(包括但不限于
    *采购替代货物或服务;丧失使用、数据或利润;
    *或业务中断)、无论原因是什么以及任何责任理论、
    *无论是合同、严格责任还是侵权行为(包括疏忽或)
    *否则)因使用本软件而以任何方式产生、
    *即使被告知可能会发生此类损坏。
    *

    /*
    *================================= CC2650_LAUNCHXL.c ================================================
    *此文件负责为设置特定于电路板的项目
    * CC2650 LaunchPad。
    *


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

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

    #include
    #include
    #include
    #include

    #include "Board.h"

    /*
    *========================================= IO 驱动程序初始化===========================
    *在 main 中、应调用 PIN_init (BoardGpioInitTable)以设置安全
    此板的*设置。
    *当分配引脚然后取消分配时、它将恢复到状态
    *在该表中配置。
    *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (BoardGpioInitTable、".const:BoardGpioInitTable")
    #pragma DATA_SECTION (PINCC26XX_hwAttrs、".const:PINCC26XX_hwAttrs")
    #endif

    const PIN_Config BoardGpioInitTable[]={
    Board_RLED | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、 /* LED 最初打开 *
    Board_GLED | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、 /* LED 最初关闭 *
    BOARD_SPI_ADS1293_DRDYB | PIN_INPUT_EN | PIN_PULLUP、 /* ADS1293数据就绪中断引脚*/
    BOARD_SPI_ADS1293_CSB | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、/* ADS1293芯片选择*
    BOARD_SPI0_MOSI | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、 /* SPI 主器件输出-从器件输入*/
    Board_SPI0_MISO | PIN_INPUT_EN | PIN_PULLUP、 /* SPI 主器件输入-从器件输出*/
    BOARD_SPI0_CLK | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、 /* SPI 时钟*/
    BOARD_RST_ADS1293 | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、/* ADS1293芯片复位*
    PIN_TERMINATE
    };

    const PINCC26XX_HWAttrs PINCC26XX_hwAttrs ={
    .intPriority =~0、
    .wiPriority = 0
    };
    /==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== *

    /*
    *========================================= 电源开始===================================
    *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (PowerCC26XX_CONFIG、".CONST:PowerCC26XX_CONFIG")
    #endif
    CONST PowerCC26XX_Config PowerCC26XX_CONFIG ={
    策略 InitFxn =空、
    policyFxn =&PowerCC26XX_standbyPolicy、
    .calibrateFxn =&PowerCC26XX_CALIBRATE、
    .enablePolicy = true、
    .calibrateRCOSC_LF = true、
    .calibrateRCOSC_HF = true、
    };
    /*
    *========================================= 电源端================================================
    *

    /*
    *========================================= UART BEGIN ================================================================
    *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (UART_CONFIG、".CONST:UART_CONFIG")
    #pragma DATA_SECTION (uartCC26XXHWAttrs、".const:uartCC26XXHWAttrs")
    #endif

    /*包含驱动程序*/
    #include
    #include

    /* UART 对象*/
    UARTCC26XX_Object uartCC26XX Objects[CC2650_LAUNCHXL_UARTCOUNT];

    /* UART 硬件参数结构、也用于分配 UART 引脚*/
    CONST UARTCC26XX_HWAttrsV1 uartCC26XXHWAttrs[CC2650_LAUNCHXL_UARTCOUNT]={

    baseAddr = UART0_BASE、
    powerMngrId = PowerCC26XX_Periph_UART0、
    .intNum = INT_UART0_COMB、
    .intPriority =~0、
    .wiPriority = 0、
    txPin = Board_UART_TX、
    .rxPin = Board_UART_RX、
    ctsPin = PIN_Unassigned、
    rtsPin = PIN_Unassigned

    };

    /* UART 配置结构*/
    const UART_Config UART_config[]={

    .fxnTablePtr =&UARTCC26XX_fxnTable、
    .object = uartCC26XX 对象[0]、
    hwAttrs = uartCC26XXHWAttrs[0]
    }、
    {NULL、NULL、NULL}
    };
    /*
    *========================================= UART 结束========================================================
    *

    /*
    *========================================= uDMA begin ================================================================
    *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (UDMACC26XX_CONFIG、".CONST:UDMACC26XX_CONFIG")
    #pragma DATA_SECTION (udmaHWAttrs、".const:udmaHWAttrs")
    #endif

    /*包含驱动程序*/
    #include

    /* uDMA 对象*/
    UDMACC26XX_Object udmaObjects[CC2650_LAUNCHXL_UDMACOUNT];

    /* uDMA 配置结构*/
    CONST UDMACC26XX_HWAttrs udmaHWAttrs[CC2650_LAUNCHXL_UDMACOUNT]={

    baseAddr = UDMA0_BASE、
    powerMngrId = PowerCC26XX_Periph_UDMA、
    .intNum = INT_DMA_ERR、
    .intPriority =~0

    };

    /* uDMA 配置结构*/
    CONST UDMACC26XX_Config UDMACC26XX_CONFIG[]={

    .object = udmaObjects[0]、
    hwAttrs =&udmaHWAttrs[0]
    }、
    {NULL、NULL}
    };
    /*
    *========================================= uDMA 结束========================================================
    *

    /*
    *========================================= SPI DMA begin ================================================================
    *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (SPI_CONFIG、".CONST:SPI_CONFIG")
    #pragma DATA_SECTION (spiCC26XXDMAHWAttrs、".const:spiCC26XXDMAHWAttrs")
    #endif

    /*包含驱动程序*/
    #include

    /* SPI 对象*/
    SPICC26XXDMA_Object spiCC26XXDMAObjects[CC2650_LAUNCHXL_SPICOUNT];

    /* SPI 配置结构、描述要使用的引脚*/
    CONST SPICC26XXDMA_HWAttrsV1 spiCC26XXDMAHWAttrs[CC2650_LAUNCHXL_SPICOUNT]={

    baseAddr = SSI0_BASE、
    .intNum = INT_SSI0_comb、
    .intPriority =~0、
    .wiPriority = 0、
    powerMngrId = PowerCC26XX_Periph_SSI0、
    defaultTxBufValue = 0、
    .rxChannelBitMask = 1<<UDMA_CHAN_SSI0_RX,
    txChannelBitMask = 1<<UDMA_CHAN_SSI0_TX,
    MOSIPin = Board_SPI0_MOSI、
    MISO 引脚 = Board_SPI0_MISO、
    clkPin = Board_SPI0_CLK、
    .csn 引脚 = Board_SPI0_CSn
    }、

    baseAddr = SSI1_base、
    .intNum = INT_SSI1_COMB、
    .intPriority =~0、
    .wiPriority = 0、
    powerMngrId = PowerCC26XX_Periph_SSI1、
    defaultTxBufValue = 0、
    .rxChannelBitMask = 1<<UDMA_CHAN_SSI1_RX,
    txChannelBitMask = 1<<UDMA_CHAN_SSI1_TX,
    MOSIPin = Board_SPI1_MOSI、
    MISO 引脚 = Board_SPI1_MISO、
    clkPin = Board_SPI1_CLK、
    .csn 引脚 = Board_SPI1_CSn

    };

    /* SPI 配置结构*/
    CONST SPI_Config SPI_CONFIG[]={

    .fxnTablePtr =&SPICC26XXDMA_fxnTable、
    .object = spiCC26XXDMAObjects[0]、
    hwAttrs = spiCC26XXDMAHHWAttrs[0](&P)
    }、

    .fxnTablePtr =&SPICC26XXDMA_fxnTable、
    .object = spiCC26XXDMAObjects[1]、
    hwAttrs = spiCC26XXDMAHWAttrs[1]
    }、
    {NULL、NULL、NULL}
    };
    /*
    *========================================= SPI DMA End ================================================================
    *


    /*
    *========================================= I2C BEGIN================================================================
    *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (I2C_CONFIG、".CONST:I2C_CONFIG")
    #pragma DATA_SECTION (i2cCC26xxHWAttrs、".const:i2cCC26xxHWAttrs")
    #endif

    /*包含驱动程序*/
    #include

    /* I2C 对象*/
    I2CCC26XX_Object i2cCC26xx Objects[CC2650_LAUNCHXL_I2CCOUNT;

    /* I2C 配置结构,描述要使用的引脚*/
    CONST I2CCC26XX_HWAttrsV1 i2cCC26xxHWAttrs[CC2650_LAUNCHXL_I2CCOUNT ={

    baseAddr = I2C0_BASE、
    powerMngrId = PowerCC26XX_Periph_I2C0、
    .intNum = INT_I2C_IRQ、
    .intPriority =~0、
    .wiPriority = 0、
    sdaPin = Board_I2C0_SDA0、
    .sclPin = Board_I2C0_SCL0、

    };

    /* I2C 配置结构*/
    const I2C_Config I2C_CONFIG[]={

    .fxnTablePtr =&I2CCC26XX_fxnTable、
    .object =&i2cCC26xx 对象[0]、
    hwAttrs =&i2cCC26xxHWAttrs[0]
    }、
    {NULL、NULL、NULL}
    };
    /*
    *========================================= I2C 结束========================================================
    *

    /*
    *========================================= 加密开始========================================================
    *注意:Crypto 实现应视为实验
    * 未经验证!
    *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (CryptoCC26XX_config、".const:CryptoCC26XX_config")
    #pragma DATA_SECTION (cryptoCC26XXHWAttrs、".const:cryptoCC26XHWAttrs")
    #endif

    /*包含驱动程序*/
    #include

    /* Crypto 对象*/
    CryptoCC26XX_Object cryptoCC26XX Objects[CC2650_LAUNCHXL_CRYPTOCOUNT];

    /* Crypto 配置结构,描述要使用的引脚*/
    const CryptoCC26XX_HWAttrs cryptoCC26XXXXHWAttrs[CC2650_LAUNCHXL_CRYPTOCOUNT]={

    baseAddr = crypto_BASE、
    powerMngrId = PowerCC26XX_Periph_crypto、
    .intNum = INT_crypto_result_ave_IRQ、
    .intPriority =~0、

    };

    /* Crypto 配置结构*/
    const CryptoCC26XX_Config CryptoCC26XX_config[]={

    .object =加密 CC26XX 对象[0]、
    hwAttrs =加密 CC26XXXHWAttrs[0]
    }、
    {NULL、NULL}
    };
    /*
    *========================================= 加密结束========================================================
    *


    /*
    *========================================= 射频驱动程序 begin ========================================================
    *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (RFCC26XX_hwAttrs、".const:RFCC26XX_hwAttrs")
    #endif

    /*包含驱动程序*/
    #include

    /*射频 hwi 和 swi 优先级*/
    const RFCC26XX_HWAttrs RFCC26XX_hwAttrs ={
    .hwiCpe0Priority =~0、
    .hwihwPriority =~0、
    .wiCpe0Priority = 5、
    .wswiPriority = 5、
    };

    /*
    *========================================= 射频驱动程序结束========================================================
    *

    /*
    *========================================= 显示开始===========================================
    *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (Display_CONFIG、".CONST:Display_CONFIG")
    #pragma DATA_SECTION (displaySharpHWattrs、".const:displaySharpHWattrs")
    #pragma DATA_SECTION (displayUartHWAttrs、".const:displayUartHWAttrs")
    #endif

    #include
    #include
    #include

    /*用于 UartPlain 阻塞的结构*/
    DisplayUart_Object 显示 UartObject;

    #ifndef Board_display_uart_stRBUF_size
    #define BOARD_DISPLAY_UART_STRBUF_SIZE 128
    #endif
    静态字符 uartStringBuf[Board_display_UART_STRBUF_SIZE];

    const DisplayUart_HWAttrs displayUartHWAttrs ={
    uartIdx = Board_UART、
    波特率 = 115200、
    .mutexTimeout = BIOS_wait_forever、
    .strBuf = uartStringBuf、
    strBufLen = Board_display_UART_STRBUF_size、
    };

    /*锋利的结构*/
    DisplaySharp 对象显示对象;

    #ifndef Board_display_share_size
    #define Board_display_shared_size 96 // 96->96x96是最常见的板,替代方案是128->128x128。
    #endif
    静态 uint8_sharpDisplayBuf[Board_display_sharp_size * Board_display_sharp_size / 8];

    const DisplaySharp HWAttrs displaySharpHWattrs ={
    spiIndex = Board_SPI0、
    csPin = Board_LCD_CS、
    extcominPin = Board_LCD_EXTCOMIN、
    powerPin = Board_LCD_POWER、
    .enablePin = Board_LCD_ENABLE、
    像素宽度= Board_display_sharp_size、
    像素高度= Board_display_sharp_size、
    .displayBuf = sharpDisplayBuf、
    };

    /*显示数组*/
    const Display_Config Display_config[]={
    #if!defined (Board_display_exclude_UART)

    .fxnTablePtr =&DisplayUart_fxnTable、
    .object =显示 UartObject (&D)、
    hwAttrs =显示 UartHWAttrs (&D)、
    }、
    #endif
    #if!defined (Board_display_exclude_LCD)

    .fxnTablePtr =&DisplaySharp_fxnTable、
    .object =显示共享对象(&D)、
    hwAttrs =显示 SharpHWattrs (&D)
    }、
    #endif
    { NULL、NULL、NULL }//终端器
    };

    /*
    *========================================= 显示结束=================================================
    *

    /*
    *========================================= GPTimer 开始========================================================
    *删除 Board.c 和 Board.h 中未使用的条目以减少闪存的使用
    *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (GPTimerCC26XX_CONFIG、".CONST:GPTimerCC26XX_CONFIG")
    #pragma DATA_SECTION (gptimerCC26xxHWAttrs、".const:gptimerCC26xxHWAttrs")
    #endif

    /* GPTimer 硬件属性,每个计时器部件一个(计时器0A、0B、1A、1B..) *
    CONST GPTimerCC26XX_HWAttrs gptimerCC26xxHWAttrs[CC2650_LAUNCHXL_GPTIMERPARTSCOUNT]={
    {.baseAddr = GPT0_BASE、.intNum = INT_GPT0A、.intPriority =(~0)、.powerMngrId = PowerCC26XX_Periph_GPT0、.pinMux = GPT_PIN_0A、 }、
    {.baseAddr = GPT0_BASE、.intNum = INT_GPT0B、.intPriority =(~0)、.powerMngrId = PowerCC26XX_Periph_GPT0、.pinMux = GPT_PIN_0B、 }、
    {.baseAddr = gp1_BASE、.intNum = INT_GPT1A、.intPriority =(~0)、.powerMngrId = PowerCC26XX_Periph_GPT1、.pinMux = GPT_PIN_1A、 }、
    {.baseAddr = gp1_BASE、.intNum = INT_GPT1B、.intPriority =(~0)、.powerMngrId = PowerCC26XX_Periph_GPT1、.pinMux = GPT_PIN_1B、 }、
    {.baseAddr = GPT2_base、.intNum = INT_GPT2A、.intPriority =(~0)、.powerMngrId = PowerCC26XX_Periph_GPT2、.pinMux = GPT_PIN_2A、 }、
    {.baseAddr = GPT2_base、.intNum = INT_GPT2B、.intPriority =(~0)、.powerMngrId = PowerCC26XX_Periph_GPT2、.pinMux = GPT_PIN_2B、 }、
    {.baseAddr = GPT3_base、.intNum = INT_GPT3A、.intPriority =(~0)、.powerMngrId = PowerCC26XX_Periph_GPT3、.pinMux = GPT_PIN_3A、 }、
    {.baseAddr = GPT3_base、.intNum = INT_GPT3B、.intPriority =(~0)、.powerMngrId = PowerCC26XX_Periph_GPT3、.pinMux = GPT_PIN_3B、 }、
    };

    /* GPTimer 对象、每个全宽定时器(A+B)一个(定时器0、定时器1) *
    GPTimerCC26XX_Object gptimerCC26XX 对象[CC2650_LAUNCHXL_GPTIMERCOUNT];

    /* GPTimer 配置(被驱动程序和应用程序用作 GPTimer_handle)*/
    CONST GPTimerCC26XX_Config GPTimerCC26XX_CONFIG[CC2650_LAUNCHXL_GPTIMERPARTSCOUNT]={
    {&gptimerCC26XX 对象[0]、&gptimerCC26xxHWAttrs[0]、GPT_A}、
    {&gptimerCC26XX 对象[0]、&gptimerCC26xxHWAttrs[1]、GPT_B}、
    {&gptimerCC26XX 对象[1]、&gptimerCC26xxHWAttrs[2]、GPT_A}、
    {&gptimerCC26XX 对象[1]、&gptimerCC26xxHWAttrs[3]、GPT_B}、
    {&gptimerCC26XX 对象[2]、&gptimerCC26xxHWAttrs[4]、GPT_A}、
    {&gptimerCC26XX 对象[2]、&gptimerCC26xxHWAttrs[5]、GPT_B}、
    {&gptimerCC26XX 对象[3]、&gptimerCC26xxHWAttrs[6]、GPT_A}、
    {&gptimerCC26XX 对象[3]、&gptimerCC26xxHWAttrs[7]、GPT_B}、
    };

    /*
    *========================================= GPTimer 结束========================================================
    *



    /*
    *========================================= PWM 开始========================================================
    *删除 Board.c 和 Board.h 中未使用的条目以减少闪存的使用
    *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (PWM_CONFIG、".CONST:PWM_CONFIG")
    #pragma DATA_SECTION (pwmtimerCC26xxHWAttrs、".const:pwmtimerCC26xxHWAttrs")
    #endif

    /* PWM 配置、每个 PWM 输出一个。 *
    PWMTimerCC26XX_HwAttrs pwmtimerCC26xxHWAttrs[CC2650_LAUNCHXL_PWMCOUNT ={
    {.pwmPin = Board_PWMPIN0、.gpTimerUnit = Board_GPTIMER0A}、
    {.pwmPin = Board_PWMPIN1、.gpTimerUnit = Board_GPTIMER0B}、
    {.pwmPin = Board_PWMPIN2、.gpTimerUnit = Board_GPTIMER1A}、
    {.pwmPin = Board_PWMPIN3、.gpTimerUnit = Board_GPTIMER1B}、
    {.pwmPin = Board_PWMPIN4、.gpTimerUnit = Board_GPTIMER2A}、
    {.pwmPin = Board_PWMPIN5、.gpTimerUnit = Board_GPTIMER2B}、
    {.pwmPin = Board_PWMPIN6、.gpTimerUnit = Board_GPTIMER3A}、
    {.pwmPin = Board_PWMPIN7、.gpTimerUnit = Board_GPTIMER3B}、
    };

    /* PWM 对象、每个 PWM 输出一个*/
    PWMTimerCC26XX_Object pwmtimerCC26xx 对象[CC2650_LAUNCHXL_PWMCOUNT;

    extern const PWM_FxnTable PWMTimerCC26XX_fxnTable;

    /* PWM 配置(由驱动程序和应用程序用作 PWM_Handle)*/
    CONST PWM_Config PWM_CONFIG[CC2650_LAUNCHXL_PWMCOUNT + 1]={
    {&PWMTimerCC26XX_fxnTable、&pwmtimerCC26xxObjects[0]、&pwmtimerCC26xxHWAttrs[0]}、
    {PWMTimerCC26XX_fxnTable、&pwmtimerCC26xxObjects[1]、&pwmtimerCC26xxHWAttrs[1]}、
    {&PWMTimerCC26XX_fxnTable、&pwmtimerCC26xxObjects[2]、&pwmtimerCC26xxHWAttrs[2]}、
    {&PWMTimerCC26XX_fxnTable、&pwmtimerCC26xxObjects[3]、&pwmtimerCC26xxHWAttrs[3]}、
    {&PWMTimerCC26XX_fxnTable、&pwmtimerCC26xxObjects[4]、&pwmtimerCC26xxHWAttrs[4]}、
    {PWMTimerCC26XX_fxnTable、&pwmtimerCC26xxObjects[5]、&pwmtimerCC26xxHWAttrs[5]}、
    {&PWMTimerCC26XX_fxnTable、&pwmtimerCC26xxObjects[6]、&pwmtimerCC26xxHWAttrs[6]}、
    {&PWMTimerCC26XX_fxnTable、&pwmtimerCC26xxObjects[7]、&pwmtimerCC26xxHWAttrs[7]}、
    {空, null、 空}
    };


    /*
    *========================================= PWM 结束========================================================
    *

    /*
    *========================================= ADCBuf BEGIN ================================================================
    *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (ADCBuf_config、".const:ADCBuf_config")
    #pragma DATA_SECTION (adcBufCC26xxHWAttrs、".const:adcBufCC26xxHWAttrs")
    #pragma DATA_SECTION (ADCBufCC26XX_adcChannelLut、".const:ADCBufCC26XX_adcChannelLut")
    #endif

    /*包含驱动程序*/
    #include
    #include

    /* ADCBuf 对象*/
    ADCBufCC26XX_Object adcBufCC26xxObjects[CC2650_LAUNCHXL_ADCBufCOUNT;

    /*
    *此表将虚拟 ADC 通道转换为 dio 和内部模拟输入信号。
    *此表是 adcBuf 驱动程序运行所必需的。
    *注释掉未使用的条目以保存闪存。
    * DIO 和内部信号对通过硬接线连接。 不要在表中重新映射它们。 不过,您可以对整个条目重新排序。
    * dio 和内部信号的映射取决于封装。
    *
    const ADCBufCC26XX_AdcChannelLutEntry ADCBufCC26XX_adcChannelLutt[]={
    {PIN_Unassigned、ADC_COMPB_IN_VDDS}、
    {PIN_Unassigned、ADC_COMPB_IN_DCOUPL}、
    {PIN_Unassigned、ADC_COMPB_IN_VSS}、
    {Board_DIO23_ANALOG、ADC_COMPB_IN_AUXIO7}、
    {Board_DIO24_ANALOG、ADC_COMPB_IN_AUXIO6}、
    {Board_DIO25_ANALOG、ADC_COMPB_IN_AUXIO5}、
    {Board_DIO26_ANALOG、ADC_COMPB_IN_AUXIO4}、
    {Board_DIO27_ANALOG、ADC_COMPB_IN_AUXIO3}、
    {Board_DIO28_ANALOG、ADC_COMPB_IN_AUXIO2}、
    {Board_DIO29_ANALOG、ADC_COMPB_IN_AUXIO1}、
    {Board_DIO30_ANALOG、ADC_COMPB_IN_AUXIO0}、
    };

    CONST ADCBufCC26XX_HWAttrs adcBufCC26xxHWAttrs[CC2650_LAUNCHXL_ADCBufCOUNT ={

    .intPriority =~0、
    .wiPriority = 0、
    .adcChannelLut = ADCBufCC26XX_adcChannelLut、
    .gpTimerUnit = Board_GPTIMER0A、
    .gptDMAChannelMask = 1 << UDMA_CHAN_TIMER0_A、

    };

    CONST ADCBuf_Config ADCBuf_config[]={
    {&ADCBufCC26XX_fxnTable、&adcBufCC26xxObjects[0]、&adcBufCC26xxHWAttrs[0]}、
    {NULL、NULL、NULL}、
    };
    /*
    *========================================= ADCBuf End ================================================================
    *



    /*
    *========================================= ADC 开始================================================================
    *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (ADC_CONFIG、".CONST:ADC_CONFIG")
    #pragma DATA_SECTION (adcCC26xxHWAttrs、".const:adcCC26xxHWAttrs")
    #endif

    /*包含驱动程序*/
    #include
    #include

    /* ADC 对象*/
    ADCCC26XX_Object adcCC26xxObjects[CC2650_LAUNCHXL_ADCCOUNT];


    const ADCCC26XX_HWAttrs adcCC26xxHWAttrs[CC2650_LAUNCHXL_ADCCOUNT]={

    .adcDIO = Board_DIO23_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO7、
    .refSource = ADCCC26XX_fixed_reference、
    .samplingDuration = ADCCC26XX_SAMPLING_DURAY_2P7_US、
    .inputScalingEnabled = true、
    triggerSource = ADCCC26XX_TRIGGER_MANUAL
    }、

    .adcDIO = Board_DIO24_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO6、
    .refSource = ADCCC26XX_fixed_reference、
    .samplingDuration = ADCCC26XX_SAMPLING_DURAY_2P7_US、
    .inputScalingEnabled = true、
    triggerSource = ADCCC26XX_TRIGGER_MANUAL
    }、

    .adcDIO = Board_DIO25_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO5、
    .refSource = ADCCC26XX_fixed_reference、
    .samplingDuration = ADCCC26XX_SAMPLING_DURAY_2P7_US、
    .inputScalingEnabled = true、
    triggerSource = ADCCC26XX_TRIGGER_MANUAL
    }、

    .adcDIO = Board_DIO26_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO4、
    .refSource = ADCCC26XX_fixed_reference、
    .samplingDuration = ADCCC26XX_SAMPLING_DURAY_2P7_US、
    .inputScalingEnabled = true、
    triggerSource = ADCCC26XX_TRIGGER_MANUAL
    }、

    .adcDIO = Board_DIO27_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO3、
    .refSource = ADCCC26XX_fixed_reference、
    .samplingDuration = ADCCC26XX_SAMPLING_DURAY_2P7_US、
    .inputScalingEnabled = true、
    triggerSource = ADCCC26XX_TRIGGER_MANUAL
    }、

    .adcDIO = Board_DIO28_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO2、
    .refSource = ADCCC26XX_fixed_reference、
    .samplingDuration = ADCCC26XX_SAMPLING_DURAY_2P7_US、
    .inputScalingEnabled = true、
    triggerSource = ADCCC26XX_TRIGGER_MANUAL
    }、

    .adcDIO = Board_DIO29_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO1、
    .refSource = ADCCC26XX_fixed_reference、
    .samplingDuration = ADCCC26XX_SAMPLING_DURAY_2P7_US、
    .inputScalingEnabled = true、
    triggerSource = ADCCC26XX_TRIGGER_MANUAL
    }、

    .adcDIO = Board_DIO30_ANALOG、
    .adcCompBInput = ADC_COMPB_IN_AUXIO0、
    .refSource = ADCCC26XX_fixed_reference、
    .samplingDuration = ADCCC26XX_SAMPLING_DURAY_10P9_MS、
    .inputScalingEnabled = true、
    triggerSource = ADCCC26XX_TRIGGER_MANUAL
    }、

    .adcDIO = PIN_Unassigned、
    .adcCompBInput = ADC_COMPB_IN_DCOUPL、
    .refSource = ADCCC26XX_fixed_reference、
    .samplingDuration = ADCCC26XX_SAMPLING_DURAY_2P7_US、
    .inputScalingEnabled = true、
    triggerSource = ADCCC26XX_TRIGGER_MANUAL
    }、

    .adcDIO = PIN_Unassigned、
    .adcCompBInput = ADC_COMPB_IN_VSS、
    .refSource = ADCCC26XX_fixed_reference、
    .samplingDuration = ADCCC26XX_SAMPLING_DURAY_2P7_US、
    .inputScalingEnabled = true、
    triggerSource = ADCCC26XX_TRIGGER_MANUAL
    }、

    .adcDIO = PIN_Unassigned、
    .adcCompBInput = ADC_COMPB_IN_VDDS、
    .refSource = ADCCC26XX_fixed_reference、
    .samplingDuration = ADCCC26XX_SAMPLING_DURAY_2P7_US、
    .inputScalingEnabled = true、
    triggerSource = ADCCC26XX_TRIGGER_MANUAL

    };

    const ADC_Config ADC_CONFIG[]={
    {&ADCCC26XX_fxnTable、&adcCC26xxObjects[0]、&adcCC26xxHWAttrs[0]}、
    {&ADCCC26XX_fxnTable、&adcCC26xxObjects[1]、&adcCC26xxHWAttrs[1]}、
    {&ADCCC26XX_fxnTable、&adcCC26xxObjects[2]、&adcCC26xxHWAttrs[2]}、
    {&ADCCC26XX_fxnTable、&adcCC26xxObjects[3]、&adcCC26xxHWAttrs[3]}、
    {&ADCCC26XX_fxnTable、&adcCC26xxObjects[4]、&adcCC26xxHWAttrs[4]}、
    {&ADCCC26XX_fxnTable、&adcCC26xxObjects[5]、&adcCC26xxHWAttrs[5]}、
    {&ADCCC26XX_fxnTable、&adcCC26xxObjects[6]、&adcCC26xxHWAttrs[6]}、
    {&ADCCC26XX_fxnTable、&adcCC26xxObjects[7]、&adcCC26xxHWAttrs[7]}、
    {&ADCCC26XX_fxnTable、&adcCC26xxObjects[8]、&adcCC26xxHWAttrs[8]}、
    {&ADCCC26XX_fxnTable、&adcCC26xxObjects[9]、&adcCC26xxHWAttrs[9]}、
    {&ADCCC26XX_fxnTable、&adcCC26xxObjects[10]、&adcCC26xxHWAttrs[10]}、
    {NULL、NULL、NULL}、
    };

    /*
    *========================================= ADC 结束========================================================
    *

    /*
    *========================================= 培训开始===========================================
    *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (TRNGCC26XX_CONFIG、".CONST:TRNGCC26XX_CONFIG")
    #pragma DATA_SECTION (TRNGCC26XXHWAttrs、".CONST:TRNGCC26XXHWAttrs")
    #endif

    /*包含驱动程序*/
    #include

    /* TRNG 对象*/
    TRNGCC26XX_Object trngCC26XX Objects[CC2650_LAUNCHXL_TRNGCOUNT];

    /* TRNG 配置结构,描述要使用的引脚*/
    CONST TRNGCC26XX_HWAttrs TRNGCC26XXXXHWAttrs[CC2650_LAUNCHXL_TRNGCOUNT]={

    powerMngrId = PowerCC26XX_Periph_TRNG、

    };

    /* TRNG 配置结构*/
    CONST TRNGCC26XX_Config TRNGCC26XX_CONFIG[]={

    .object =&trngCC26XX 对象[0]、
    hwAttrs =&TRNGCC26XXXHWAttrs[0]
    }、
    {NULL、NULL}
    };

    /*
    *========================================= 培训结束================================================
    *
    (二

    (4) simple_peripheral.c
    /*********

    @simple_peripheral.c 文件

    @简介此文件包含要使用的简单 BLE 外设示例应用
    CC2650低功耗蓝牙协议栈进行通信。

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

    秘书长的报告

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

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

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

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

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

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

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

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

    #include
    #include
    #include
    #include

    #include "hci_tl.h"
    #include "gatt.h"
    #include "linkdb.h"
    #include "gapgattserver.h"
    #include "gattservapp.h"
    #include "devinfoservice.h"
    #include "simple_gatt_profile.h"

    #if defined (feature_OAD)|| defined (image_invalidate)(如果已定义[图元_OAD])
    #include "oad_target.h"
    #include "oad.h"
    #endif //feature_OAD || image_invalidate

    #include "peripheral.h"
    #include "gapbondmgr.h"

    #include "osal_SNV.h"
    #include "iCall_apimsg.h"

    #include "util.h"

    #ifdef USE_RCOSC
    #include "rcosc_calibration.h"
    #endif //use_RCOSC

    #include
    #include "board_key.h"

    #include "board.h"

    #include "simple_peripheral.h"

    #if defined (use_fpga)|| defined (debug_sw_trace)
    #include
    #endif // use_fpga | debug_sw_trace

    /*********
    *常量
    *

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

    //受限可发现模式广播30.72,然后停止
    //常规可发现模式无限期广播
    #define DEFAULT_DISCOVERAING_MODE GAP_ADTYPE_FLAGS_GENERAL

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

    //最大连接间隔(单位为1.25ms、800=1000ms)(如果是自动)
    //启用参数更新请求
    #define DEFAULT_MODED_MAX_CONN_INTERVAL 800
    #else //!Feature_OAD
    //如果是自动连接,则最小连接间隔(单位为1.25ms,8=10ms)
    //启用参数更新请求
    #define DEFAULT_MIVEed_MIN_CONN_INTERVAL 8.

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

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

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

    //连接时是否启用自动参数更新请求
    //形成
    #define DEFAULT_ENABLE_UPDATE_REQUEST GAPROLE_LINK_PARAM_UPDATE_INITIATE_MAL_PARAMS

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

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

    #ifdef Feature_OAD
    // OAD 数据包的大小。
    #define OAD_PACKET_SIZE ((OAD_BLOCK_SIZE)+ 2)
    #endif // Feature_OAD

    //任务配置
    #define SBP_TASK_PRIORITY 1


    #ifndef SBP_TASK_STACK_SIZE
    #define SBP_TASK_STACK_SIZE 644
    #endif

    // RTOS 应用程序的内部事件
    #define SBP_State_change_EVT 0x0001
    #define SBP_CHAR_CHANGE_EVT 0x0002
    #define SBP_Period_EVT 0x0004
    #define SBP_CONN_EVT_END_EVT 0x0008

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

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

    appEvtHdr_t HDR;//事件标头。
    }sbpEvt_t;

    /*********
    *全局变量
    *

    //显示接口
    Display_Handle dispHandle =空;

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

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

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

    //内部周期事件的时钟实例。
    静态时钟结构周期时钟;

    //用于应用程序消息的队列对象
    静态队列结构附加消息;
    静态队列句柄 appMsgQueue;

    #if 已定义(feature_OAD)
    // OAD 配置文件中的事件数据。
    静态队列结构 oadQ;
    静态 Queue_handle hOadQ;
    #endif //feature_OAD

    //内部应用程序事件的事件标志。
    静态 uint16_t 事件;

    //任务配置
    Task_StructsbpTask;
    char sbpTaskStack[SBP_task_stack_size];

    //配置文件状态和参数
    //静态 gaprole_states_t gapProfileState = GAPROLE_init;

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

    //完整名称
    0x14、//此数据的长度
    GAP_ADTYPE_LOCAL_NAME_COMPLETE、
    "S"、
    'I'、
    'm'、
    "P"、
    'l'、
    'e'、
    'b'、
    'l'、
    'e'、
    "P"、
    'e'、
    'R'、
    'I'、
    "P"、
    'h'、
    'e'、
    'R'、
    'A'、
    'l'、

    //连接间隔范围
    0x05、//此数据的长度
    GAP_ADTYPE_SLAVE_CONN_INTERVE_RANGE、
    LO_UINT16 (DEFAULT_REGLED_MIN_CONN_INTERVAL)、// 100ms
    HI_UINT16 (default_desired _min_CONN_interval)、
    LO_UINT16 (DEFAULT_REGLED_MAX_CONN_INTERVAL)、// 1
    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,通知中央设备包含哪些服务
    //中
    #if !defined (feature_OAD)|| defined (feature_OAD_ONCHIP)
    0x03、//此数据的长度
    用于外部闪存的#else //OAD
    0x05、//此数据长度
    #endif //feature_OAD
    GAP_ADTYPE_16BIT_more、 //一些 UUID,但不是全部
    #ifdef Feature_OAD
    LO_UINT16 (OAD_SERVICE_UUID)、
    hi_uint16 (OAD_SERVICE_UUID)、
    #endif //feature_OAD
    #ifndef feature_OAD_ONCHIP
    LO_UINT16 (SIMPLEPROFILE_SERV_UUID)、
    HI_UINT16 (SIMPLEPROFILE_SERV_UUID)
    #endif //feature_OAD_ONCHIP
    };

    // GAP GATT 属性
    静态 uint8_t attDeviceName[GAP_DEVICE_NAME_LEN]="简单 BLE 外设";

    //用于 ATT 响应重新传输的全局变量
    静态 gattMsgEvent_t * pAttRsp = NULL;
    静态 uint8_t rspTxRetry = 0;

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

    static void SimpleBLEPeripheral_init( void );
    静态空 SimpleBLEPeripheral_taskFxn (UARg a0、UARg A1);

    静态 uint8_t SimpleBLEPeripheral_processStackMsg (iCall_HDR *pMsg);
    静态 uint8_t SimpleBLEPeripheral_processGATTMsg (gattMsgEvent_t *pMsg);
    静态空 SimpleBLEPeripheral_processAppMsg (sbpEvt_t *pMsg);
    静态空 SimpleBLEPeripheral_processStateChangeEvt (gaprole_states_t newState);
    静态空 SimpleBLEPeripheral_processCharValueChangeEvt (uint8_t 参数 ID);
    静态空 SimpleBLEPeripheral_performPeriodicTask (空);
    静态空 SimpleBLEPeripheral_clockHandler (UARg 参数);

    静态空 SimpleBLEPeripheral_sendAttRsp (void);
    静态空 SimpleBLEPeripheral_freeAttsp (uint8_t 状态);

    静态空 SimpleBLEPeripheral_stateChangeCB (gaprole_states_t newState);
    #ifndef feature_OAD_ONCHIP
    静态空 SimpleBLEPeripheral_charValueChangeCB (uint8_t 参数 ID);
    #endif //!feature_OAD_ONCHIP
    静态空 SimpleBLEPeripheral_enqueueMsg (uint8_t 事件、uint8_t 状态);

    #ifdef Feature_OAD
    void SimpleBLEPeripheral_processOadWriteCB (uint8_t 事件、uint16_t connHandle、
    uint8_t *pData);
    #endif //feature_OAD


    /*********
    *配置文件回调
    *

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

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

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

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

    //简单 GATT 配置文件回调
    #ifndef feature_OAD_ONCHIP
    静态 simpleProfileCBs_t SimpleBLEPeripheral_simpleProfileCBs =

    SimpleBLEPeripheral_charValueChangeCB //特征值更改回调
    };
    #endif //!feature_OAD_ONCHIP

    #ifdef Feature_OAD
    静态 oadTargetCBs_t simpleBLEPeripheral_oadCBs =

    SimpleBLEPeripheral_processOadWriteCB //写回调。
    };
    #endif //feature_OAD

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

    /*********
    *@fn SimpleBLEPeripheral_createTask
    *
    *@简单 BLE 外设的简短任务创建功能。
    *
    *@param 无。
    *
    *@返回无。
    *
    void SimpleBLEPeripheral_createTask (void)

    Task_Params taskParams;

    //配置任务
    Task_Params_init (&taskParams);
    taskParams.stack = sbpTaskStack;
    taskParams.STACKSIZE = SBP_TASK_STACK_SIZE;
    taskParams.priority = sbp_task_priority;

    Task_construct(&sbpTask, SimpleBLEPeripheral_taskFxn,&taskParams, NULL);


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

    //
    //在调用 iCall_registerApp 之前可能会发生 N0栈 API 调用
    //
    //将当前线程注册为 iCall 调度应用程序
    //以便应用程序可以发送和接收消息。
    iCall_registerApp (自实体、SEM);

    #ifdef USE_RCOSC
    RCOSC_enableCalibration();
    #endif // use_RCOSC

    #if defined (use_fpga)
    //配置射频内核 SMI 数据链路
    IOCPortConfigureSet (IOID_12、IOC_PORT_RFC_GPO0、IOC_STD_OUTPUT);
    IOCPortConfigureSet (IOID_11、IOC_PORT_RFC_GPI0、IOC_STD_INPUT);

    //配置射频内核 SMI 命令链路
    IOCPortConfigureSet (IOID_10、IOC_IOCFG0_PORT_ID_RFC_SMI_CL_OUT、IOC_STD_OUTPUT);
    IOCPortConfigureSet (IOID_9、IOC_IOCFG0_PORT_ID_RFC_SMI_CL_IN、IOC_STD_INPUT);

    //配置射频内核跟踪器 IO
    IOCPortConfigureSet (IOID_8、IOC_PORT_RFC_TRC、IOC_STD_OUTPUT);
    #else //!use_fpga
    #if defined (debug_sw_trace)
    //配置射频内核跟踪器 IO
    IOCPortConfigureSet (IOID_8、IOC_PORT_RFC_TRC、IOC_STD_OUTPUT | IOC_CURRENT_4mA | IOC_SLEW_ENABLE);
    endif // debug_sw_trace
    #endif // use_fpga

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

    //为内部周期事件创建一次性时钟。
    Util_constructClock (周期时钟、SimpleBLEPeripheral_clockHandler、
    SBP_PERIOD_EVT_PERIOD、0、false、SBP_PERIOD_EVT);

    dispHandle = Display_open (Display_Type_LCD、NULL);

    //设置间隙
    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、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 = true;
    uint8_t ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;
    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(); //设备信息服务

    #ifndef feature_OAD_ONCHIP
    SimpleProfile_AddService (GATT_All_services);//简单 GATT 配置文件
    #endif //!feature_OAD_ONCHIP

    #ifdef Feature_OAD
    void OAD_addService(); // OAD 配置文件
    OAD_register (((oadTargetCBs_t *)&simpleBLEPeripheral_oadCBs);
    hOadQ = Util_constructQueue (oadQ);
    #endif //feature_OAD

    #ifdef image_invalidate
    RESET_addService();
    #endif //image_invalidate


    #ifndef feature_OAD_ONCHIP
    //设置 SimpleProfile 特征值

    uint8_t charValue1 = 1;
    uint8_t charValue2 = 2;
    uint8_t charValue3 = 3;
    uint8_t charValue4 = 4;
    uint8_t charValue5[SIMPLEPROFILE_CHAR5_LEN]={1、2、3、4、5};

    SimpleProfile_SetParameter (SIMPLEPROFILE_CHAR1、sizeof (uint8_t)、
    charValue1);
    SimpleProfile_SetParameter (SIMPLEPROFILE_CHAR2、sizeof (uint8_t)、
    charValue2);
    SimpleProfile_SetParameter (SIMPLEPROFILE_CHAR3、sizeof (uint8_t)、
    charValue3);
    SimpleProfile_SetParameter (SIMPLEPROFILE_CHAR4、sizeof (uint8_t)、
    charValue4);
    SimpleProfile_SetParameter (SIMPLEPROFILE_CHAR5、SIMPLEPROFILE_CHAR5_LEN、
    charValue5);


    //使用 SimpleGATTprofile 注册回调
    SimpleProfile_RegisterAppCBs (&SimpleBLEPeripheral_simpleProfileCBs);
    #endif //!feature_OAD_ONCHIP

    //启动设备
    void GAPRole_StartDevice (&SimpleBLEPeripheral_gapRoleCBs);

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

    //使用 GAP 注册 HCI/主机消息
    GAP_RegisterForMsgs(self Entity);

    //注册 GATT 本地事件和 ATT 响应等待发送
    GATT_RegisterForMsgs (self 实体);

    HCI_LE_ReadMaxDataLenCmd ();

    #if 定义的 FUST_OAD
    #IF 定义(HAL_IMAGE_A)
    Display_print0 (dispHandle、0、0、"BLE 外设 A");
    其他
    Display_print0 (dispHandle、0、0、"BLE 外设 B");
    #endif // HAL_image_a
    其他
    Display_print0 (dispHandle、0、0、"BLE 外设");
    #endif // Feature_OAD


    /*********
    *@fn SimpleBLEPeripheral_taskFxn
    *
    *@简单 BLE 外设的应用任务入口点简介。
    *
    *@param a0、A1 -未使用。
    *
    *@返回无。
    *
    静态空 SimpleBLEPeripheral_taskFxn (UARg a0、UARg A1)

    //初始化应用程序
    SimpleBLEPeripheral_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)

    uint8 safeToDealloc = true;

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

    iCall_Stack_Event *pEvt =(iCall_Stack_Event *) pMsg;

    //首先检查 BLE 堆栈事件
    if (pEvt->signature == 0xFFFF)

    if (pEvt->EVENT_FLAG & SBP_CONN_EVT_END_EVT)

    //尝试重新发送待处理的 ATT 响应(如果有)
    SimpleBLEPeripheral_sendAttRsp();


    其他

    //处理任务间消息
    safeToDealloc = SimpleBLEPeripheral_processStackMsg ((iCall_HDR *) pMsg);



    if (pMsg && safeToDealloc)

    iCall_freeMsg (pMsg);



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

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

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

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




    IF (事件和 SBP_Periode_EVT)

    事件&=~SBP_Periode_EVT;

    Util_startClock (周期时钟);

    //执行周期性应用任务
    SimpleBLEPeripheral_performPeriodicTask();


    #ifdef Feature_OAD
    while (!Queue_empty (hOadQ))

    oadTargetWrite_t * oadWriteEvt = Queue_get (hOadQ);

    //识别新图像。
    if (oadWriteEvt->event == OAD_WRITE_Identify_Req)

    OAD_imgIdentifyWrite (oadWriteEvt->connHandle、oadWriteEvt->pData);

    //写下一个块请求。
    否则(oadWriteEvt->event =OAD_WRITE_BLOCK_REQ)

    OAD_imgBlockWrite (oadWriteEvt->connHandle、oadWriteEvt->pData);


    //自由缓冲区。
    iCall_free (oadWriteEvt);

    #endif //feature_OAD



    /*********
    *@fn SimpleBLEPeripheral_processStackMsg
    *
    *@简短处理传入的堆栈消息。
    *
    *@param pMsg -要处理的消息
    *
    *@如果可以安全地取消分配传入消息、则返回 true、否则返回 false。
    *
    静态 uint8_t SimpleBLEPeripheral_processStackMsg (iCall_HDR *pMsg)

    uint8_t safeToDealloc = true;

    switch (pMsg->EVENT)

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

    案例 HCI_GAP_EVENT_EVENT:

    //处理 HCI 消息
    switch (pMsg->status)

    案例 HCI_COMMAND_COMPLET_EVENT_CODE:
    //处理 HCI 命令完成事件
    中断;

    默认值:
    中断;


    中断;

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


    返回(safeToDealloc);


    /*********
    *@fn SimpleBLEPeripheral_processGATTMsg
    *
    *@简短处理 GATT 消息和事件。
    *
    *@如果可以安全地取消分配传入消息、则返回 true、否则返回 false。
    *
    静态 uint8_t SimpleBLEPeripheral_processGATTMsg (gattMsgEvent_t * pMsg)

    //查看 GATT 服务器是否无法传输 ATT 响应
    if (pMsg->HDR.status == blePending)

    //没有 HCI 缓冲器可用。 让我们尝试重新传输响应
    //发生下一个连接事件。
    if (HCI_EXT_ConnEventNoticeCmd (pMsg->connHandle、self 实体、
    SBP_CONN_EVT_END_EVT)=成功)

    //首先释放任何待处理的响应
    SimpleBLEPeripheral_freeAttsp (故障);

    //保持响应消息以重新传输
    pAttRsp = pMsg;

    //尚未释放响应消息
    返回(false);


    否则(pMsg->method =ATT_flow_CTRL_쟖 랸_event)

    // ATT 请求-响应或指示-确认流量控制为
    //违反。 所有后续 ATT 请求或指示将被丢弃。
    //如果应用程序想要断开连接,将通知该应用程序。

    //显示导致违规的消息的操作码。
    Display_Print1 (dispHandle、5、0、"FC ined:%d"、pMsg->msg.flowCtrlEvt.opcode);

    否则(pMsg->method == ATT_MTU_updated_event)

    // MTU 大小已更新
    Display_Print1 (dispHandle、5、0、"MTU 大小:$d"、pMsg->msg.mtuEvt.MTU);


    //自由消息有效载荷。 仅用于 ATT 协议消息
    GATT_BM_FREE (&pMsg->msg、pMsg->method);

    //释放传入的消息是安全的
    返回(真);


    /*********
    *@fn SimpleBLEPeripheral_sendAttRsp
    *
    *@简短发送待处理的 ATT 响应消息。
    *
    *@param none
    *
    *@返回无
    *
    静态空 SimpleBLEPeripheral_sendAttRsp (空)

    //查看是否有待发送的 ATT 响应
    if (pAttRsp!=空)

    uint8_t status;

    //递增重发计数
    rspTxRetry++;

    //尝试重新发送 ATT 响应,直到我们成功或
    // ATT 客户端超时(30秒后)并断开连接。
    status = GATT_SendRsp (pAttRsp->connHandle、pAttRsp->method、&(pAttRsp->msg));
    if ((status!= blePending)&&(status!= MSG_buffer_no_avail))

    //禁用连接事件结束通知
    HCI_EXT_ConnEventNoticeCmd (pAttRsp->connHandle、self 实体、0);

    //我们已完成响应消息
    SimpleBLEPeripheral_freeAttsp (status);

    其他

    //继续重试
    Display_Print1 (dispHandle、5、0、"RSP SEND RETRY:%d"、rspTxRetry);




    /*********
    *@fn SimpleBLEPeripheral_freeAttRsp
    *
    *@简短的 Free ATT Response 消息。
    *
    *@param status -响应发送状态
    *
    *@返回无
    *
    静态空 SimpleBLEPeripheral_freeAttsp (uint8_t 状态)

    //查看是否有待处理的 ATT 响应消息
    if (pAttRsp!=空)

    //查看响应是否已成功发送
    if (status == Success)(如果(状态==成功))

    Display_Print1 (dispHandle、5、0、"RSP Sent retry:%d"、rspTxRetry);

    其他

    //自由响应有效载荷
    GATT_BM_FREE (&pAttRsp->msg、pAttRsp->method);

    Display_Print1 (dispHandle、5、0、"RSP RETRY FAILED:%d"、rspTxRetry);


    //自由响应消息
    iCall_freeMsg (pAttRsp);

    //重置我们的全局变量
    pAttRsp =空;
    rspTxRetry = 0;



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

    switch (pMsg->HDR.event)

    案例 SBP_State_change_EVT:
    SimpleBLEPeripheral_processStateChangeEvt ((gaprole_states_t) pMsg->
    HDR.state);
    中断;

    案例 SBP_CHAR_CHANGE_EVT:
    SimpleBLEPeripheral_processCharValueChangeEvt (pMsg->HDR.state);
    中断;

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



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

    SimpleBLEPeripheral_enqueueMsg (SBP_State_change_EVT、newState);


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

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

    switch (newState)

    案例 GAPROLE_Started:

    uint8_t ownAddress[B_ADDR_LEN];
    uint8_t systemId[DevInfo_system_ID_LEN];

    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);

    //显示设备地址
    Display_print0 (dispHandle、1、0、Util_convertBdAddr2Str (ownAddress));
    display_print0 (dispHandle、2、0、"已初始化");

    中断;

    案例 GAPROLE_advertising:
    Display_print0 (dispHandle、2、0、"广播");
    中断;

    #ifdef PLUS_Broadcaster
    /*在断开连接后,PLUS_Broadcaster 中的设备将继续
    *发送不可连接的广播并应发送此更改
    向应用程序发送*状态。 然后在这里禁用这些功能、以便发送
    *可以恢复可连接的广播。
    *
    案例 GAPROLE_advertising_NONCONN:

    uint8_t advertEnabled = false;

    //禁用非连接的广播。
    GAPRole_SetParameter (GAPROLE_ADV_NONCONN_ENABLED、sizeof (uint8_t)、
    advertEnabled (advertEnabled)(&D);

    advertEnabled = true;

    //启用可连接广播。
    GAPRole_SetParameter (GAPROLE_Adverte_enabled、sizeof (uint8_t)、
    advertEnabled (advertEnabled)(&D);

    //重置下一个连接的标志。
    firstConnFlag = false;

    SimpleBLEPeripheral_freeAttsp (bleNotConnected);

    中断;
    #endif //plus_broadcaster

    案例 GAPROLE_Connected:

    linkDBInfo_t linkInfo;
    uint8_t numActive = 0;

    Util_startClock (周期时钟);

    numActive = linkDB_NumActive();

    //使用 numActive 确定最后一个的连接句柄
    //连接
    if ( linkDB_getinfo( numActive -1,&linkInfo )==成功)

    Display_Print1 (dispHandle、2、0、"Num Conns:%d"、(uint16_t) numActive);
    Display_print0 (dispHandle、3、0、Util_convertBdAddr2Str (linkInfo.addr));

    其他

    uint8_t peerAddress[B_ADDR_LEN];

    GAPRole_GetParameter (GAPROLE_CONN_BD_ADDR、peerAddress);

    Display_print0 (dispHandle、2、0、"已连接");
    Display_print0 (dispHandle、3、0、Util_convertBdAddr2Str (peerAddress));


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

    uint8_t advertEnabled = false;//打开广播

    //禁用可连接的广播。
    GAPRole_SetParameter (GAPROLE_Adverte_enabled、sizeof (uint8_t)、
    advertEnabled (advertEnabled)(&D);

    //对于非连接的广播,设置为 true。
    advertEnabled = true;

    //启用非连接的广播。
    GAPRole_SetParameter (GAPROLE_ADV_NONCONN_ENABLED、sizeof (uint8_t)、
    advertEnabled (advertEnabled)(&D);
    firstConnFlag =真;

    #endif // plus_broadcaster

    中断;

    案例 GAPROLE_Connected ADV:
    Display_print0 (dispHandle、2、0、"连接广播");
    中断;

    案例 GAPROLE_等待:
    Util_stopClock (周期时钟);
    SimpleBLEPeripheral_freeAttsp (bleNotConnected);

    Display_print0 (dispHandle、2、0、"已断开连接");

    //清除剩余行
    Display_clearLines (dispHandle、3、5);
    中断;

    案例 GAPROLE_WAITING_FACT_TIMEOUT:
    SimpleBLEPeripheral_freeAttsp (bleNotConnected);

    Display_print0 (dispHandle、2、0、"超时");

    //清除剩余行
    Display_clearLines (dispHandle、3、5);

    #ifdef PLUS_Broadcaster
    //重置下一个连接的标志。
    firstConnFlag = false;
    #endif //#ifdef (PLUS_Broadcaster)
    中断;

    案例 GAPROLE_ERROR:
    Display_print0 (dispHandle、2、0、"Error");
    中断;

    默认值:
    Display_Clearline (dispHandle、2);
    中断;


    //更新状态
    //gapProfileState = newState;


    #ifndef feature_OAD_ONCHIP
    /*********
    *@fn SimpleBLEPeripheral_charValueChangeCB
    *
    *@简单配置文件中的简短回调表示特征
    * 值变化。
    *
    *@param paramID -已更改值的参数 ID。
    *
    *@返回无。
    *
    静态空 SimpleBLEPeripheral_charValueChangeCB (uint8_t 参数 ID)

    SimpleBLEPeripheral_enqueueMsg (SBP_char_change_EVT、paramID);

    #endif //!feature_OAD_ONCHIP

    /*********
    *@fn SimpleBLEPeripheral_processCharValueChangeEvt
    *
    *@简短处理暂挂的简单配置文件特性值更改
    * 事件。
    *
    *@param paramID -已更改值的参数 ID。
    *
    *@返回无。
    *
    静态空 SimpleBLEPeripheral_processCharValueChangeEvt (uint8_t 参数 ID)

    #ifndef feature_OAD_ONCHIP
    uint8_t newValue;

    switch (paramID)

    SIMPLEPROFILE_CHAR1案例:
    SimpleProfile_GetParameter (SIMPLEPROFILE_CHAR1、newValue);

    Display_Print1 (dispHandle、4、0、"Char 1:%d"、(uint16_t) newValue);
    中断;

    SIMPLEPROFILE_CHAR3案例:
    SimpleProfile_GetParameter (SIMPLEPROFILE_CHAR3、newValue);

    Display_Print1 (dispHandle、4、0、"Char 3:%d"、(uint16_t) newValue);
    中断;

    默认值:
    //不应该到达这里!
    中断;

    #endif //!feature_OAD_ONCHIP


    /*********
    *@fn SimpleBLEPeripheral_performPeriodicTask
    *
    *@简述执行定期应用任务。 调用该函数
    * 每5秒(SBP_PERIOD_EVT_PERIOD)。 在此示例中、
    * SimpleGATTProfile 中第三个特征的值
    * 服务从配置文件中检索,然后复制到中
    * 第四个特征的值。
    *
    *@param 无。
    *
    *@返回无。
    *
    静态空 SimpleBLEPeripheral_performPeriodicTask (空)

    #ifndef feature_OAD_ONCHIP
    uint8_t valueToCopy;

    //调用以检索配置文件中第三个特征的值
    if (SimpleProfile_GetParameter (SIMPLEPROFILE_CHAR3、&valueToCopy)==成功)

    //调用以设置配置文件中第四个特征的值。
    //请注意,如果已收到第四个特征的通知
    // GATT 客户端设备启用,然后将发送通知
    //每次调用此函数。
    SimpleProfile_SetParameter (SIMPLEPROFILE_CHAR4、sizeof (uint8_t)、
    &valueToCopy);

    #endif //!feature_OAD_ONCHIP



    #ifdef Feature_OAD
    /*********
    *@fn SimpleBLEPeripheral_processOadWriteCB
    *
    *@简短处理一个到 OAD 配置文件的写入请求。
    *
    *@参数事件 -事件类型:
    * OAD_WRITE_Identify_Req
    * OAD_WRITE_BLOCK_REQ
    *@param connHandle -此请求的连接句柄来自。
    *@param pData -指向数据的指针,用于处理和/或存储。
    *
    *@返回无。
    *
    void SimpleBLEPeripheral_processOadWriteCB (uint8_t 事件、uint16_t connHandle、
    uint8_t *pData)

    oadTargetWrite_t * oadWriteEvt = iCall_malloc (sizeof (oadTargetWrite_t)+\
    sizeof (uint8_t)* OAD_packet_size);

    if (oadWriteEvt!= NULL)

    oadWriteEvt->event = event;
    oadWriteEvt->connHandle = connHandle;

    oadWriteEvt->pData =(uint8_t *)(oadWriteEvt->pData + 1);
    memcpy (oadWriteEvt->pData、pData、OAD_packet_size);

    Queue_put (hOadQ、(Queue_Elem *) oadWriteEvt);

    //发布应用程序的信标。
    Semaphore_post (SEM);

    其他

    //无提示失败。


    #endif //feature_OAD

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

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

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


    /*********
    *@fn SimpleBLEPeripheral_enqueueMsg
    *
    *@brief 会创建一条消息并将该消息放入 RTOS 队列中。
    *
    *@参数事件-消息事件。
    *@参数状态-消息状态。
    *
    *@返回无。
    *
    静态空 SimpleBLEPeripheral_enqueueMsg (uint8_t 事件、uint8_t 状态)

    sbpEvt_t *pMsg;

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

    pMsg->HDR.EVENT =事件;
    pMsg->HDR.state = state;

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



    /*********
    (三 /
    (二

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

    我想您在我在上一封邮件中发送的大型转储源代码转储中找不到任何内容。 我在这个项目上做了很多工作、除了 SPI、我还在等待别人的回答、但很快就会回到 SPI。 我还通过电子邮件向 support@ti.com 发送了邮件、但尚未收到回复。

    我没有逻辑分析仪、但我有一个双通道示波器。 这个电路板很小、很难探测、但我可以说 SPI 写/读回调用确实会使 SPI 外设生成时钟和数据信号、因此我知道库调用正在运行、但它永远不会返回。

    感谢您的反馈。

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

    大家好、Michael McCully、
    哦,很抱歉! 我没收到你的最后一封邮件。 我找不到关于您的代码的任何信息。 但是、我在代码中看不到有关如何调用 SPI 传输的任何代码。 请向我发送初始化并使用 SPI_transfer 的代码

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

    下面是使用阻塞模式调用 SPI_Transfer()的代码。 它永远不会返回。 它锁定等待信标、正如我在前面的一篇文章中所示。

    在我上次发送的代码中、我包括了 board.c/.h、我认为也是 simple_peripheral.c. 您是否有机会查看这些内容?

    void ADS1293_init(){
    SPI_PARAMS_INIT (params);
    params.transferMode = SPI_MODE_BLOCKING;
    params.bitrate = 1000000;
    params.frameFormat = SPI_POL1_PHA0;
    params.dataSize = 16;
    params.mode = SPI_MASTER;

    transaction.count = 1;
    transaction.txBuf = txBuf;
    transaction.rxBuf = rxBuf;

    句柄= SPI_OPEN (0、params);
    if (handle!= NULL){
    SPI_TRANSFCTION (句柄、事务);



    谢谢、
    Mike McCully