ZStack协议按键处理流程分析

上传人:m**** 文档编号:556677673 上传时间:2022-11-14 格式:DOCX 页数:13 大小:48.37KB
返回 下载 相关 举报
ZStack协议按键处理流程分析_第1页
第1页 / 共13页
ZStack协议按键处理流程分析_第2页
第2页 / 共13页
ZStack协议按键处理流程分析_第3页
第3页 / 共13页
ZStack协议按键处理流程分析_第4页
第4页 / 共13页
ZStack协议按键处理流程分析_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《ZStack协议按键处理流程分析》由会员分享,可在线阅读,更多相关《ZStack协议按键处理流程分析(13页珍藏版)》请在金锄头文库上搜索。

1、在分析之前我先说一下ZStack协议栈有很多版本,版本不一样,代码多少有一些不一样,我的ZStack是ZStack-CC2530-2.3.1-1.4.0另外我的这篇文章中有很多内容是参考网友的文章,不知道有没有侵犯版权。我自己总结一下按键处理流程,在ZStack协议栈中,按键的处理有两种方式,一种是中断方式,另一种是轮询方式,在这里,我以中断的方式来处理按键。我的按键接在P0_1,如图所示:R10IOKS1T)D3V31P01BTN1从图中可以看出,当按键没有按下的时候P0_1引脚为高电平,当按键按下时,引脚变成低电平,在这里,我的按键的中断触发方式为下降沿有效。为了让按键按下后,程序能做点事

2、情,我以LED灯为例,也就是说,当按键按下后,我让LED的状态翻转,也就是说按键按下一次,LED灯亮,在按下一次,LED灯灭,在按一下一次,LED灯亮,。下图是LED的引脚图:R7IKDTD3V31纵观总的ZStack协议栈,我们发现P0_1和P1_0接的正好是按键和LED灯,因此在协议栈中,关于的按键和LED灯的代码我们不需要修改的太多。我从main函数开始一步一步的分析,为了减小篇幅和代码量,我只分析与按键和中断有关的代码。Intmain()/Turnofinterrupts关闭中断osal_int_disable(INTS_ALL);/就是设置EA为0,EA为各种中断的总开关/Initi

3、alizationforboardrelatedstuffsuchasLEDs/初始化系统时钟,LED等HAL_BOARD_INIT();这个里面我没有动/电压检测,最好是能保证芯片能正常工作的电压/Makesuresupplyvoltageishighenoughtorunzmain_vdd_check();/InitializeboardI/O初始化板载IOInitBoard(OB_COLD);/InitialzeHALdrivers初始化HAL驱动HalDriverInit();/InitializeNVSystem初始化NV系统osal_nv_init(NULL);/Initializ

4、etheMAC初始化MACZMacInit();/Determinetheextendedaddres确定IEEE地址zmain_ext_addr();#ifdefinedZCL_KEY_ESTABLISH/InitializetheCerticomcertificateinformation.zmain_cert_init();#endif/InitializebasicNVitems/初始化基本NV条目zgInit();#ifndefNONWK/SincetheAFisntatask,callitsinitializationroutineafInit();#endif/Initializ

5、etheoperatingsystem/初始化操作系统osal_init_system();/Allowinterrupts使能所有中断,就是让EA为1osal_int_enable(INTS_ALL);/Finalboardinitialization最后的板载初始化InitBoard(OB_READY);/Displayinformationaboutthisdevicezmain_dev_info();/*DisplaythedeviceinfoontheLCD*/#ifdefLCD_SUPPORTEDzmain_lcd_init();#endif#ifdefWDT_IN_PM1/*If

6、WDTisused,thisisagoodplacetoenableit.*/WatchDogEnable(WDTIMX);#endifosal_start_system();/NoReturnfromherereturn0;/Sh在这里只分析红色部分的代码:/InitializeboardI/O初始化板载IOInitBoard(OB_COLD);我们进入到到这个函数voidInitBoard(uint8level)if(level=OB_COLD)/IARdoesnotzero-outthisbytebelowtheXSTACK.*(uint8*)0x0=0;/Interruptsoffos

7、al_int_disable(INTS_ALL);/CheckforBrown-OutresetChkReset();else/!OB_COLD/*InitializeKeystuff*/这个函数的作用是对按键使用的IO进行初始以及设置按键工作方式,按键IO初始化主要是将按键所对应的IO口定义为输入口/如果这个函数的第一个参数是HAL_KEY_INTERRUPT_ENABLE,那么按下该按键会触发IO终端,因此这个函数还要对IO终端/进行初始化的配置;如果这个函数的第一个参数是HAL_KEY_INTERRUPT_DISABLE,那么主程序后周期性的执行按键扫描程序/查看按键状态HalKeyCo

8、nfig(HAL_KEY_INTERRUPT_ENABLE,OnBoard_KeyCallback);/在TI的源码中,第一个参数是HAL_KEY_INTERRUPT_DISABLE进入这个函数的时候,if条件成立,在这个if语句中没有做什么实际的事情,我们不管它,else语句不成立,我暂且先部分分析,在下面还会被调用,在下面我们在分析这个else语句。/InitialzeHALdrivers初始化HAL驱动HalDriverInit();进入这个函数中,我们发现有很多初初始化,例如,TIMER,ADC,DMA等等,我们只分析LED和KEY部分的代码,先分析KEY部分的代码,进入到函数中。vo

9、idHalKeyInit(void)/*Initializepreviouskeyto0*/halKeySavedKeys=0;HAL_KEY_SW_6_SEL&=(HAL_KEY_SW_6_BIT);/*SetpinfunctiontoGPIO设置p0_1为通用的10口*/HAL_KEY_SW_6_DIR&=(HAL_KEY_SW_6_BIT);/*SetpindirectiontoInput设置p0_1为输入的方式*/HAL_KEY_JOY_MOVE_SELpinfunctiontoGPIO*/HAL_KEY_JOY_MOVE_DIRpindirectiontoInput*/&=(HAL_

10、KEY_JOY_MOVE_BIT);&=(HAL_KEY_JOY_MOVE_BIT);/*Set/*Set/*Initializecallbackfunction*/这个玩意是一个回调函数的指针,初始化的初始化按键的时候,初始化指针为NULLpHalKeyProcessFunction=NULL;/*Startwithkeyisnotconfigured*/HalKeyConfigured=FALSE;在这里我说一下,TI他们自己板子上,有很多按键,其中有5个是用来模拟我们的游戏手柄,有UP,DOEN,RIGHT,LEFT,CENTER,上面的蓝色部分的代码就是对这个按键的设置,在这里我们没有

11、用到,我们就不管这些代码了,在这里我们约定,凡是与这5个按键有关的代码(就是JO丫.)我们就都不分析了。/*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_

12、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();Samp

13、leApp_Init(taskID);RegisterForKeys(SampleApp_TaskID);/登记所有的按键事件进入到这个函数里面看一下:uint8RegisterForKeys(uint8task_id)/Allowonlythefirsttaskif(registeredKeysTaskID=NO_TASK_ID)registeredKeysTaskID=task_id;return(true);elsereturn(false);/Finalboardinitialization最后的板载初始化InitBoard(OB_READY);进入到这个函数,我们这次分析else的语

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

15、Config(boolinterruptEnable,halKeyCBack_tcback)/*Enable/DisableInterruptor*/Hal_KeyIntEnable=interruptEnable;/*Registerthecallbackfucntion*/pHalKeyProcessFunction=cback;/让这个pHalKeyProcessFunction函数指针指向这个函数OnBoard_KeyCallback/*Determineifinterruptisenableornot*/if(Hal_KeyIntEnable)/中断方式处理按键/*Rising/Fallingedgeconfiguratinn*/PICTL&=(HAL_KEY_SW_6_EDGEBIT);/*Cleartheedgebit*/*Forfallingedge,thebitmustbeset.*/#if(HAL_KEY_SW_6_EDGE=HAL_KEY_FALLING_EDGE)PICTL|=HAL_KEY_SW_6_EDGEBIT;PO(PO口有8个弓I脚)口上所有的引脚配置终端成下降沿触发#endif/*Interruptconfiguration:-Enableint

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号