cc2640À¶ÑÀоƬÈí¼þ¿ª·¢Ö¸µ¼ËµÃ÷Îļþ - ͼÎÄ ÏÂÔØ±¾ÎÄ

ÄÚÈÝ·¢²¼¸üÐÂʱ¼ä : 2026/3/14 15:57:18ÐÇÆÚÒ» ÏÂÃæÊÇÎÄÕµÄÈ«²¿ÄÚÈÝÇëÈÏÕæÔĶÁ¡£

4.3 ͨÓÃÓ¦Óüܹ¹

ÕâÒ»Õ½«ÃèÊöÒ»¸öÓ¦ÓÃÈÎÎñµÄ´´½¨µÄ¸ü¶àµÄϸ½Ú 4.3.1 Ó¦Óóõʼ»¯º¯Êý

µÚ3.3ÕÂÃèÊöÁËÒ»¸öÈÎÎñÊÇÈçºÎ¹¹½¨µÄ¡£ÔÚÈÎÎñ±»¹¹½¨Ö®ºó£¬SYS/BIOSÄں˵÷¶È½ø³Ì¾Í¿ªÊ¼£¬ÔÚÈÎÎñ¹¹½¨¹ý³Ìͨ¹ýµÄº¯Êý»áÔÚÈÎÎñ¾ÍÐ÷ʱÔËÐУ¨±ÈÈçSimpleBLEperipheral_taskFxn£©¡£¸Ãº¯ÊýµÚÒ»¼þÓ¦¸Ã×öµÄʾÍÊǵͰ¡ÓÃÒ»¸öÓ¦Óóõʼ»¯º¯Êý¡£¾ÙÀý˵Ã÷£¬ÔÚSimpleBLEPerpheral.cÖУº

static void SimpleBLEPeripheral_taskFxn(UArg a0, UArg a1) {

// Initialize application

SimpleBLEPeripheral_init(); // Application main loop for (;;) { ¡­

Õâ¸ö³õʼ»¯º¯Êý£¬SimpleBLEPeripheral_init()£¬ÅäÖÃÁËÊý¸ö·þÎñ¸øÈÎÎñͬʱҲÉèÖÃϵÁÐÓ²¼þºÍÈí¼þµÄÅäÖÃÉèÖúͲÎÊý¡£Ò»Ð©¹²Í¬µÄÀý×Ó¾ÍÊÇ£º³õʼ»¯GATT¿Í»§¶Ë£¬×¢²á¸÷ÖÖProfileÖеĻص÷º¯Êý£¬ÉèÖÃGAPRole£¬ÉèÖð󶨹ÜÀí£¬ÉèÖÃGAP²ã£¬ÅäÖÃÓ²¼þÄ£¿éÈçLCD£¬SPIµÈ¡£ÔÚ¸ÃÖ¸µ¼Öв鿴Ïà¹ØÕ½ڻñÈ¡ÕâЩÀý×ӵĸü¶àÐÅÏ¢¡£

×¢Ò⣺ÔÚÓ¦Óóõʼ»¯º¯ÊýÖУ¬ICall_registerApp()±ØÐëÔÚÆäËûÕ»½Ó¿Úµ÷ÓÃ֮ǰµ÷Óᣠ4.3.2 ÈÎÎñº¯ÊýÖеÄʼþ½ø³Ì¡£

ÔÚ³õʼ»¯º¯ÊýÖ®ºó£¬ÏñÉÏÃæ´úÂëÖÐչʾµÄÒ»Ñù£¬ÈÎÎñº¯Êý»á½øÈëÒ»¸öÎÞÏÞÑ­»·ÖУ¬Ëü½«»á±£³Ö×èÈû²¢µÈ´ýÒ»¸öÐÅºÅÆì·¢ËÍÒ»¸öеÄÔ­Òò¸ø½ø³Ì£º

ICall_Errno errno = ICall_wait(ICALL_TIMEOUT_FOREVER); if (errno == ICALL_ERRNO_SUCCESS) { ...

Ò»µ©Ò»¸öʼþ»òÆäËûµÄ´Ì¼¤·¢Éú²¢´¦Àí£¬ÈÎÎñ¾Í»áÔٴνøÈë¶¥´÷ÐÅºÅÆì²¢±£³Ö×èÈû״̬֪µÀÆäËûµÄÔ­ÒòÈ¥Ö´ÐС£Çë¿´ÏÂÃæµÄÂß¼­Í¼£º

ÈçÉÏͼËùʾ£¬ÕâÀïÓжàÖÖÀíÓÉ¿ÉÒÔµ¼ÖÂÐÅºÅÆìͨ¹ý²¢ÇÒʹÈÎÎñ¼¤»îÖ´ÐУ¬ËûÃǰüÀ¨£º 4.3.2.1 ÄÚ²¿ÈÎÎñÏûÏ¢

5 6 7 8 9

if (ICall_fetchServiceMsg(&src, &dest, (void **)&pMsg) == ICALL_ERRNO_SUCCESS) {

if ((src == ICALL_SERVICE_CLASS_BLE) && (dest == selfEntity)) {

10 // Process inter-task message

11 SimpleBLEPeripheral_processStackMsg((ICall_Hdr *)pMsg); 12 } 13 if (pMsg) 14 {

15 ICall_freeMsg(pMsg);

16 }

ÕâЩÊÇÆäËûÈÎÎñ£¨ÈçBLEЭÒéÕ»£©Í¨¹ýICall·¢Ë͸øÓ¦ÓõÄÏûÏ¢¡£ÔÚSimpleBLEPeripheral¹¤³ÌÖÐûÓÐÕâÑùµÄÀý×Ó¡£ÆäËû¿ÉÄܵÄÀý×ÓÓУº 1. Ò»¸öÈ·¶¨µÄ·¢ËÍ×ÔЭÒéջȷÈϵĿÕÖÐָʾ

2. Ò»¸ö·¢ËÍ×ÔЭÒéÕ»µÄ¡¢Á¬½ÓʼþºÍ¹ã²¥½áÊøµÄ֪ͨ¡£

3. Ò»¸ö»Ø¸´¸øGATT¿Í»§¶ËµÄ²Ù×÷¡£¿´5.3.3ÕÂÓÐÕâ·½ÃæµÄÀý×Ó¡£ 4.3.2.1.1 ÄÚ²¿ÈÎÎñʼþ

ÔÚһЩÉÙÊýµÄ°¸ÀýÖУ¬BLEЭÒéÕ»½«»áͨ¹ýICallÔÚÓ¦ÓÃÈÎÎñÖÐÉèÖÃÒ»¸öʼþ¡£ÕâÑùµÄÀý×Ó¾Í

Êǵ±HCI_EXT_AdvEventNoticeCmd()µ÷ÓÃʱ¡£ÔÚÕâЩ°¸ÀýÖУ¬ÐÂÔöµÄ´úÂëÐèÌí¼Óµ½ifÓï¾äÖÐÄ¿µÄÊÇΪÁËÓëBLEЭÒéջʼþºÍÏûÏ¢×÷³öÇø±ð¡£ÕâÒ»µã½«»áÔÚ±¾ÎĵµµÄÈκÎÐèÒªµÄµØ·½¶¼»áÃ÷È·µÄÌáʾ¡£ÕâÑùÌí¼Ó¼ì²éµÄÀý×Ó¾ÍÊÇGAPRoleÈÎÎñµÄÈÎÎñº¯Êý£º

if (ICall_fetchServiceMsg(&src, &dest, (void **)&pMsg) == ICALL_ERRNO_SUCCESS) {

if ((src == ICALL_SERVICE_CLASS_BLE) && (dest == selfEntity)) {

ICall_Event *pEvt = (ICall_Event *)pMsg; // Check for BLE stack events first if (pEvt->signature == 0xffff)

{

if (pEvt->event_flag &GAP_EVENT_SIGN_COUNTER_CHANGED) {

// Sign counter changed, save it to NV

VOID osal_snv_write(BLE_NVID_SIGNCOUNTER, sizeof(uint32_t), &gapRole_signCounter);

} } else {

// Process inter-task message

gapRole_processStackMsg((ICall_Hdr *)pMsg); } }

if (pMsg)

{

ICall_freeMsg(pMsg);

} }

×¢ÒâÉÏÃæµÄ´úÂ룬Èç¹ûʼþÀ´×ÔÓÚBLEЭÒéÕ»pEvt->signature ½«×ÜÊǵÈÓÚ0xFFFF¡£

µ±ÎªÁËÒ»¸öÄÚ²¿Ê¼þÑ¡ÔñÁËÒ»¸öʼþֵʱ£¬Õâ¸öÖµ¶ÔÓÚÈÎÎñ±ØÐëÊÇΨһµÄ²¢ÇÒ±ØÐëÊǶàÓÚ2µÄ(Òò´ËÖ»ÐèÉèÖÃÒ»¸öλ)¡£ÓÉÓÚpEvt->event±äÁ¿ÊÇÒÔuint16_t³õʼ»¯µÄ£¬ËùÒÔ×î´óÔÊÐí16¸öʼþ¡£ÄÇЩÒѾ­ÓÃÓÚBLE OSAL È«¾ÖʼþµÄʼþÖµÊDz»ÄÜÔÙÓõġ£

/********************************************************************* * BLE OSAL GAP GLOBAL Events */

#define GAP_EVENT_SIGN_COUNTER_CHANGED 0x4000 //!< The device level sign counter changed

×¢ÒâÕâЩÄÚ²¿ÈÎÎñÊÇһЩÁÐÓë4.2.3.2ÖÐÌáµ½µÄÄÚ²¿ÈÎÎñʼþ²»Í¬µÄʼþ¡£ 4.3.2.2 ·¢Ë͵½Ó¦ÓÃÈÎÎñµÄRTOS¶ÓÁÐÖеÄÏûÏ¢

5. // If RTOS queue is not empty, process app message. 6. if (!Queue_empty(appMsgQueue)) 7. {

8. sbpEvt_t *pMsg = (sbpEvt_t *)Util_dequeueMsg(appMsgQueue); 9. if (pMsg)

10. {

// Process message.

SimpleBLEPeripheral_processAppMsg(pMsg); // Free the space from the message. ICall_free(pMsg); }

1. }

ÕâЩÏûÏ¢ÓÃSimpleBLEPeripheral_enqueueMsg()º¯ÊýÅÅÐò¡£ÒòΪËüÃDZ»·¢Ë͵½¶ÓÁÐÖУ¬µ±ËüÃÇ·¢ËÍʱ»á±»´¦Àí¡£Ò»¸öÕâ·½ÃæµÄͨÓõÄÀý×Ó¾ÍÊÇÔڻص÷º¯ÊýÖнÓÊÕµ½Ò»¸öʼþ£¨ÔĶÁ5.3.4.2.4Õ£©¡£

4.3.2.3 ͨ¹ýÄÚ²¿Ê¼þÖµ·¢Ë͵Äʼþ

5. if (events &SBP_PERIODIC_EVT) 6. {

7. events &= ~SBP_PERIODIC_EVT; 8. Util_startClock(&periodicClock); 9. // Perform periodic application task 10. SimpleBLEPeripheral_performPeriodicTask(); 11. }

ÕâЩ·¢Ë͸øÓ¦ÓÃÈÎÎñµÄͬ²½Ê¼þÊÇͨ¹ýÉèÖÃÓ¦ÓÃÈÎÎñµÄeventsµÄÖµµÄÏà¹ØÎ»ÊµÏֵģ¬Ã¿¸öλ¶ÔÓ¦×ÅÒ»¸ö¶¨ÒåºÃµÄʼþ£¬±ÈÈ磺

// Internal Events for RTOS application #define SBP_STATE_CHANGE_EVT 0x0001 #define SBP_CHAR_CHANGE_EVT 0x0002 #define SBP_PERIODIC_EVT 0x0004

º¯ÊýÔÚÉèÖÃÕâЩʼþÖµµÄλʱ±ØÐëÈ·±£·¢Ë͸øÐÅºÅÆìÀ´¼¤»îÓ¦ÓÃÀ´Ö´ÐС£Õâ·½ÃæµÄÀý×Ó¾ÍÊÇʱÖÓ´¦Àíº¯ÊýÓÃÀ´´¦ÀíʱÖӵij¬Ê±¡£Õⲿ·ÖµÄÃèÊöÔÚ3.4.2ÖС£

×¢Òâµ±Ìí¼ÓÒ»¸öʼþʱ£¬¶ÔÓÚ¸ø¶¨µÄÈÎÎñÆäÖµ±ØÐëÊÇΨһµÄ²¢ÇÒ±ØÐë¶àÓÚ2£¨ÕâÑù¾Í¿ÉÒÔÖ»ÓÐÒ»¸öλ¿ÉÒÔÉèÖã©¡£ÓÉÓÚevents±äÁ¿Êǰ´ÕÕuint16_t³õʼ»¯Òò´Ë×î¶à¿ÉÒÔ¶¨Òå16¸öÄÚ²¿Ê¼þ¡£ 4.3.3 »Øµ÷

Ó¦ÓôúÂëͬÑùÒ²°üº¬Á˸÷ÖÖ¸øÐ­Òé²ã¡¢profileºÍRTOSÄ£¿éµÄ»Øµ÷º¯Êý¡£ÎªÁËÈ·±£Ï̵߳ݲȫ£¬ÔÚÒ»¸öÈ·ÇеĻص÷º¯ÊýÖÐÓ¦¸Ã½øÐÐ×îСµÄ´¦Àí£¬´óÁ¿µÄ´¦ÀíÓ¦¸ÃÔÚÓ¦ÓõÄÉÏÏÂÎÄÖÐÍê³É¡£Òò´Ëÿ¸ö»Øµ÷º¯Êýͨ³£¶¼¶ÔÓ¦Á½¸öº¯Êý£¨²Î¿¼GAPRole״̬¸Ä±ä»Øµ÷º¯Êý£©£º 1. È·ÇеĻص÷º¯Êý£ºÕâ¸öº¯ÊýÔÚµ÷Óú¯ÊýµÄÉÏÏÂÎÄÖе÷Óã¨ÈçGAPRoleÈÎÎñ£©¡£ÎªÁËÔÚµ÷

ÓÃÉÏÏÂÎÄÖнøÐÐ×îСµÄ´¦Àí£¬ËùÓÐÕâ¸öº¯ÊýµÄÓ¦¸Ã½«Ò»¸öʼþÅÅÁе½Ó¦ÓöÓÁÐÖнøÐд¦Àí¡£

static void SimpleBLEPeripheral_stateChangeCB(gaprole_States_t newState) {

SimpleBLEPeripheral_enqueueMsg(SBP_STATE_CHANGE_EVT, newState); }

2. ÔÚÓ¦ÓÃÉÏÏÂÎÄÖнøÐеĺ¯Êý£ºµ±Ó¦Óñ»»Øµ÷º¯ÊýµÄÅÅÐò»½ÐѺó£¬Õâ¸öº¯Êý¾Í»áÔÚʼþͨ

¹ýÓ¦ÓöÓÁз¢Ëͺʹ¦ÀíÖ®ºó±»µ÷Óá£

static void SimpleBLEPeripheral_processStateChangeEvt(gaprole_States_t newState) {