欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

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

    • 资源ID:2870724       资源大小:122.45KB        全文页数:24页
    • 资源格式: DOCX        下载积分:12金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

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

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

    3、on for board related stuff such as LEDs /初始化系统时钟,LED等 HAL_BOARD_INIT();/这个里面我没有动 /电压检测,最好是能保证芯片能正常工作的电压 / Make sure supply voltage is high enough to run zmain_vdd_check();/ Initialize board I/O初始化板载IO InitBoard( OB_COLD ); / Initialze HAL drivers初始化HAL驱动 HalDriverInit(); / Initialize NV System初始化NV系

    4、统 osal_nv_init( NULL ); / Initialize the MAC初始化MAC ZMacInit(); / Determine the extended address确定IEEE地址 zmain_ext_addr();#if defined ZCL_KEY_ESTABLISH / Initialize the Certicom certificate information. zmain_cert_init();#endif / Initialize basic NV items/初始化基本NV条目 zgInit();#ifndef NONWK / Since the

    5、AF isnt a task, call its initialization routine afInit();#endif / Initialize the operating system/初始化操作系统 osal_init_system(); / Allow interrupts使能所有中断,就是让EA为1 osal_int_enable( INTS_ALL ); / Final board initialization最后的板载初始化 InitBoard( OB_READY ); / Display information about this device zmain_dev_in

    6、fo(); /* Display the device info on the LCD */#ifdef LCD_SUPPORTED zmain_lcd_init();#endif#ifdef WDT_IN_PM1 /* If WDT is used, this is a good place to enable it. */ WatchDogEnable( WDTIMX );#endif osal_start_system(); / No Return from here return 0; / Sh在这里只分析红色部分的代码: / Initialize board I/O初始化板载IO I

    7、nitBoard( OB_COLD );我们进入到到这个函数void InitBoard( uint8 level ) if ( level = OB_COLD ) / IAR does not zero-out this byte below the XSTACK. *(uint8 *)0x0 = 0; / Interrupts off osal_int_disable( INTS_ALL ); / Check for Brown-Out reset ChkReset(); else / !OB_COLD /* Initialize Key stuff */ /这个函数的作用是对按键使用的I

    8、O进行初始以及设置按键工作方式,按键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

    9、条件成立,在这个if语句中没有做什么实际的事情,我们不管它,else语句不成立,我暂且先部分分析,在下面还会被调用,在下面我们在分析这个else语句。/ Initialze HAL drivers初始化HAL驱动 HalDriverInit();进入这个函数中,我们发现有很多初初始化,例如,TIMER,ADC,DMA等等,我们只分析LED和KEY部分的代码,先分析KEY部分的代码,进入到函数中。void HalKeyInit( void ) /* Initialize previous key to 0 */ halKeySavedKeys = 0; HAL_KEY_SW_6_SEL &= (

    10、HAL_KEY_SW_6_BIT); /* Set pin function to GPIO 设置p0_1为通用的IO口*/ HAL_KEY_SW_6_DIR &= (HAL_KEY_SW_6_BIT); /* Set pin direction to Input设置p0_1为输入的方式 */ HAL_KEY_JOY_MOVE_SEL &= (HAL_KEY_JOY_MOVE_BIT); /* Set pin function to GPIO */ HAL_KEY_JOY_MOVE_DIR &= (HAL_KEY_JOY_MOVE_BIT); /* Set pin direction to I

    11、nput */ /* Initialize callback function */ /这个玩意是一个回调函数的指针,初始化的初始化按键的时候,初始化指针为NULL pHalKeyProcessFunction = NULL; /* Start with key is not configured */ HalKeyConfigured = FALSE;在这里我说一下,TI他们自己板子上,有很多按键,其中有5个是用来模拟我们的游戏手柄,有UP,DOEN,RIGHT,LEFT,CENTER,上面的蓝色部分的代码就是对这个按键的设置,在这里我们没有用到,我们就不管这些代码了,在这里我们约定,凡是与

    12、这5个按键有关的代码(就是.JOY.)我们就都不分析了。/* LED 在TI设计的板子上p1.0,p1.1,p1.4这三个引脚上接了三个不同颜色的LED灯,在初始化的时候全部设置成立灭的状态*/void HalLedInit (void)#if (HAL_LED = TRUE) /* Initialize all LEDs to OFF */ /即在初始化工作中关闭所有的LED灯,这个函数其实就是LED的驱动函数,右面 /应用层调用的也是此函数 HalLedSet (HAL_LED_ALL, HAL_LED_MODE_OFF);#endif /* HAL_LED */#ifdef BLINK_

    13、LEDS /* Initialize sleepActive to FALSE */ HalLedStatusControl.sleepActive = FALSE;#endif/ Initialize the operating system/初始化操作系统 osal_init_system(); osalInitTasks(); Hal_Init( taskID+ );Hal_Init( taskID+ );这个函数中只有一句话void Hal_Init( uint8 task_id ) /* Register task ID */ Hal_TaskID = task_id;osal_in

    14、it_system(); osalInitTasks(); SampleApp_Init( taskID ); RegisterForKeys( SampleApp_TaskID );/登记所有的按键事件 进入到这个函数里面看一下:uint8 RegisterForKeys( uint8 task_id ) / Allow only the first task if ( registeredKeysTaskID = NO_TASK_ID ) registeredKeysTaskID = task_id; return ( true ); else return ( false );/ Fin

    15、al board initialization最后的板载初始化 InitBoard( OB_READY );进入到这个函数,我们这次分析else的语句,在else部分调用这个函数HalKeyConfig(HAL_KEY_INTERRUPT_ENABLE, OnBoard_KeyCallback);这个函数的分析在上面已经分析过了,这里在做一下补充,因为我们对按键的处理是中断方式的,因此第一个参数一定得是HAL_KEY_INTERRUPT_ENABLE,第二个参数一个函数的名字,它在这里表示的是函数的地址,我们知道函数的名字就是函数的地址,这个函数我们管它叫回调函数,这里的意思就是注册回调函数,将这个函数的地址作为参数传递到HalKeyConfig这个函数中,我们进入到这个函数中,这个函数的代码还是蛮多的,我还是贴出来吧。void HalKeyConfig (bool interruptEnable, halKeyCBack_t cback)


    注意事项

    本文(ZStack协议按键处理流程分析.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

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

    收起
    展开