【BLE-CC2640】CC2640之按键

来源:互联网 发布:mac有安卓模拟器吗 编辑:程序博客网 时间:2024/05/21 10:39

本篇博文最后修改时间:2016年09月15日,14:07。


一、简介

本文简介如何在simpleBLEperipheral工程中使用协议栈自带的按键驱动。


二、实验平台

协议栈版本:ble_cc26xx_2_01_00_44423

编译软件:IAR Embedded Workbench for ARM Version 7.40

硬件平台:CC26xxDK开发板(阿莫)

仿真器:XDS100V3(阿莫)


版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.NET/feilusia

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

四、实验前提
1、在进行本文步骤前,请先阅读以下博文:
暂无

2、在进行本文步骤前,请先实现以下博文:
1、《CC2640之LED》:http://blog.csdn.net/feilusia/article/details/52217925


五、基础知识

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

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


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

答:

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

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

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


六、硬件原理图



由上面的两张图可知:

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是拨码开关。


七、实验步骤

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



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);
此处为阿莫建议修改的,香瓜未验证,且先修改。

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);  }}
协议栈默认没有再判断一次按键电平,达不到消抖的作用。因此做上述修改,增加消抖部分的代码。

3)修改消抖时长(board_key.h中

// Debounce timeout in milliseconds#define KEY_DEBOUNCE_TIMEOUT  20//200
按键消抖一般是20ms,协议栈默认用的200ms会有明显延时。

3、应用层调用(simpleBLEperipheral.c中

1)确保添加了头文件

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


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反转一次   }  }  

3)写一个应用层的按键处理函数的声明

//GUAstatic void GUA_HandleKeys(uint8 keys);  

4)初始化按键(SimpleBLEPeripheral_init函数中
  //初始化按键  Board_initKeys(GUA_HandleKeys); 

八、注意事项

暂无


九、实验结果

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

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

因此,实验成功。






0 0
原创粉丝点击