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:
  1. /*增加按键IO所在的IO口中断标志*/
  2. #define HAL_KEY_CPU_PORT_1_IF P1IF

  3. /* 修改SW6的所在IO口配置 */
  4. #define HAL_KEY_SW_6_PORT   P1//P0
  5. #define HAL_KEY_SW_6_BIT    BV(7)//BV(1)
  6. #define HAL_KEY_SW_6_SEL    P1SEL//P0SEL
  7. #define HAL_KEY_SW_6_DIR    P1DIR//P0DIR

  8. /* 边缘触发方式 */
  9. #define HAL_KEY_SW_6_EDGEBIT  BV(2)//BV(0)
  10. #define HAL_KEY_SW_6_EDGE     HAL_KEY_FALLING_EDGE


  11. /* 与中断相关的一些标志位 */
  12. #define HAL_KEY_SW_6_IEN      IEN2//IEN1  /* CPU interrupt mask register */
  13. #define HAL_KEY_SW_6_IENBIT   BV(4)//BV(5) /* Mask bit for all of Port_0 */
  14. #define HAL_KEY_SW_6_ICTL     P1IEN//P0IEN /* Port Interrupt Control register */
  15. #define HAL_KEY_SW_6_ICTLBIT  BV(7)//BV(1) /* P0IEN - P0.1 enable/disable bit */
  16. #define HAL_KEY_SW_6_PXIFG    P1IFG//P0IFG /* Interrupt flag at source */


  17. /*如果用的是不同的PORT,比如P0转到P1还要增加一个中断函数*/
  18. HAL_ISR_FUNCTION( halKeyPort1Isr, P1INT_VECTOR )
  19. {
  20.         HAL_ENTER_ISR();

  21.         if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT)
  22.         {
  23.                 halProcessKeyInterrupt();
  24.         }

  25.         /*
  26.            Clear the CPU interrupt flag for Port_0
  27.            PxIFG has to be cleared before PxIF
  28.          */
  29.         HAL_KEY_SW_6_PXIFG = 0;
  30.         HAL_KEY_CPU_PORT_1_IF = 0;

  31.         CLEAR_SLEEP_MODE();
  32.         HAL_EXIT_ISR();
  33. }
复制代码
hal_board_cfg.h:
  1. /* S1 这里看到S1就是SW6*/
  2. #define PUSH1_BV          BV(7)//BV(1)
  3. #define PUSH1_SBIT        P1_7//P0_1

  4. /*如果是低电平触发修改*/

  5. #if defined (HAL_BOARD_CC2530EB_REV17)
  6. #define PUSH1_POLARITY    ACTIVE_LOW

  7. GenericApp.c:

  8. GenericApp_HandleKeys函数:
  9.         HAL_KEY_SW_6也就是BUTTON1,是"shift"功能,所以
  10. if ( shift )
  11. {
  12.         if ( keys & HAL_KEY_SW_1 )
  13.         {
  14.         }
  15.         if ( keys & HAL_KEY_SW_2 )
  16.         {
  17.         }
  18.         if ( keys & HAL_KEY_SW_3 )
  19.         {
  20.         }
  21.         if ( keys & HAL_KEY_SW_4 )
  22.         {
  23.         }
  24. }
复制代码
改动为
  1. if ( shift )
  2. {
  3.         if ( keys & HAL_KEY_SW_1 )
  4.         {
  5.         }
  6.         if ( keys & HAL_KEY_SW_2 )
  7.         {
  8.         }
  9.         if ( keys & HAL_KEY_SW_3 )
  10.         {
  11.         }
  12.         if ( keys & HAL_KEY_SW_4 )
  13.         {
  14.         }
  15.         if ( keys & HAL_KEY_SW_6 )
  16.         {
  17.                 //这里添加按键功能代码
  18.         }
  19. }
复制代码
顺便跟踪一下中断按键的流程:
按键按下->
产生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函数
原创粉丝点击