ZStack协议按键处理流程分析.docx

上传人:b****5 文档编号:2870724 上传时间:2022-11-16 格式:DOCX 页数:24 大小:122.45KB
下载 相关 举报
ZStack协议按键处理流程分析.docx_第1页
第1页 / 共24页
ZStack协议按键处理流程分析.docx_第2页
第2页 / 共24页
ZStack协议按键处理流程分析.docx_第3页
第3页 / 共24页
ZStack协议按键处理流程分析.docx_第4页
第4页 / 共24页
ZStack协议按键处理流程分析.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

ZStack协议按键处理流程分析.docx

《ZStack协议按键处理流程分析.docx》由会员分享,可在线阅读,更多相关《ZStack协议按键处理流程分析.docx(24页珍藏版)》请在冰豆网上搜索。

ZStack协议按键处理流程分析.docx

ZStack协议按键处理流程分析

在分析之前我先说一下ZStack协议栈有很多版本,版本不一样,代码多少有一些不一样,我的ZStack是ZStack-CC2530-2.3.1-1.4.0。

另外我的这篇文章中有很多内容是参考网友的文章,不知道有没有侵犯版权。

 

我自己总结一下按键处理流程,在ZStack协议栈中,按键的处理有两种方式,一种是中断方式,另一种是轮询方式,在这里,我以中断的方式来处理按键。

我的按键接在P0_1,如图所示:

从图中可以看出,当按键没有按下的时候P0_1引脚为高电平,当按键按下时,引脚变成低电平,在这里,我的按键的中断触发方式为下降沿有效。

为了让按键按下后,程序能做点事情,我以LED灯为例,也就是说,当按键按下后,我让LED的状态翻转,也就是说按键按下一次,LED灯亮,在按下一次,LED灯灭,在按一下一次,LED灯亮……。

下图是LED的引脚图:

 

纵观总的ZStack协议栈,我们发现P0_1和P1_0接的正好是按键和LED灯,因此在协议栈中,关于的按键和LED灯的代码我们不需要修改的太多。

我从main函数开始一步一步的分析,为了减小篇幅和代码量,我只分析与按键和中断有关的代码。

Intmain()

{

//Turnoffinterrupts关闭中断

osal_int_disable(INTS_ALL);//就是设置EA为0,EA为各种中断的总开关

//InitializationforboardrelatedstuffsuchasLEDs

//初始化系统时钟,LED等

HAL_BOARD_INIT();//这个里面我没有动

//电压检测,最好是能保证芯片能正常工作的电压

//Makesuresupplyvoltageishighenoughtorun

zmain_vdd_check();

//InitializeboardI/O初始化板载IO

InitBoard(OB_COLD);

//InitialzeHALdrivers初始化HAL驱动

HalDriverInit();

//InitializeNVSystem初始化NV系统

osal_nv_init(NULL);

//InitializetheMAC初始化MAC

ZMacInit();

//Determinetheextendedaddress确定IEEE地址

zmain_ext_addr();

#ifdefinedZCL_KEY_ESTABLISH

//InitializetheCerticomcertificateinformation.

zmain_cert_init();

#endif

//InitializebasicNVitems//初始化基本NV条目

zgInit();

#ifndefNONWK

//SincetheAFisn'tatask,callit'sinitializationroutine

afInit();

#endif

//Initializetheoperatingsystem//初始化操作系统

osal_init_system();

//Allowinterrupts使能所有中断,就是让EA为1

osal_int_enable(INTS_ALL);

//Finalboardinitialization最后的板载初始化

InitBoard(OB_READY);

//Displayinformationaboutthisdevice

zmain_dev_info();

/*DisplaythedeviceinfoontheLCD*/

#ifdefLCD_SUPPORTED

zmain_lcd_init();

#endif

#ifdefWDT_IN_PM1

/*IfWDTisused,thisisagoodplacetoenableit.*/

WatchDogEnable(WDTIMX);

#endif

osal_start_system();//NoReturnfromhere

return0;//Sh

}

在这里只分析红色部分的代码:

//InitializeboardI/O初始化板载IO

InitBoard(OB_COLD);我们进入到到这个函数

voidInitBoard(uint8level)

{

if(level==OB_COLD)

{

//IARdoesnotzero-outthisbytebelowtheXSTACK.

*(uint8*)0x0=0;

//Interruptsoff

osal_int_disable(INTS_ALL);

//CheckforBrown-Outreset

ChkReset();

}

else//!

OB_COLD

{

/*InitializeKeystuff*/

//这个函数的作用是对按键使用的IO进行初始以及设置按键工作方式,按键IO初始化主要是将按键所对应的IO口定义为输入口

//如果这个函数的第一个参数是HAL_KEY_INTERRUPT_ENABLE,那么按下该按键会触发IO终端,因此这个函数还要对IO终端

//进行初始化的配置;如果这个函数的第一个参数是HAL_KEY_INTERRUPT_DISABLE,那么主程序后周期性的执行按键扫描程序

//查看按键状态

HalKeyConfig(HAL_KEY_INTERRUPT_ENABLE,OnBoard_KeyCallback);//在TI的源码中,第一个参数是HAL_KEY_INTERRUPT_DISABLE

}

}

进入这个函数的时候,if条件成立,在这个if语句中没有做什么实际的事情,我们不管它,else语句不成立,我暂且先部分分析,在下面还会被调用,在下面我们在分析这个else语句。

//InitialzeHALdrivers初始化HAL驱动

HalDriverInit();进入这个函数中,我们发现有很多初初始化,例如,TIMER,ADC,DMA等等,我们只分析LED和KEY部分的代码,先分析KEY部分的代码,进入到函数中。

voidHalKeyInit(void)

{

/*Initializepreviouskeyto0*/

halKeySavedKeys=0;

HAL_KEY_SW_6_SEL&=~(HAL_KEY_SW_6_BIT);/*SetpinfunctiontoGPIO设置p0_1为通用的IO口*/

HAL_KEY_SW_6_DIR&=~(HAL_KEY_SW_6_BIT);/*SetpindirectiontoInput设置p0_1为输入的方式*/

HAL_KEY_JOY_MOVE_SEL&=~(HAL_KEY_JOY_MOVE_BIT);/*SetpinfunctiontoGPIO*/

HAL_KEY_JOY_MOVE_DIR&=~(HAL_KEY_JOY_MOVE_BIT);/*SetpindirectiontoInput*/

 

/*Initializecallbackfunction*/

//这个玩意是一个回调函数的指针,初始化的初始化按键的时候,初始化指针为NULL

pHalKeyProcessFunction=NULL;

/*Startwithkeyisnotconfigured*/

HalKeyConfigured=FALSE;

}

在这里我说一下,TI他们自己板子上,有很多按键,其中有5个是用来模拟我们的游戏手柄,有UP,DOEN,RIGHT,LEFT,CENTER,上面的蓝色部分的代码就是对这个按键的设置,在这里我们没有用到,我们就不管这些代码了,在这里我们约定,凡是与这5个按键有关的代码(就是….JOY….)我们就都不分析了。

/*LED在TI设计的板子上p1.0,p1.1,p1.4这三个引脚上接了三个不同颜色的LED灯,在初始化的时候全部设置成立灭的状态*/

voidHalLedInit(void)

{

#if(HAL_LED==TRUE)

/*InitializeallLEDstoOFF*/

//即在初始化工作中关闭所有的LED灯,这个函数其实就是LED的驱动函数,右面

//应用层调用的也是此函数

HalLedSet(HAL_LED_ALL,HAL_LED_MODE_OFF);

#endif/*HAL_LED*/

#ifdefBLINK_LEDS

/*InitializesleepActivetoFALSE*/

HalLedStatusControl.sleepActive=FALSE;

#endif

}

//Initializetheoperatingsystem//初始化操作系统

osal_init_system();osalInitTasks();Hal_Init(taskID++);

Hal_Init(taskID++);这个函数中只有一句话

voidHal_Init(uint8task_id)

{

/*RegistertaskID*/

Hal_TaskID=task_id;

}

osal_init_system();osalInitTasks();SampleApp_Init(taskID);RegisterForKeys(SampleApp_TaskID);//登记所有的按键事件进入到这个函数里面看一下:

uint8RegisterForKeys(uint8task_id)

{

//Allowonlythefirsttask

if(registeredKeysTaskID==NO_TASK_ID)

{

registeredKeysTaskID=task_id;

return(true);

}

else

return(false);

}

 

//Finalboardinitialization最后的板载初始化

InitBoard(OB_READY);

进入到这个函数,我们这次分析else的语句,在else部分调用这个函数

HalKeyConfig(HAL_KEY_INTERRUPT_ENABLE,OnBoard_KeyCallback);

这个函数的分析在上面已经分析过了,这里在做一下补充,因为我们对按键的处理是中断方式的,因此第一个参数一定得是HAL_KEY_INTERRUPT_ENABLE,第二个参数一个函数的名字,它在这里表示的是函数的地址,我们知道函数的名字就是函数的地址,这个函数我们管它叫回调函数,这里的意思就是注册回调函数,将这个函数的地址作为参数传递到HalKeyConfig这个函数中,我们进入到这个函数中,这个函数的代码还是蛮多的,我还是贴出来吧。

voidHalKeyConfig(boolinterruptEnable,halKeyCBack_tcback)

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1