z-stack中对按键的处理

上传人:简****9 文档编号:116401297 上传时间:2019-11-16 格式:DOC 页数:3 大小:93.50KB
返回 下载 相关 举报
z-stack中对按键的处理_第1页
第1页 / 共3页
z-stack中对按键的处理_第2页
第2页 / 共3页
z-stack中对按键的处理_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《z-stack中对按键的处理》由会员分享,可在线阅读,更多相关《z-stack中对按键的处理(3页珍藏版)》请在金锄头文库上搜索。

1、z-stack中对按键的处理在基于Z-stack的应用程序设计中,HAL(硬件抽象层)是这样运行的:void osalInitTasks( void ) Hal_Init( taskID+ );打开 Hal_Init( ),似乎什么也没有做,只是完成了一件事情,给这个任务一个ID,实际上,对硬件的初始化的工作,在任务启动之前都已经开始做了,任务的运行,只是可以接收发给它的事件和消息。那么,在HAL任务运行之前,系统对任务做了些什么呢?当然是初始化。在ZMain.c文件中,有main函数,这是所有程序的入口。由于硬件是所有程序运行的基础,在这里要完成两个重要的函数: / Initialize b

2、oard I/O InitBoard( OB_COLD ); / Initialze HAL drivers HalDriverInit(); 显然,它们的执行时间是早于任务的运行,在InitBoard()完成对板级I/O的设置。进去看一下:void InitBoard( byte level ) if ( level = OB_COLD ) / Interrupts off osal_int_disable( INTS_ALL ); else / !OB_COLD OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE; HalKeyConfig( O

3、nboardKeyIntEnable, OnBoard_KeyCallback); 代码太多,不再全部列出,主要是完成对Led。Timer和key的配置。这里重点看按键有关的。由于InitBoard函数的参数是OB_COLD,郁闷的HalKeyConfig()没有机会运行。 在经过耐心的等待之后,main()需要再次对开发板初始化,调用函数: InitBoard( OB_READY ); 机会来了,这时可以处理按键了,HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback)函数可以运行,在该函数中定义了是以中断的方式还是以查询的方式检测按键

4、的状态,如果是查询方式,使用:osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE); 延迟100ms后向任务Hal_TaskID发送一个事件。在事件处理代码中使用函数HalKeyPoll()查询是否有按键按下。 如果是中断方式,使用osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE); 延迟25ms后使用函数HalKeyPoll()获取按键值。 http:/ 8051 7.30B运行安装程序EW8051-EV-730B.e

5、xe,这里说一下如何快速的查找代码,按下Ctrl+Shift+f 可以在整个项目中查找你想要的关键字,注意选择和你workspace工作空间对应的文件,通常有CC2430DB和CC2430EB两个。把光标放在函数名上,右键选择Go to definition fo XX就可以跳到该函数定义处,工具栏的Navigate Backward 和Navigate Forward 可以让你来回穿梭,还有很多功能,这里不多说了。安装ZigBee2006下载Zigbee协议栈压缩包swrc073d.zip,安装后一般在C盘可以找到Texas Instruments文件夹,把它复制,考到D盘,我的IAR装在D

6、盘,有必要看下Documents里面的文档,如Create New Application For The CC2430DB_F8W-2005-0033_.pdf如何新建项目;其它的就不多说了,下面是按键的简单说明,可以初步了解一下OSAL;例子目录为:Texas InstrumentsZStack-1.4.3-1.2.1ProjectszstackSamplesSimpleAppCC2430DBWorkspace 选择 simplecollectorEB ;我们先从主函数说起,如果不知主函数在哪,可以Ctrl+Shift+f输入int main查找,.为省略ZSEG int main( vo

7、id )/ Turn off interruptsosal_int_disable( INTS_ALL );./ Initialze HAL driversHalDriverInit(); /HalKeyInit();初始化按键./ Determine the extended addresszmain_ext_addr(); /HalKeyRead();读取按键.osal_init_system(); /RegisterForKeys( sapi_TaskID ); 注册按键任务./ Final board initializationInitBoard( OB_READY ); /*Hal

8、KeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);配置按键,默认为轮询方式*/osal_start_system(); / No Return from here 进入系统大循环 / main()从主函数可以看出,里面都是初始化函数init,执行过程HalDriverInit()HalKeyInit();在HalKeyInit()里基本完成了相应管脚的输入输出配置,然后到zmain_ext_addr();时,判断物理扩展地址是否合法,如果不合法,则LED1一直闪烁,等while ( HAL_KEY_SW_5 != HalKeyRead()

9、 )按下把无效的地址初始化为有效地物理地址,然后到osal_init_system();osalInitTasks();SAPI_Init( taskID );RegisterForKeys( sapi_TaskID );注册按键事件,最后InitBoard( OB_READY );HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);配置按键为中断方式还是轮询方式,从/* Initialize Key stuff */OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;HalKeyConfi

10、g( OnboardKeyIntEnable, OnBoard_KeyCallback);可以看出默认是配置为轮询方式的,这就是主函数大致对按键的处理过程,接下来从HalKeyConfig()入手,void HalKeyConfig (bool interruptEnable, halKeyCBack_t cback)#if (HAL_KEY = TRUE)/* Enable/Disable Interrupt or */Hal_KeyIntEnable = interruptEnable;/* Register the callback fucntion */pHalKeyProcessFu

11、nction = cback; /指向回调函数/* Determine if interrupt is enable or not */if (Hal_KeyIntEnable) /如果设为中断方式.进行一些中断的相关配置else /* Interrupts NOT enabled */ /否则为轮询方式.osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE); /* Kick off polling */.可以看出,配置为轮询方式是时启动osal_start_timerEx()函数,那么这个函数是干什么的呢?

12、这个是系统软定时器,在HAL_KEY_POLLING_VALUE时间(100ms)内会触发系统任务事件,也就是触发uint16 Hal_ProcessEvent( uint8 task_id, uint16 events );触发时会把Hal_TaskID、HAL_KEY_EVENT两个参数传给Hal_ProcessEvent();然后看看Hal_ProcessEvent()里面又做了些什么事,uint16 Hal_ProcessEvent( uint8 task_id, uint16 events )uint8 *msgPtr;.if (events & HAL_KEY_EVENT) /按键

13、处理#if (defined HAL_KEY) & (HAL_KEY = TRUE)/* Check for keys */HalKeyPoll(); /查看是哪个键/* if interrupt disabled, do next polling */if (!Hal_KeyIntEnable) /如果还是轮询方式,则再次启动osal_start_timerEx();osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100);#endif / HAL_KEYreturn events HAL_KEY_EVENT;.函数里面执行完HalKeyPoll

14、();后,如果还是轮询方式,则再一次启动osal_start_timerEx();如此一来,就会每隔100ms循环进入Hal_ProcessEvent()函数读取按键,也就是说系统每隔100ms扫描一次按键,那么HalKeyPoll()又是干什么的呢?我们继续看看,void HalKeyPoll (void)#if defined (HAL_KEY_SW_6_ENABLE)if (!(HAL_KEY_SW_6_PORT & HAL_KEY_SW_6_BIT) /* Key is active low */keys |= HAL_KEY_SW_6;#endif#if defined (HAL_K

15、EY_SW_5_ENABLE)if (HAL_KEY_SW_5_PORT & HAL_KEY_SW_5_BIT) /* Key is active high */keys |= HAL_KEY_SW_5;#endif. 调用HalAdcRead()得出操纵杆的值,是通过AD进来了模拟电压值得出;/* Invoke Callback if new keys were depressed */if (keys & (pHalKeyProcessFunction)(pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL); /回调函数该函数读出按键值keys,并执行了回调函数(pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL); pHalKeyProcessFunction是在void HalKeyConfig (bool interruptEnable, halKeyCBack_t cback)里面pHalKeyProcessFunction = cback;进行赋函数指针的,这样我们就进入回调函数了,我们来看一下回调函数:void OnBoard_KeyCall

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

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