Z-Stack将按键改到任何I/O的方法
来源:互联网 发布:莱斯硬盘怎么样 知乎 编辑:程序博客网 时间:2024/04/20 22:14
有的人自己做板子,做好后才发现自己做的板子按键的IO口和TI的不一样,这个提供大家一个修改ZSTACK让我既的按键发挥作用的方法
zstack2.50的SW6用P0_1,Joy stick用P2_0,我的按键用的是P1_7,所以做一下修改。
hal_key.c:复制代码hal_board_cfg.h:复制代码改动为复制代码顺便跟踪一下中断按键的流程:
按键按下->
产生IO口中断->
进入中断处理函数halKeyPort1Isr->
判断中断位标志,如果置位进入halProcessKeyInterrupt再判断一次->
调用osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE);发送HAL_KEY_EVENT事件到硬件处理任务,HAL_KEY_DEBOUNCE_VALUE是去抖动的延时,默认25ms->
在Hal_ProcessEvent函数中处理HAL_KEY_EVENT事件,进入HalKeyPoll函数,这里换成用io口电平再判断一次,确认按键按下调用回调函数,这个函数是用HalKeyConfig(HAL_KEY_INTERRUPT_ENABLE, OnBoard_KeyCallback)注册的->
进入回调函数OnBoard_KeyCallback,这里看到一句shift = (keys & HAL_KEY_SW_6) ? true : false;这里可以看出SW6相当于我们电脑键盘上档键的功能,最后调用OnBoard_SendKeys函数将按键事件发送到应用层也就是上面的GenericApp_HandleKeys函数
zstack2.50的SW6用P0_1,Joy stick用P2_0,我的按键用的是P1_7,所以做一下修改。
hal_key.c:
- /*增加按键IO所在的IO口中断标志*/
- #define HAL_KEY_CPU_PORT_1_IF P1IF
- /* 修改SW6的所在IO口配置 */
- #define HAL_KEY_SW_6_PORT P1//P0
- #define HAL_KEY_SW_6_BIT BV(7)//BV(1)
- #define HAL_KEY_SW_6_SEL P1SEL//P0SEL
- #define HAL_KEY_SW_6_DIR P1DIR//P0DIR
- /* 边缘触发方式 */
- #define HAL_KEY_SW_6_EDGEBIT BV(2)//BV(0)
- #define HAL_KEY_SW_6_EDGE HAL_KEY_FALLING_EDGE
- /* 与中断相关的一些标志位 */
- #define HAL_KEY_SW_6_IEN IEN2//IEN1 /* CPU interrupt mask register */
- #define HAL_KEY_SW_6_IENBIT BV(4)//BV(5) /* Mask bit for all of Port_0 */
- #define HAL_KEY_SW_6_ICTL P1IEN//P0IEN /* Port Interrupt Control register */
- #define HAL_KEY_SW_6_ICTLBIT BV(7)//BV(1) /* P0IEN - P0.1 enable/disable bit */
- #define HAL_KEY_SW_6_PXIFG P1IFG//P0IFG /* Interrupt flag at source */
- /*如果用的是不同的PORT,比如P0转到P1还要增加一个中断函数*/
- HAL_ISR_FUNCTION( halKeyPort1Isr, P1INT_VECTOR )
- {
- HAL_ENTER_ISR();
- if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT)
- {
- halProcessKeyInterrupt();
- }
- /*
- Clear the CPU interrupt flag for Port_0
- PxIFG has to be cleared before PxIF
- */
- HAL_KEY_SW_6_PXIFG = 0;
- HAL_KEY_CPU_PORT_1_IF = 0;
- CLEAR_SLEEP_MODE();
- HAL_EXIT_ISR();
- }
- /* S1 这里看到S1就是SW6*/
- #define PUSH1_BV BV(7)//BV(1)
- #define PUSH1_SBIT P1_7//P0_1
- /*如果是低电平触发修改*/
- #if defined (HAL_BOARD_CC2530EB_REV17)
- #define PUSH1_POLARITY ACTIVE_LOW
- GenericApp.c:
- GenericApp_HandleKeys函数:
- HAL_KEY_SW_6也就是BUTTON1,是"shift"功能,所以
- if ( shift )
- {
- if ( keys & HAL_KEY_SW_1 )
- {
- }
- if ( keys & HAL_KEY_SW_2 )
- {
- }
- if ( keys & HAL_KEY_SW_3 )
- {
- }
- if ( keys & HAL_KEY_SW_4 )
- {
- }
- }
- if ( shift )
- {
- if ( keys & HAL_KEY_SW_1 )
- {
- }
- if ( keys & HAL_KEY_SW_2 )
- {
- }
- if ( keys & HAL_KEY_SW_3 )
- {
- }
- if ( keys & HAL_KEY_SW_4 )
- {
- }
- if ( keys & HAL_KEY_SW_6 )
- {
- //这里添加按键功能代码
- }
- }
按键按下->
产生IO口中断->
进入中断处理函数halKeyPort1Isr->
判断中断位标志,如果置位进入halProcessKeyInterrupt再判断一次->
调用osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE);发送HAL_KEY_EVENT事件到硬件处理任务,HAL_KEY_DEBOUNCE_VALUE是去抖动的延时,默认25ms->
在Hal_ProcessEvent函数中处理HAL_KEY_EVENT事件,进入HalKeyPoll函数,这里换成用io口电平再判断一次,确认按键按下调用回调函数,这个函数是用HalKeyConfig(HAL_KEY_INTERRUPT_ENABLE, OnBoard_KeyCallback)注册的->
进入回调函数OnBoard_KeyCallback,这里看到一句shift = (keys & HAL_KEY_SW_6) ? true : false;这里可以看出SW6相当于我们电脑键盘上档键的功能,最后调用OnBoard_SendKeys函数将按键事件发送到应用层也就是上面的GenericApp_HandleKeys函数
- Z-Stack将按键改到任何I/O的方法
- pop到任何控制器的方法
- Z-stack中对按键的处理
- Z-STACK中按键KEY驱动的处理
- zigbee z-stack实现按键的长按
- 微软云存储SkyDrive API:将你的数据连接到任何应用、任何平台,及任何设备上
- I/O STACK LOCATION
- Z-Stack 配置按键为中断模式
- 插入的分区关键字未映射到任何分区
- linux i/o stack diagram
- Linux I/O Stack 结构图
- 基础IRP 和I/O Stack location 的关系
- (十)(1) Z-Stack中OSAL按键事件的触发流程分析
- Z-Stack/ble OSAL 中OSAL按键事件的触发流程分析
- ZigBee CC2530 Z-Stack 24 基于系统时钟的多功能按键1-实现
- ZigBee CC2530 Z-Stack 25 基于系统时钟的多功能按键2-指示灯
- Z-stack 串口的使用
- 修改Z-Stack的PAN_ID
- 精辟到毒死人的句子,你看或不看,句子就在这里不痛不痒!
- C语言编程优化运行速度
- volatile的作用与用法(不允许编译器优化)
- Z-STACK1.4.3协议栈之osal_start_timerEx()的作用
- 互动电视点播错误与解决集合
- Z-Stack将按键改到任何I/O的方法
- Android SystemClock 应用
- z-stack协议栈-数据包接收处理流程
- Z-Stack中OSAL定时器事件触发流程分析
- ZigBee地址模式分析
- Zigbee协议栈OSAL层API函数
- IAR编译ZStack-CC2530,生成HEX文件完全配置
- zigbee单播、组播、广播
- ZIGBEE学习之SPI总线方式点亮LCD屏幕