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.

[FAQ] CC2640R2F: 如何将传感器控制器示例与 simple_peripheral 合并?(分步指南)

Part Number: CC2640R2F

器件型号:CC2640R2F

以下是将传感器控制器 (SC) 示例合并到 simple_peripheral 示例 (CC2640R2F/BLE) 的步骤:
这些步骤可重复用于所有具有传感器控制器的器件。

开始之前:

以下是分步指南:

  1. 打开 Sensor Controller Studio (SCS),打开 CC2640R2F 的示例 LED 闪烁灯
  2. 生成代码 - 查看生成的文件并找到工程的路径
  3. 打开 CCS。导入 SCS 为 TIRTOS 生成的工程。
  4. 构建和测试(使用按钮打开和关闭blinking)
  5. 导入 simple_peripheral 示例
  6. 构建 simple_peripheral(如果需要,请进行测试)
  7. 将 SC 示例合并到 simple_peripheral 示例
    注意:我们不会使用此处的按钮 – LED 将始终闪烁。
    • 将文件c、scif.h、scif_framework.c、scif_framework.h、scif_osal_tirtos.h 复制并粘贴到工程中。我保留了指向这些文件的链接(但可以采用不同的方式)。
      注意:如果您使用指向这些文件的链接,CCS 将询问您是否要添加包含路径,回答是(或手动添加路径)。
    • 复制并粘贴 SimplePeripheral_taskFxn 中用于初始化 SC 的代码。
      复制并粘贴 SimplePeripheral_taskFxn 中用于启用绿色 LED 的代码。
      static void SimplePeripheral_taskFxn(UArg a0, UArg a1)
      {
        // 初始化应用程序
        SimplePeripheral_init();
      
        //**************************************//
        //  此代码用于 SC 初始化 //
        //**************************************//
        // 初始化并启动传感器控制器
        scifOsalInit();
        scifOsalRegisterCtrlReadyCallback(scCtrlReadyCallback);
        scifOsalRegisterTaskAlertCallback(scTaskAlertCallback);
        scifInit(&scifDriverSetup);
        scifStartRtcTicksNow(0x00010000 / 10);
        scifStartTasksNbl(BV(SCIF_LED_BLINKER_TASK_ID));
      
        //*************************************//
        //  此代码用于 GLED 初始化 //
        //************************************//
        // 启用 LED 引脚
        hLedPins = PIN_open(&ledPinState, pLedPinTable);
      
        // 应用程序主环路
        for (;;)
        {
          uint32_t events;
      
          // 等待与调用线程相关联的事件发布。
          // 请注意,当消息排队到线程的消息接收队列时,
          // 会发布与线程相关联的事件
          events = Event_pend(syncEvent, Event_Id_NONE, SBP_ALL_EVENTS,
                              ICALL_TIMEOUT_FOREVER);
      

  • 复制粘贴所需的 include。
    复制粘贴所需的symbols。
    复制粘贴回调函数(回调的内容将在之后修改)。
  • #include "scif.h"
    
    PIN_Config pLedPinTable[] = {
        Board_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
        PIN_TERMINATE
    };
    PIN_State ledPinState;
    PIN_Handle hLedPins;
    
    void scCtrlReadyCallback(void) {
    
    } // scCtrlReadyCallback
    
    void scTaskAlertCallback(void) {
    
        SimplePeripheral_enqueueMsg(SBP_SC_ALERT, NULL, NULL);
    
    } // scTaskAlertCallback
    

  • 修改 SC 回调函数的内容。simple_peripheral 示例使用消息(而非信标)将事件传递到主循环。我们将使用函数 SimplePeripheral_enqueueMsg() 对消息进行排队。将定义一个额外的应用程序事件 (SBP_SC_ALERT)。将从传感器控制器示例中复制发出此事件时要执行的代码。
    声明的应用程序事件如下:

 

// 应用程序事件
#define SBP_STATE_CHANGE_EVT                  0x0001
#define SBP_CHAR_CHANGE_EVT                   0x0002
#define SBP_PAIRING_STATE_EVT                 0x0004
#define SBP_PASSCODE_NEEDED_EVT               0x0008
#define SBP_CONN_EVT                          0x0010
#define SBP_SC_ALERT                          0x0099  // 添加这一个

以下是处理 SBP_SC_ALERT 事件的代码(添加在 SimplePeripheral_processAppMsg 中):

static void SimplePeripheral_processAppMsg(sbpEvt_t *pMsg)
{
  switch (pMsg->hdr.event)
  {
    // ...
    
  case SBP_CONN_EVT:
      {
        SimplePeripheral_processConnEvt((Gap_ConnEventRpt_t *)(pMsg->pData));

        ICall_free(pMsg->pData);
        break;
    }

    //*********************//
    // 添加此代码 //
    //*********************//
  case SBP_SC_ALERT:
  {
        //清除警报中断源
        scifClearAlertIntSource();

        // 如果 LED 闪烁器任务尚未停止 ...
        if (scifGetActiveTaskIds() & BV(SCIF_LED_BLINKER_TASK_ID)) {

            // 表示绿色 LED 上输出计数器变量的值
            PIN_setOutputValue(hLedPins, Board_GLED, (scifTaskData.ledBlinker.output.counter & 0x0001) != 0);
        }

        // 确认警报事件
        scifAckAlertEvents();

        break;
  }
  //*********************//
    // 添加的代码到此结束 //
    //*********************//

    default:
      // 不采取任何行动。
      break;
  }
}

  • 下面提供了我的c 文件的 diff 文件(是的,只修改了一个文件)供您参考:/cfs-file/__key/communityserver-discussions-components-files/538/simple_5F00_peripheral_5F00_c.diff
  1. 构建并测试。该示例应保持 LED 闪烁,并具有 simple_peripheral 示例的所有功能。