CC2530 SampleApp 调试不成功的问题所在:HOLD_AUTO_START

本文分享了作者使用CC2530开发板进行Zigbee网络搭建的经验,解决了网络无法正常启动的问题。通过对比不同编译选项,发现HOLD_AUTO_START宏的作用关键。

   手上有两块CC2530的板子,资源不多,一个按键,两个LED,一个RS232,一个Debug口,别的GPIO基本上是以排针的形式出现,算然寒碜,但是比起上千元的zigbee开发板来说算是简洁并且便宜多,所以就用他们作为我学习TI Z-Stack的“开发板”。

   Z-stack程序的运行流程,OS任务、事件以及Hal控制,基本上都已熟悉,并且阅读了TI的所有Zigbee文档,但是,把SampleApp的Coordinator和Router的程序下载到板子里运行时,总是得不到正确的结构,调试工具仅限于一个仿真器,折腾了好多天,也改了好多代码,Key,LED等能操作,就是网络建不起来,几近崩溃。

   后来又重新阅读了TI的相关文档,决定按照SampleApp里的步骤完整的重做一遍(由于文档的提到的是BUILD_ALL_DEVICES,即下载Demo程序,然后用Jumper重启成不同的器件,但是我的板子上没有把接口明显的接出来,所以当初就没有建立Demo程序,而是单个下载Coordinator与Router),结果实验成功了!于是我就在思考之前一直不成功的问题所在。

  我发现Tools文件夹下的f8w2530.xcl和f8wConfig.cfg,不管使用哪种build方法都是公用的同一个问题,而且程序也是一样的,那么肯定是有另外的一些Compile选项不一样导致的,果然:

Demo的Option中DefinedSymbol中是:

HOLD_AUTO_START

ZTOOL_P1

MT_TASK

MT_SYS_FUNC

而单个的Coordinator和Router中的Option则是:

ZTOOL_P1
MT_TASK
MT_SYS_FUNC
MT_ZDO_FUNC
LCD_SUPPORTED=DEBUG

试验后发现是因为未加HOLD_AUTO_START导致的问题。
HOLD_AUTO_START的意思为:

HOLD_AUTO_START  Disable automatic start-up of ZDApp event processing loop 

#include "OSAL.h" #include "ZGlobals.h" #include "AF.h" #include "aps_groups.h" #include "ZDApp.h" #include "SampleApp.h" #include "SampleAppHw.h" #include "OnBoard.h" #include "hal_lcd.h" #include "hal_led.h" #include "hal_key.h" #include "MT_UART.h" #include "MT_APP.h" #include "MT.h" uint8 AppTitle[] = "ALD Broadcast"; afAddrType_t SampleApp_MY_DstAddr; const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] = { SAMPLEAPP_PERIODIC_CLUSTERID, SAMPLEAPP_FLASH_CLUSTERID }; const SimpleDescriptionFormat_t SampleApp_SimpleDesc = { SAMPLEAPP_ENDPOINT, SAMPLEAPP_PROFID, SAMPLEAPP_DEVICEID, SAMPLEAPP_DEVICE_VERSION, SAMPLEAPP_FLAGS, SAMPLEAPP_MAX_CLUSTERS, (cId_t *)SampleApp_ClusterList, SAMPLEAPP_MAX_CLUSTERS, (cId_t *)SampleApp_ClusterList }; endPointDesc_t SampleApp_epDesc; uint8 SampleApp_TaskID; devStates_t SampleApp_NwkState; uint8 SampleApp_TransID; afAddrType_t My_DstAddr; aps_Group_t SampleApp_Group; uint8 SampleAppPeriodicCounter = 0; uint8 SampleAppFlashCounter = 0; void SampleApp_HandleKeys( uint8 shift, uint8 keys ); void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pckt ); void SampleApp_SendPeriodicMessage( void ); void SampleApp_SendFlashMessage( uint16 flashTime ); void SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg); void SampleApp_Init( uint8 task_id ) { SampleApp_TaskID = task_id; SampleApp_NwkState = DEV_INIT; SampleApp_TransID = 0; MT_UartInit(); MT_UartRegisterTaskID(task_id); HalUARTWrite(0,"UartInit OK\n", sizeof("UartInit OK\n")); #if defined ( BUILD_ALL_DEVICES ) if ( readCoordinatorJumper() ) zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR; else zgDeviceLogicalType = ZG_DEVICETYPE_ROUTER; #endif #if defined ( HOLD_AUTO_START ) ZDOInitDevice(0); #endif SampleApp_MY_DstAddr.addrMode = (afAddrMode_t)Addr16Bit; SampleApp_MY_DstAddr.addr.shortAddr = SAMPLEAPP_MY_SHORT_ADDR; SampleApp_MY_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_MY_DstAddr.panId = 0xFFFF; SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_epDesc.task_id = &SampleApp_TaskID; SampleApp_epDesc.simpleDesc = (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc; SampleApp_epDesc.latencyReq = noLatencyReqs; afRegister( &SampleApp_epDesc ); RegisterForKeys( SampleApp_TaskID ); SampleApp_Group.ID = 0x0001; osal_memcpy( SampleApp_Group.name, "Group 1", 7 ); aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group ); #if defined ( LCD_SUPPORTED ) HalLcdWriteString( "SampleApp", HAL_LCD_LINE_1 ); #endif } uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ) { afIncomingMSGPacket_t *MSGpkt; (void)task_id; if ( events & SYS_EVENT_MSG ) { MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID ); while ( MSGpkt ) { switch ( MSGpkt->hdr.event ) { case KEY_CHANGE: SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys ); break; case AF_INCOMING_MSG_CMD: SampleApp_MessageMSGCB( MSGpkt ); break; case ZDO_STATE_CHANGE: SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status); if (( SampleApp_NwkState == DEV_ZB_COORD) || (SampleApp_NwkState == DEV_ROUTER) || (SampleApp_NwkState == DEV_END_DEVICE) ) { osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT ); } break; default: break; } osal_msg_deallocate( (uint8 *)MSGpkt ); MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID ); } return (events ^ SYS_EVENT_MSG); } if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) { SampleApp_SendPeriodicMessage(); osal_start_timerEx( SampleApp_TaskID, 0x0004, (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) ); return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT); } return 0; } void SampleApp_HandleKeys( uint8 shift, uint8 keys ) { (void)shift; if ( keys & HAL_KEY_SW_1 ) { SampleApp_SendFlashMessage( SAMPLEAPP_FLASH_DURATION ); } if ( keys & HAL_KEY_SW_2 ) { aps_Group_t *grp; grp = aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP ); if ( grp ) { aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP ); } else { aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group ); } } } void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) { uint16 flashTime; switch ( pkt->clusterId ) { case SAMPLEAPP_UNICAST_CLUSTERID: case SAMPLEAPP_PERIODIC_CLUSTERID: if(pkt->groupId != 0){ HalUARTWrite(0, "Rx:group-", 9); } else if(pkt->wasBroadcast){ HalUARTWrite(0, "Rx:broadcast-", 13); } else { HalUARTWrite(0, "Rx:p2p-", 7); } HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength); HalUARTWrite(0, "\n", 1); break; case SAMPLEAPP_FLASH_CLUSTERID: flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] ); HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) ); break; } } void SampleApp_SendPeriodicMessage( void ) { uint8 data[] = "d24c04846-d24c04850"; uint8 dataLen = 25; AF_DataRequest( &SampleApp_MY_DstAddr, &SampleApp_epDesc, SAMPLEAPP_UNICAST_CLUSTERID, dataLen, data, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); } void SampleApp_SendFlashMessage( uint16 flashTime ) { }这个代码怎么解释,详细解释一下
12-17
在划线处完成SampleApp工程应用层初始化函数代码的注释(用中文简述各段代码)。 void SampleApp_Init( uint8 task_id ) { SampleApp_TaskID = task_id; SampleApp_NwkState = DEV_INIT; SampleApp_TransID = 0; // #if defined ( BUILD_ALL_DEVICES ) // The "Demo" target is setup to have BUILD_ALL_DEVICES and HOLD_AUTO_START // We are looking at a jumper (defined in SampleAppHw.c) to be jumpered // together - if they are - we will start up a coordinator. Otherwise, the device will start as a router. if ( readCoordinatorJumper() ) zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR; else zgDeviceLogicalType = ZG_DEVICETYPE_ROUTER; #endif // BUILD_ALL_DEVICES // #if defined ( HOLD_AUTO_START ) // HOLD_AUTO_START is a compile option that will surpress ZDApp // from starting the device and wait for the application to start the device. ZDOInitDevice(0); #endif // SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast; SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF; // SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup; SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP; // SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_epDesc.task_id = &SampleApp_TaskID; SampleApp_epDesc.simpleDesc=(SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc; SampleApp_epDesc.latencyReq = noLatencyReqs; // Register the endpoint description with the AF afRegister( &SampleApp_epDesc ); // Register for all key events - This app will handle all key events RegisterForKeys( SampleApp_TaskID ); // By default, all devices start out in Group 1 SampleApp_Group.ID = 0x0001; osal_memcpy( SampleApp_Group.name, "Group 1", 7 ); aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group ); }
06-05
#include "ZComDef.h" #include "OSAL.h" #include "AF.h" #include "ZDApp.h" #include "ZDObject.h" #include "ZDProfile.h" #include "hal_led.h" #include "hal_key.h" #define SAMPLEAPP_ENDPOINT 20 #define SAMPLEAPP_PERIODIC_CLUSTERID 1 #define SAMPLEAPP_FLASH_CLUSTERID 2 #define SAMPLEAPP_SEND_PERIODIC_MSG_EVT 0x0001 #define SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT 5000 uint8 SampleApp_TaskID; uint8 SampleApp_TransID = 0; afAddrType_t SampleApp_Periodic_DstAddr; afAddrType_t SampleApp_Flash_DstAddr; endPointDesc_t SampleApp_epDesc; uint8 LedState = 0; uint8 DATA_PIN = 0; devStates_t SampleApp_NwkState = DEV_INIT; void SampleApp_Init(uint8 task_id) { SampleApp_TaskID = task_id; SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_epDesc.task_id = &SampleApp_TaskID; SampleApp_epDesc.simpleDesc = NULL; SampleApp_epDesc.latencyReq = noLatencyReqs; afRegister(&SampleApp_epDesc); SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)Addr16Bit; SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_Periodic_DstAddr.addr.shortAddr = 0x0000; SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)AddrGroup; SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_Flash_DstAddr.addr.shortAddr = 0x0001; RegisterForKeys(task_id); HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF); } uint16 SampleApp_ProcessEvent(uint8 task_id, uint16 events) { afIncomingMSGPacket_t *MSGpkt; (void)task_id; // Intentionally unreferenced parameter if (events & SYS_EVENT_MSG) { MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(SampleApp_TaskID); while (MSGpkt) { switch (MSGpkt->hdr.event) { // Received when a key is pressed case KEY_CHANGE: SampleApp_HandleKeys(((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys); break; // Received when a messages is received (OTA) for this endpoint case AF_INCOMING_MSG_CMD: SampleApp_MessageMSGCB(MSGpkt); break; // Received whenever the device changes state in the network case ZDO_STATE_CHANGE: SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status); if ((SampleApp_NwkState == DEV_ZB_COORD) || (SampleApp_NwkState == DEV_ROUTER) || (SampleApp_NwkState == DEV_END_DEVICE)) { // Start sending the periodic message in a regular interval. //osal_start_timerEx(SampleApp_TaskID, // SAMPLEAPP_SEND_PERIODIC_MSG_EVT, // SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT); } else { // Device is no longer in the network } break; default: break; } // Release the memory osal_msg_deallocate((uint8 *)MSGpkt); // Next - if one is available MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(SampleApp_TaskID); } // return unprocessed events return (events ^ SYS_EVENT_MSG); } // Send a message out - This event is generated by a timer // (setup in SampleApp_Init()). if (events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT) { // Send the periodic message SampleApp_SendPeriodicMessage(); // Setup to send message again in normal period (+ a little jitter) osal_start_timerEx(SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF))); // return unprocessed events return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT); } // Discard unknown events return 0; } void SampleApp_HandleKeys(uint8 shift, uint8 keys) { (void)shift; if (keys & HAL_KEY_SW_1) { HalLedSet(HAL_LED_1, HAL_LED_MODE_ON); LedState = 1; } else if (LedState == 1) { HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF); LedState = 0; } if (keys & HAL_KEY_SW_6) { #if defined(ZDO_COORDINATOR) SampleApp_SendPeriodicMessage(); #else #endif } } void SampleApp_MessageMSGCB(afIncomingMSGPacket_t *pkt) { uint8 data; switch (pkt->clusterId) { case SAMPLEAPP_PERIODIC_CLUSTERID: data = (uint8)pkt->cmd.Data[0]; if(data == 0) { DATA_PIN = 0; HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF); } else { DATA_PIN = 1; HalLedSet(HAL_LED_1, HAL_LED_MODE_ON); } break; case SAMPLEAPP_FLASH_CLUSTERID: break; } } void SampleApp_SendPeriodicMessage(void) { LedState = ~LedState; if (AF_DataRequest(&SampleApp_Periodic_DstAddr, &SampleApp_epDesc, SAMPLEAPP_PERIODIC_CLUSTERID, 1, &LedState, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS) == afStatus_SUCCESS) { if(LedState == 0) HalLedSet(HAL_LED_1, HAL_LED_MODE_ON); else HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF); } else { // Error occurred in request to send. } } void SampleApp_SendFlashMessage(uint16 flashTime) { uint8 buffer[3]; buffer[0] = (uint8)(SampleAppFlashCounter++); buffer[1] = LO_UINT16(flashTime); buffer[2] = HI_UINT16(flashTime); if (AF_DataRequest(&SampleApp_Flash_DstAddr, &SampleApp_epDesc, SAMPLEAPP_FLASH_CLUSTERID, 3, buffer, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS) == afStatus_SUCCESS) { } else { // Error occurred in request to send. } }
最新发布
12-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值