打印
[资料分享]

CC2640之按键

[复制链接]
880|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
drer|  楼主 | 2019-7-10 10:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
drer|  楼主 | 2019-7-10 10:16 | 只看该作者
基础知识

1、协议栈的按键驱动是否能直接拿来使用?

答:可以,但是不好用。不好用在于按键反应过慢、无按键消抖、按键按下及松开会执行两次按键操作。需要如下文中做些驱动修改。



2、按键代码的执行流程是如何的?

答:

1)应用层simpleBLEperipheral.c中调用按键初始化函数Board_initKeys,并传入应用层的按键处理函数入口。

2)当硬件检测到按键时,会上报键值至board_key.c中的Board_keyCallback按键回调函数。并开启一个定时器来消抖。

3)消抖时间到,则执行board_key.c中的Board_keyChangeHandler函数。并将键值传给应用的按键处理函数(初始化时注册时传入的函数)。

使用特权

评论回复
板凳
drer|  楼主 | 2019-7-10 10:17 | 只看该作者
硬件原理图




由上面的两张图可知:

1、按键按下为低电平。

2、

B_BTN_SELECT——DIO_11

B_BTN_LEFT——DIO_15

B_BTN_RIGHT——DIO_18

B_BTN_UP——DIO_19

B_BTN_DOWN——DIO_12

注:SFM16是拨码开关。


使用特权

评论回复
地板
drer|  楼主 | 2019-7-10 10:17 | 只看该作者

实验步骤

1、工程中添加协议栈的按键驱动(驱动路径在“……\ble_cc26xx_2_01_00_44423\Projects\ble\common\cc26xx”)


使用特权

评论回复
5
drer|  楼主 | 2019-7-10 10:18 | 只看该作者
2、修改按键驱动与驱动头文件

1)修改按键的边沿触发方式(board_key.c中的Board_initKeys函数中)

//  PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_SELECT  | PIN_IRQ_NEGEDGE);
//  PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_UP      | PIN_IRQ_NEGEDGE);
//  PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_DOWN    | PIN_IRQ_NEGEDGE);
//  PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_LEFT    | PIN_IRQ_NEGEDGE);
//  PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_RIGHT   | PIN_IRQ_NEGEDGE);

  //修改成双沿中断触发,以避免睡眠之后中断不灵  
  PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_SELECT  | PIN_IRQ_BOTHEDGES);
  PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_UP      | PIN_IRQ_BOTHEDGES);
  PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_DOWN    | PIN_IRQ_BOTHEDGES);
  PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_LEFT    | PIN_IRQ_BOTHEDGES);
  PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_RIGHT   | PIN_IRQ_BOTHEDGES);


此处为**建议修改的,香瓜未验证,且先修改。

使用特权

评论回复
6
drer|  楼主 | 2019-7-10 10:18 | 只看该作者
2)修改消抖后的按键函数(board_key.c中的Board_keyChangeHandler函数)

static void Board_keyChangeHandler(UArg a0)
{
  keysPressed = 0;
  
  //判断是否有注册
  if (appKeyChangeHandler != NULL)
  {
    //消抖
    if ( PIN_getInputValue(Board_KEY_SELECT) == 0 )
    {
      keysPressed |= KEY_SELECT;
    }

    if ( PIN_getInputValue(Board_KEY_UP) == 0 )
    {
      keysPressed |= KEY_UP;
    }

    if ( PIN_getInputValue(Board_KEY_DOWN) == 0 )
    {
      keysPressed |= KEY_DOWN;
    }

    if ( PIN_getInputValue(Board_KEY_LEFT) == 0 )
    {
      keysPressed |= KEY_LEFT;
    }

    if ( PIN_getInputValue(Board_KEY_RIGHT) == 0 )
    {
      keysPressed |= KEY_RIGHT;
    }   
   
    //调用按键应用层处理函数
    (*appKeyChangeHandler)(keysPressed);
  }
}


协议栈默认没有再判断一次按键电平,达不到消抖的作用。因此做上述修改,增加消抖部分的代码。

使用特权

评论回复
7
drer|  楼主 | 2019-7-10 10:18 | 只看该作者
3)修改消抖时长(board_key.h中)

// Debounce timeout in milliseconds
#define KEY_DEBOUNCE_TIMEOUT  20//200

按键消抖一般是20ms,协议栈默认用的200ms会有明显延时。

使用特权

评论回复
8
drer|  楼主 | 2019-7-10 10:18 | 只看该作者
3、应用层调用(simpleBLEperipheral.c中)

1)确保添加了头文件

#include "board_key.h"
该工程默认是添加的,检查一下即可。

使用特权

评论回复
9
drer|  楼主 | 2019-7-10 10:19 | 只看该作者
2)写一个应用层的按键处理函数

static void GUA_HandleKeys(uint8 keys)  
{  
  //SELECT键
  if ( keys & KEY_SELECT )
  {   
    GUA_Led_Set(HAL_LED_1, HAL_LED_MODE_TOGGLE);        //LED1反转一次
  }  
   
  //UP键
  if ( keys & KEY_UP )
  {   
    GUA_Led_Set(HAL_LED_1, HAL_LED_MODE_TOGGLE);        //LED1反转一次
  }   
  
  //DOWN键
  if ( keys & KEY_DOWN )
  {   
    GUA_Led_Set(HAL_LED_1, HAL_LED_MODE_TOGGLE);        //LED1反转一次
  }  
   
  //LEFT键
  if ( keys & KEY_LEFT )
  {   
    GUA_Led_Set(HAL_LED_1, HAL_LED_MODE_TOGGLE);        //LED1反转一次
  }  

  //RIGHT键
  if ( keys & KEY_RIGHT )
  {   
    GUA_Led_Set(HAL_LED_1, HAL_LED_MODE_TOGGLE);        //LED1反转一次
  }  
}

使用特权

评论回复
10
drer|  楼主 | 2019-7-10 10:19 | 只看该作者
3)写一个应用层的按键处理函数的声明
//GUA
static void GUA_HandleKeys(uint8 keys);

使用特权

评论回复
11
drer|  楼主 | 2019-7-10 10:19 | 只看该作者
4)初始化按键(SimpleBLEPeripheral_init函数中)
  //初始化按键
  Board_initKeys(GUA_HandleKeys);

使用特权

评论回复
12
drer|  楼主 | 2019-7-10 10:19 | 只看该作者
实验结果

仿真、设置断点,可以发现按键按下、松开都会进入GUA_HandleKeys函数,但按键按下时有固定键值、而松开时键值是0,因此不会造成按键按下、松开执行两次处理代码。

实测为分别按5个按键,都能将LED1的电平取反一次。

因此,实验成功。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

3316

帖子

4

粉丝