【LAUNCHXL-CC2650】simple_peripheral例程分析
[复制链接]
CC2650是双核系统,蓝牙协议栈运行在Cortex-M0的内核中,应用程序运行在Cortex-M3的内核中。simple_peripheral_cc2650lp_stack为协议栈,运行在Cortex-M0的内核中。simple_peripheral_cc2650lp_app为应用程序,运行在Cortex-M3的内核中。这里主要介绍运行在Cortex-M3内核中的应用程序。
一、主程序
在应用程序中的main()主函数的内容如下:
/* Register Application callback to trap asserts raised in the Stack */
RegisterAssertCback(AssertHandler);
PIN_init(BoardGpioInitTable);
// Enable iCache prefetching
VIMSConfigure(VIMS_BASE, TRUE, TRUE);
// Enable cache
VIMSModeSet(VIMS_BASE, VIMS_MODE_ENABLED);
/* Initialize ICall module */
ICall_init();
/* Start tasks of external images - Priority 5 */
ICall_createRemoteTasks();
/* Kick off profile - Priority 3 */
GAPRole_createTask();
SimpleBLEPeripheral_createTask();
/* enable interrupts and start SYS/BIOS */
BIOS_start();
RegisterAssertCback(AssertHandler);用于注册应用程序的断言处理程序。
PIN_init(BoardGpioInitTable);初始化板卡上使用到的GPIO口,初始化了LED引脚、按键引脚、UART引脚和SPI引脚。具体的BoardGpioInitTable在CC2650_LAUNCHXL。
VIMSConfigure(VIMS_BASE, TRUE, TRUE);使能iCache。
VIMSModeSet(VIMS_BASE, VIMS_MODE_ENABLED);使能cache。
由于应用程序和协议栈运行在不同的内核中,应用程序和协议栈通过ICall模块进行通信服务和RTOS某些原始服务(例如线程同步)。ICall允许应用程序和协议栈在统一的RTOS环境中高效运行,共享资源。所以在启动SYS/BIOS内核调度程序之前,应用程序必须要实例化和初始化ICall服务。
ICall_init();初始化ICall初级服务和框架。调用ICall_createRemoteTasks()创建但不起用蓝牙协议栈任务。在使用ICall协议服务之前,服务器和客户端必须注册ICall。在协议栈程序的osal_icall_ble.c文件中使用ICall服务,注册协议栈服务(服务器)的调用。
ICall_createRemoteTasks();使用自己已知地址的入口函数为每个外部映像创建一个任务。
GAPRole_createTask();为GAP外设角色创建任务功能。调用gapRole_init()进行初始化并处理GAP事件。
SimpleBLEPeripheral_createTask();为运用程序创建任务功能。初始化应用程序并处理应用程序事件。
BIOS_start();开启中断并启动SYS/BIOS调度。
二、设备信息
设备信息包括型号、固件版本、硬件版本、软件版本、厂商名称等。
设备信息在devinfoservice.c文件中,可以根据设备进行修改。
具体代码如下:
// System ID characteristic
static uint8 devInfoSystemIdProps = GATT_PROP_READ;
static uint8 devInfoSystemId[DEVINFO_SYSTEM_ID_LEN] = {0, 0, 0, 0, 0, 0, 0, 0};
// Model Number String characteristic
static uint8 devInfoModelNumberProps = GATT_PROP_READ;
static uint8 devInfoModelNumber[DEVINFO_STR_ATTR_LEN+1] = "Model Number";
// Serial Number String characteristic
static uint8 devInfoSerialNumberProps = GATT_PROP_READ;
static uint8 devInfoSerialNumber[DEVINFO_STR_ATTR_LEN+1] = "Serial Number";
// Firmware Revision String characteristic
static uint8 devInfoFirmwareRevProps = GATT_PROP_READ;
static uint8 devInfoFirmwareRev[DEVINFO_STR_ATTR_LEN+1] = "Firmware Revision";
// Hardware Revision String characteristic
static uint8 devInfoHardwareRevProps = GATT_PROP_READ;
static uint8 devInfoHardwareRev[DEVINFO_STR_ATTR_LEN+1] = "Hardware Revision";
// Software Revision String characteristic
static uint8 devInfoSoftwareRevProps = GATT_PROP_READ;
static uint8 devInfoSoftwareRev[DEVINFO_STR_ATTR_LEN+1] = "Software Revision";
// Manufacturer Name String characteristic
static uint8 devInfoMfrNameProps = GATT_PROP_READ;
static uint8 devInfoMfrName[DEVINFO_STR_ATTR_LEN+1] = "Manufacturer Name";
// IEEE 11073-20601 Regulatory Certification Data List characteristic
static uint8 devInfo11073CertProps = GATT_PROP_READ;
static uint8 defaultDevInfo11073Cert[] =
{
DEVINFO_11073_BODY_EXP, // authoritative body type
0x00, // authoritative body structure type
// authoritative body data follows below:
'e', 'x', 'p', 'e', 'r', 'i', 'm', 'e', 'n', 't', 'a', 'l'
};
// The length of this characteristic is not fixed
static uint8 *devInfo11073Cert = defaultDevInfo11073Cert;
static uint8 devInfo11073CertLen = sizeof(defaultDevInfo11073Cert);
// PnP ID characteristic
static uint8 devInfoPnpIdProps = GATT_PROP_READ;
static uint8 devInfoPnpId[DEVINFO_PNP_ID_LEN] =
{
1, // Vendor ID source (1=Bluetooth SIG)
LO_UINT16(0x000D), HI_UINT16(0x000D), // Vendor ID (Texas Instruments)
LO_UINT16(0x0000), HI_UINT16(0x0000), // Product ID (vendor-specific)
LO_UINT16(0x0110), HI_UINT16(0x0110) // Product version (JJ.M.N)
};
其中是System ID在simple_peripheral.c文件中有进行的重新定义,若要修改,需要在改文件中进行修改,重新定义源码如下。
// use 6 bytes of device address for 8 bytes of system ID value
systemId[0] = ownAddress[0];
systemId[1] = ownAddress[1];
systemId[2] = ownAddress[2];
// set middle bytes to zero
systemId[4] = 0x00;
systemId[3] = 0x00;
// shift three bytes up
systemId[7] = ownAddress[5];
systemId[6] = ownAddress[4];
systemId[5] = ownAddress[3];
使用nRF Connect连接开发板,可以读取相应的设备信息。
另外,在这边可以发现没有设备的名称,设备名称在simple_peripheral.c文件中进行了定义。
三、特征
该例程中定义了五个特征。在simple_gatt_profile文件中,对五个特征进行了定义,包括特征名称,UUID等。
在simple_peripheral.c中用SimpleProfile_SetParameter函数给5个特征分别赋值。
同时,当开启特征4通知时,特征4每隔5秒会读取特征3的值,并以特征3的值赋值给特征4。
在nRF Connect连接后,可以获取相应的特征信息。
|