Zstack 0.0.1 .. Zstack 1.5.1a
mesh:之前版本的升級版 HA: 專門給智能家庭 SE: 智能能源 .. 在應用部分作了規定!
復制ZStack協議棧整個文件夾到一個合適的位置,比如E盤根目錄,盡量不含中文以及路徑不要太長!
在復制好的協議棧文件夾中刪除多余的文件夾及文件!其中包括: (1)Documents (2)Tools (3)Getting Started Guide - CC2530 (4)msvcr71.dll 將上述四個文件(夾)刪除
刪除ZStack-CC2530-2.3.0-1.4.0/PRojects/zstack/Samples多余的文件夾 (1)SampleApp (2)SimpleApp
修改工程相關的名字 (1)將文件夾名GenericAPP改為SimonApp (2)將ZStack-CC2530-2.3.0-1.4.0/Projects/zstack/Samples/SimonApp/Source目錄下的三個源文件名分別改為(原文件名的GenericApp全部改為SimonApp): SimonApp.c SimonApp.h OSAL_SimonApp.c
將上述源代碼里的GenericAPP改為SimonApp。利用具體編輯器的全部替換功能!
將ZStack-CC2530-2.3.0-1.4.0/Projects/zstack/Samples/SimonApp/CC2530DB目錄下的工程文件名GenericAPP修改為SimonApp: SimonApp.ewd SimonApp.ewp SimonApp.eww
將上述三個工程文件里的GenericAPP改為SimonApp。利用具體編輯器的全部替換功能!
利用IAR打開eww文件,即可打開自定義的工程!
重點關心APP文件夾以及ZMain文件夾!!!配置文件里有如下語句: -DZDO_COORDINATOR // Coordinator Functions 相當于#define ZDO_COORDINATOR 因為我們選項選擇不同,就會導致參與編譯的配置文件不同,配置不同就會導致部分宏定義不同,宏定義不同就會導致工程里某些宏的值不同,這些宏值不同就會影響程序執行的流程,就會導致出現不同的功能,所以有了不同功能的代碼版本 協調器 路由器終端
2.在選項卡里每一種版本模塊都貌似有2個分為不帶-Pro和帶Pro 他們的區別是什么?
Zigbee協議在發展過程中經歷了3個版本,其中Zigbee在07出的是最新的規范,這個規范有2個版本,ZIgbee2007 ZigbeePRO ,他們之間的區別是,功能基本相同,PRO版本功能稍微強大,咱們一般都選PRO
將LED以及按鍵等模塊文件添加到工程!要在osal_start_system之前重新初始化相關硬件模塊!!記得在各C文件中添加頭文件!
注意: (1)取消掉工程里面的編譯選項下的require protype! (2)每一次配置/重新分配設備角色以后都需要重新取消掉上述選項
添加數碼管頭文件:
#ifndef __74LS164_8LED_H__#define __74LS164_8LED_H__#include<ioCC2530.h>#define LS164_DATA P1_3#define LS164_CLK P1_2#define UCHAR unsigned char void LS164_Cfg(void);void LS164_BYTE(UCHAR Data);//P1.3 DATA P1.2 CLK#endif實現文件:
#include<ioCC2530.h>#include"74LS164_8LED.h"static UCHAR LED_Map[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x00,/ 0x39,/*'C'協調器*// 0x77,/*'R'路由器*// 0x79/*'E'終端*/};void LS164_Cfg(void){ P1SEL &=~0x0C;//xxxx 00xx 配置為普通IO模式 P1DIR |=0x0C;//xxxx 11xx 配置為輸出模式}void LS164_BYTE(UCHAR Index) //P1.3 DATA P1.2 CLK{ UCHAR i=0; UCHAR Data=LED_Map[Index]; for(;i<8;i++) { if(0x80 & Data) { LS164_DATA=1; } else { LS164_DATA=0; } Data=Data << 1; LS164_CLK=0; LS164_CLK=1; }}添加按鍵頭文件:
#ifndef SD_KEY_H#define SD_KEY_Hvoid KeysIntCfg();#endif實現文件:
#include<iocc2530.h>#include "SimonApp.h"#include "OSAL_Timers.h"#include "SD_Key.h"extern unsigned char SimonApp_TaskID;void delay(){ int i,j; for(i=0;i<1000;i++) for(j=0;j<30;j++);}void KeysIntCfg(){//Key3 Key4 Key5 P1SEL &=~0X02; P1DIR &=~0X02; IEN2|=0x10;//開P1IE組中斷 P1IEN|=0x02;//開Key3組內中斷 PICTL|=0x02;//設置P1_1為下降沿 P2SEL &=~0X01; P2DIR &=~0X01; IEN2|=0x02; P2IEN|=0x01; PICTL|=0x08;//設置P2_0為下降沿 P0SEL &=~0X20; P0DIR &=~0X20; P0IE=1;//或者寫成 IEN1|=0x20 P0IEN|=0x20; PICTL|=0x01;//設置P0_5為下降沿 EA=1; //開總中斷}#pragma vector=P1INT_VECTOR__interrupt void Key3_ISR() //P1_1{ if(P1IFG & 0X02) { osal_start_timerEx(SimonApp_TaskID,SimonApp_MY_EVT,25); } P1IFG =0; P1IF=0;}#pragma vector=P2INT_VECTOR__interrupt void Key4_ISR()//P2_0{ if(P2IFG & 0X01) { osal_start_timerEx(SimonApp_TaskID,SimonApp_MY_EVT,25); } P2IFG =0; P2IF=0;}#pragma vector=P0INT_VECTOR__interrupt void Key5_ISR()//P0_5{ if(P0IFG & 0X20) { osal_start_timerEx(SimonApp_TaskID,SimonApp_MY_EVT,25); } P0IFG =0; P0IF=0;}在應用層中自定義一個事件類型處理按鍵事件(在SimonApp_ProcessEvent函數進行事件類型的判斷和調用相應的處理函數):
if ( events & SimonApp_MY_EVT ) { if(0==P1_1) {//按鈕3按下 LS164_BYTE(3); } if(0==P2_0) {//按鈕4按下 LS164_BYTE(4); } if(0==P0_5) {//按鈕5按下 LS164_BYTE(5); } return (events ^ SimonApp_MY_EVT); }關于按鍵中斷,還需要將ZStack自帶的初始化按鍵中斷的代碼屏蔽,否則有兩個中斷入口函數會沖突,無法正常使用按鍵功能!!!屏蔽hal_key.c里面的HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )函數以及HAL_ISR_FUNCTION( halKeyPort2Isr, P2INT_VECTOR )函數。
在配置文件f8wConfig.cfg中有如下內容:
/* Default channel is Channel 11 - 0x0B */// Channels are defined in the following:// 0 : 868 MHz 0x00000001// 1 - 10 : 915 MHz 0x000007FE// 11 - 26 : 2.4 GHz 0x07FFF800////-DMAX_CHANNELS_868MHZ 0x00000001//-DMAX_CHANNELS_915MHZ 0x000007FE//-DMAX_CHANNELS_24GHZ 0x07FFF800//-DDEFAULT_CHANLIST=0x04000000 // 26 - 0x1A//-DDEFAULT_CHANLIST=0x02000000 // 25 - 0x19//-DDEFAULT_CHANLIST=0x01000000 // 24 - 0x18//-DDEFAULT_CHANLIST=0x00800000 // 23 - 0x17//-DDEFAULT_CHANLIST=0x00400000 // 22 - 0x16//-DDEFAULT_CHANLIST=0x00200000 // 21 - 0x15//-DDEFAULT_CHANLIST=0x00100000 // 20 - 0x14//-DDEFAULT_CHANLIST=0x00080000 // 19 - 0x13//-DDEFAULT_CHANLIST=0x00040000 // 18 - 0x12//-DDEFAULT_CHANLIST=0x00020000 // 17 - 0x11//-DDEFAULT_CHANLIST=0x00010000 // 16 - 0x10//-DDEFAULT_CHANLIST=0x00008000 // 15 - 0x0F//-DDEFAULT_CHANLIST=0x00004000 // 14 - 0x0E//-DDEFAULT_CHANLIST=0x00002000 // 13 - 0x0D//-DDEFAULT_CHANLIST=0x00001000 // 12 - 0x0C-DDEFAULT_CHANLIST=0x00000800 // 11 - 0x0B相當于: #define DEFAULT_CHANLIST 0x00000800
DEFAULT_CHANLIST 表明Zigbee模塊要工作的網絡,當有多個信道參數值進行或操作之后,把結果作為 DEFAULT_CHANLIST 值,那么對于路由器和終端 協調器的意義分別是什么
路由器和終端: 我可以在參與或操作的這些信道上選擇一個相對于我來說最佳的網絡,加入進去 協調器 我可以在參與或操作的這些信道上選擇一個最佳的信道并在這個信道上創建自己的Zigbee網絡
非0xFFFF 路由器和終端 我必須要加入到PANID為參數值這樣一個Zigbee無線局域網
協調器來說,我要創建一個網絡,并且把這個參數值作為這個網絡的PANED
為0xFFFF 路由器和終端 在加入網絡的時候沒有PANID的限制 協調器 我可以隨機生成一個值,把這個隨機值作為這個網絡的PANED
當2個模塊下載相同的協調器代碼,并且指定的PANID參數值為非0xffff,后果會怎樣? 先上電的模塊可以創建0xFFF8這樣一個Zigbee網絡,后上電的模塊創建一個在0xFFF8基礎上加1的網絡。
NOROOT表示如果此部分代碼從來沒有被調用到,那么這部分代碼會被linker拋棄。一般來講,除了startup和中斷的代碼都應該設為NOROOT。默認的模式為ROOT,即linker不會拋棄。
(1)在ZSTACK里按照代碼按照功能來劃分,分成不同的層,比如,硬件操作相關硬件層 網絡相關的代碼叫網絡層 自己寫應用程序部分叫應用層
(2)幾乎每一個層都是一個任務,系統為每一個任務分配一個字節的唯一數值編號(任務ID)
(3)每一個任務都能處理一些他們能夠處理的事務
(4)我們把這個數值編號叫做任務ID
(5)它們能夠處理的事務叫做事件
(6)該函數就是通知任務ID為task_id的任務處理event_flag事件
uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value )(1)在ZSTACK里,任務/事件定義的特點決定了,每一個任務最多只能處理16種不同的事件 (2)而系統在運行時候有許多事務需要處理,如果每一個事務處理都定義成1個事件,那么16種事件肯定是不夠用,所有引入消息。 (3)只定時一次,定時溢出以后不再定時,需要重新啟動定時器!與timerUpdate函數有關(軟件定時器鏈表)
通過消息處理事務的原理:(1)OSAL定義了一個系統默認的事件 #define SYS_EVENT_MSG 0x8000 // A message is waiting event
(2)可以自定義一個事件
(3)當需要應用層任務來處理某個事務的時候,首先給應用層任務發送一個消息–調用osal_set_event(SimonApp_TaskID,SYS_EVENT_MSG);
(4)那么這樣一來,應用層就會進入SYS_EVENT_MSG處理,在這個事件處理里判斷到底剛剛引發我們產生SYS_EVENT_MSG事件是哪一種類型的消息,然后根據消息的類型做相應的處理。
(5)而消息的類型可以自己定義,這樣一來消息的類可以很多,那么應用層任務處理的事物種類就很多了。一般消息的類型放在消息體MSGpkt->hdr.event成員里!所以根據hdr.event判斷消息類型!!
if(SDApp_NwkState == DEV_ZB_COORD) {//如果本模塊成為了協調器,會進入到這來來 LS164_BYTE(11); keyChange_t *msgPtr; msgPtr = (keyChange_t *)osal_msg_allocate( sizeof(keyChange_t) );//定義個按鈕改變的消息 if ( msgPtr ) { msgPtr->hdr.event = KEY_CHANGE;//給這個消息填寫相關的值,類型是按鈕狀態改變KEY_CHANGE msgPtr->keys=3;//消息里面的內容是3 osal_msg_send( SDApp_TaskID, (uint8 *)msgPtr );//把發送給應用層SDApp_TaskID的消息投到消息隊列,并且osal_set_event( SDApp_TaskID, SYS_EVENT_MSG ); } // osal_set_event(SDApp_TaskID,SDApp_SEND_MSG_EVT); osal_start_timerEx(SDApp_TaskID,SDApp_MY_EVT,3000); }

在f8w2530.xcl里面,取消掉// Include these two lines when generating a .hex file for banked code model:下面的注釋,最后如下內容:
新聞熱點
疑難解答