一、设备网络类型展示
利用开发板上的三个LED灯来显示设备当前的网络类型(协调器、路由器、终端)。
1、添加LED灯的初始化代码
1)开发板LED原理图
2)在模板工程的...Projects\zstack\Samples\smartHomeApp\Source目录下新建两个文件zfm.h和zfm.c,然后在IAR中打开模板工程,在APP目录下添加自己的头文件和源文件(zfm.h和zfm.c),并编译相应的代码。
2 、在APP目录下smartHomeApp.c文件中修改相应代码
1)在APP目录下smartHomeApp.c文件中,添加#include "zfm.h"
2)找到smartHomeApp_ProcessEvent函数,在对应位置修改代码,如下图
3、在ZMain目录下ZMain.c添加LED初始化代码
1)找到函数入口main函数,在对应位置修改代码,如下图
4 、选择不同的设备类型编译,然后下载代码
1) 通过编译选项,选择不同的设备类型编译,然后下载代码即可。
2)现象如下
PS:编译如果有报错,可参考:zigbee笔记:十、ZStack(2.3.0-1.4.0)的OSAL使用分析-CSDN博客
二、按键实验
利用开发板上的按键和LED灯,通过外部中断来触发OSAL系统的应用任务(task)的一个自定义事件(event),在这个事件中完成对LED灯亮灭控制。
1、首先定义一个在应用任务中自己的事件
在APP目录下smartHomeApp.h文件中,定义一个在应用任务中自己的事件,如下图
2、添加LED灯和按键的初始化代码
1)开发板LED和按键原理图
2)在模板工程的...Projects\zstack\Samples\smartHomeApp\Source目录下新建一个文件interrupt.c,然后在IAR中打开模板工程,在APP目录下添加该源文件(interrupt.c),并编写相应的代码,如下图和代码。
#include <iocc2530.h>
#include"zfm.h"
#include"smartHomeApp.h"
extern unsigned char smartHomeApp_TaskID;
extern uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value );
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR( void )
{
if( P0IFG & 0x02 ) //按键中断
{
//触发应用任务的smartHomeApp_ZFM_EVT事件
osal_start_timerEx( smartHomeApp_TaskID, smartHomeApp_ZFM_EVT, 250 );
}
P0IFG = 0; //清除中断标志
P0IF = 0; //清除中断标志
}
// 初始化Btn1 P0_1
void InitBtn1()
{
P0SEL &= ~0x02; // 普通外设模式
P0DIR &= ~0x02; // 设为输入
P2INP &= ~0x20; // P0组为上下拉
P0INP &= ~0x02; // P0_2为上拉
}
//始化Btn1的中断
void InitBtn1Interrupt()
{
PICTL |= 0X01; //下降沿触发
EA = 1; //开启总中断
P0IE = 1; //开启组中断
P0IEN |= 0x02; //开启位中断
P0IFG |= 0x00; //初始化中断标志位
}
// Btn1扫描函数,检测按下返回1,否则返回0
3 、在APP目录下smartHomeApp.c文件中修改相应代码
1)在 zfm.h文件中声明interrupt.c中的函数
2)在APP目录下smartHomeApp.c文件中,添加#include "zfm.h"
3)找到smartHomeApp_ProcessEvent函数,在对应位置添加自定义的应用任务事件处理内容,如下图
4、在ZMain目录下ZMain.c添加LED初始化代码
1)找到函数入口main函数,在对应位置修改代码,如下图
5、编译下载
现象,按下按键1,LED2亮灭翻转