pdf

Z-stack按键机制

  • 1星
  • 日期: 2018-06-05
  • 大小: 457.78KB
  • 所需积分:1分
  • 下载次数:0
  • favicon收藏
  • rep举报
  • 分享
  • free评论
标签: zigbee

Z-stack按键机制

文档内容节选

本文是自己学习zigbee时的知识梳理 参考书:ZigBee技术与实训教程基于CC2530的无线传感网技术姜仲刘丹 编著 Zstack中提供了两种方式采集按键数据:轮询方式和中断方式轮询方式:每隔一定时间,检测 按键状态,进行相应处理中断方式:按键引起按键中断,进行相应处理Zstack在默认情况 下,使用轮询方式进行处理 一按键的宏定义 在HALincludehalkeyh中对按键进行了基本的定义: 复制代码  中断使能和禁用  define HALKEYINTERRUPTDISABLE    0x00 define HALKEYINTERRUPTENABLE     0x01  Key state  shift or nornal  define HALKEYSTATENORMAL          0x00 define HALKEYSTATESHIFT           0x01  摇杆和按键定义  define HALKEYSW1 0x01   Joystick up define HALKEYSW2 0x02   Joystick right define HALKEYSW......

本文是自己学习zigbee时的知识梳理。 参考书:《ZigBee技术与实训教程­­基于CC2530的无线传感网技术》­­­­姜仲、刘丹 编著 Z­stack中提供了两种方式采集按键数据:轮询方式和中断方式。轮询方式:每隔一定时间,检测 按键状态,进行相应处理;中断方式:按键引起按键中断,进行相应处理。Zstack在默认情况 下,使用轮询方式进行处理。 一、按键的宏定义 在HAL/include/hal_key.h中对按键进行了基本的定义: 复制代码 /* 中断使能和禁用*/  #define HAL_KEY_INTERRUPT_DISABLE    0x00 #define HAL_KEY_INTERRUPT_ENABLE     0x01 /* Key state ­ shift or nornal */ #define HAL_KEY_STATE_NORMAL          0x00 #define HAL_KEY_STATE_SHIFT           0x01 /* 摇杆和按键定义*/  #define HAL_KEY_SW_1 0x01  // Joystick up #define HAL_KEY_SW_2 0x02  // Joystick right #define HAL_KEY_SW_5 0x04  // Joystick center #define HAL_KEY_SW_4 0x08  // Joystick left #define HAL_KEY_SW_3 0x10  // Joystick down #define HAL_KEY_SW_6 0x20  // Button S1 if available #define HAL_KEY_SW_7 0x40  // Button S2 if available /* 摇杆定义*/  #define HAL_KEY_UP     0x01  // Joystick up #define HAL_KEY_RIGHT  0x02  // Joystick right #define HAL_KEY_CENTER 0x04  // Joystick center #define HAL_KEY_LEFT   0x08  // Joystick left #define HAL_KEY_DOWN   0x10  // Joystick down 复制代码 在HAL/Target/hal_key.c中,对按键进行了具体的配置: 复制代码 #define HAL_KEY_RISING_EDGE   0 #define HAL_KEY_FALLING_EDGE  1 #define HAL_KEY_DEBOUNCE_VALUE  25 /* 配置按键和摇杆的中断状态寄存器*/  #define HAL_KEY_CPU_PORT_0_IF P0IF #define HAL_KEY_CPU_PORT_2_IF P2IF /* SW_6 位P0.1进行配置*/  #define HAL_KEY_SW_6_PORT   P0 #define HAL_KEY_SW_6_BIT    BV(1)  //由于SW_6在P0_1,所以定义为BV(1),BV(N)即为1向 左移动N位  #define HAL_KEY_SW_6_SEL    P0SEL #define HAL_KEY_SW_6_DIR    P0DIR /* 中断触发方式配置*/  #define HAL_KEY_SW_6_EDGEBIT  BV(0) #define HAL_KEY_SW_6_EDGE     HAL_KEY_FALLING_EDGE /* SW_6 interrupts */ #define HAL_KEY_SW_6_IEN      IEN1  /* SW_6端口中断使能寄存器 */  #define HAL_KEY_SW_6_IENBIT   BV(5) /* Mask bit for all of Port_0 */ #define HAL_KEY_SW_6_ICTL     P0IEN /* SW_6位中断使能*/  #define HAL_KEY_SW_6_ICTLBIT  BV(1) /* P0IEN ­ P0.1 enable/disable bit */ #define HAL_KEY_SW_6_PXIFG    P0IFG /*SW_6位中断标志寄存器*/  /*摇杆P2.0寄存器配置*/  #define HAL_KEY_JOY_MOVE_PORT   P2 #define HAL_KEY_JOY_MOVE_BIT    BV(0) #define HAL_KEY_JOY_MOVE_SEL    P2SEL #define HAL_KEY_JOY_MOVE_DIR    P2DIR /* 中断触发方式*/  #define HAL_KEY_JOY_MOVE_EDGEBIT  BV(3) #define HAL_KEY_JOY_MOVE_EDGE     HAL_KEY_FALLING_EDGE /* 摇杆中断寄存器*/  #define HAL_KEY_JOY_MOVE_IEN      IEN2  /* CPU interrupt mask register */ #define HAL_KEY_JOY_MOVE_IENBIT   BV(1) /* Mask bit for all of Port_2 */ #define HAL_KEY_JOY_MOVE_ICTL     P2IEN /* Port Interrupt Control register */ #define HAL_KEY_JOY_MOVE_ICTLBIT  BV(0) /* P2IENL ­ P2.0<­>P2.3 enable/disable  bit */ #define HAL_KEY_JOY_MOVE_PXIFG    P2IFG /* Interrupt flag at source */ 复制代码 二、按键代码的初始化 按键的初始化属于硬件的初始化,硬件的初始化通过在主函数main()中调用HalDriverInit()来集 中处理。在HAL/Common /hal_drivers中 的HalDriverInit() 函数代码如下: 复制代码 void HalDriverInit (void) {   /* TIMER */ #if (defined HAL_TIMER) && (HAL_TIMER == TRUE)   #error "The hal timer driver module is removed." #endif   /* ADC */ #if (defined HAL_ADC) && (HAL_ADC == TRUE)   HalAdcInit(); #endif   /* DMA */ #if (defined HAL_DMA) && (HAL_DMA == TRUE)   // Must be called before the init call to any module that uses DMA.   HalDmaInit(); #endif   /* AES */ #if (defined HAL_AES) && (HAL_AES == TRUE)   HalAesInit(); #endif   /* LCD */ #if (defined HAL_LCD) && (HAL_LCD == TRUE)   HalLcdInit(); #endif   /* LED */ #if (defined HAL_LED) && (HAL_LED == TRUE)   HalLedInit(); #endif   /* UART */ #if (defined HAL_UART) && (HAL_UART == TRUE)   HalUARTInit(); #endif   /* KEY */ #if (defined HAL_KEY) && (HAL_KEY == TRUE)   HalKeyInit(); #endif   /* SPI */ #if (defined HAL_SPI) && (HAL_SPI == TRUE)   HalSpiInit(); #endif   /* HID */ #if (defined HAL_HID) && (HAL_HID == TRUE)   usbHidInit(); #endif } 复制代码 按键的初始化时在条件满足情况下才编译的。除此之外,使用摇杆时还要确保HAL_ADC为真,即 Zstack协议栈使用AD采集。在HAL/Target/CC2530EB/config目录下的hal_board_cfg.h中 有: #ifndef HAL_ADC #define HAL_ADC TRUE #endif #ifndef HAL_KEY #define HAL_KEY TRUE #endif 由以上代码可以看出,在缺省情况下,可以使用独立的按键,也可以使用模拟的摇杆。 在上面的HalDriverInit()函数中,可以看到按键的初始化是通过调用HalKeyInit()函数来实 现的。HalKeyInit()代码如下: 复制代码 void HalKeyInit( void ) {   /*初始化按键为0 */    halKeySavedKeys = 0;   HAL_KEY_SW_6_SEL &= ~(HAL_KEY_SW_6_BIT);    /* 设定引脚为普通IO*/    HAL_KEY_SW_6_DIR &= ~(HAL_KEY_SW_6_BIT);    /* 设定引脚为输入*/    HAL_KEY_JOY_MOVE_SEL &= ~(HAL_KEY_JOY_MOVE_BIT); /* 设定引脚为普通IO*/    HAL_KEY_JOY_MOVE_DIR &= ~(HAL_KEY_JOY_MOVE_BIT); /* 设定引脚为输入*/    /* 初始化按键回调函数为空*/    pHalKeyProcessFunction  = NULL;   /* 初始化后,按键标示为没有配置*/    HalKeyConfigured = FALSE; } 复制代码 在该函数中,有三个全局变量值,其中,halKeySaveKeys用来保存按键值; PHalKeyProcessFunction为指向按键处理函数的指针;HalKeyConfigured用来标示按键是否被 配置。 三、按键的配置 按键的配置函数在板载初始化函数InitBoard()中被调用,而板载初始化函数在主函数main()中被 调用。InitBoard()代码如下: 复制代码 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 */     HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE, OnBoard_KeyCallback);   } } 复制代码
更多简介内容

推荐帖子

MicroPython已入选2020年 Google Docs年度计划
MicroPython已入选2020年 Google Docs年度计划,正在接受Tech Writer的申请,工作定于八月/九月开始。 2020年 Google Docs年度计划 https://developers.google.com/season-of ... ticipants/ 2020年文档季节时间表 https://developers.google.com/season
dcexpert 【MicroPython开源版块】
MSP430FR2000IRLLT的参考设计
提供一下MSP430FR2000IRLLT的参考设计或者是芯片的EVB之类的SCH,急着用,谢谢! 官网上的资料没有具体的这部分内容,比如适用于 MSP430FR2000、MSP430FR21x 和 MSP430FR23x MCU 的目标开发板 - 20 引脚 http://www.ti.com.cn/tool/cn/MSP-TS430PW20   可以在下面的文档内查看
Aguilera 【微控制器 MCU】
CC1312R相较CC1310的优势与前景
1、CC1310简介 CC1310是一款1GHz以下经济高效型超低功耗RF器件。内部高度集成了电流消耗超低的有源RF和MCU,这种卓越的性能,即使是使用小钮扣电池供电,也可以应用在能源采集类和远距离传输中。CC1310结合了RF标准性平台和多个物理层,因此可以将强大的48MHzCortex-M3微控制器和超低功耗RF收发器灵活的结合在一起,为保证灵活度和超低功耗,采用了专用的ARM Cort
火辣西米秀 【无线连接】
32.768K晶体不起振,选型很重要!
在设计一个32位MCU作为工控机协处理的控制器项目时,外接了8M的有源晶振和32.768K的无源晶体。当时采用的是一颗国产插件的32.768K无源时钟,在整个系统运行时,发现这个时钟有些能够起振,有些不起振,在网上查了很多资料,说法各一,也尝试了很多方法,最终还是没法完全解决这个问题。根据我的设计需求并结合无源晶体的原理及设计方案,有人推荐了合适的芯片,最终解决了这个问题。 下面大概复述一下
Aguilera 【微控制器 MCU】
MSP430看门狗使用笔记&&低功耗模式下如何用看门狗监控程序跑飞
一、看门狗简介 1、看门狗可用来当定时器计时,也可用来防止程序跑死。主要对应到两种工作模式,定时器模式和看门狗模式。 2、MSP430默认看门狗模式打开,因此一般在程序初始化前,会用到指令“WDTCTL = WDTPW + WDTHOLD”关闭看门狗模式,不然程序会一直超时重启。 3、如果想启用看门狗的定时器功能或看门狗超时复位功能,则需要对看门狗进行重新设置,以下将详细介绍。
Jacktang 【微控制器 MCU】
SRAM中灵敏放大器的原理
SRAM中灵敏放大器的原理   在SRAM 中,读操作开始前,先要对两条位线进行预充电,将两条位线初始化为相同的高电平。预充完后,字线选中的存储单元对位线进行充放电。存储单元尺寸很小,驱动能力很弱,且位线负载相对较大,所以两条位线输出的是都是绝对值较高的电压(3~3.5V),其高低电平相差很小。如果直接送入输出缓冲器,将无法识别逻辑0 和1,即使能识别也需要较长的充放电时间,严重影响了SRAM
是酒窝啊 移动便携

评论

登录/注册

意见反馈

求资源

回顶部

datasheet推荐 换一换

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版 版权声明

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
$(function(){ var appid = $(".select li a").data("channel"); $(".select li a").click(function(){ var appid = $(this).data("channel"); $('.select dt').html($(this).html()); $('#channel').val(appid); }) })